Forum: ASP Classic |
Thema:
AW: Auslesen von CLOB aus Oracle über OraOLEDB |
Von:
G. Guest (
14.12.2006 19:41) |
Hallo,
Bei mir tritt der Fehler auch auf.
Ich war sehr überrascht über diese völlig irreführende Fehlermeldung!
Ursache ist ein Wert in einer Number-Spalte, der mehr Stellen hat, als die double-Spalte, in die reinselektiert wird, z. B. 0,333333333333333333333333333333333333333. Sowas wie "select 1.0 / 3.0 from dual" habe ich noch nicht ausprobiert - geht aber sicher auch schief.
Ich habe eine Client-Version 10.2.0.1.0, einen 10.1.0.2.0er Server und VS Studio 2005. Ich bekomme den Call-Stack:
Der Accessor ist kein Parameteraccessor.
Type : System.Data.OleDb.OleDbException
at System.Data.OleDb.OleDbDataReader.ProcessResults(OleDbHResult hr)
at System.Data.OleDb.OleDbDataReader.GetRowDataFromHandle()
at System.Data.OleDb.OleDbDataReader.GetValueBinding(MetaData info)
at System.Data.OleDb.OleDbDataReader.GetValues(Object[] values)
at System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values)
at System.Data.ProviderBase.SchemaMapping.LoadDataRow()
at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)
Vorher hatte ich einen PC mit einem Oracle 9er Client (Version weiss ich nicht mehr), wo ich bei OraOLEDB keinen Fehler bekam.
Bei anderen Providern bekomme ich den Fehler "OCI-22053: Überlauffehler", z. B. beim Microsoft Oracle Client:
System.Data.OracleClient.OracleException: OCI-22053: Überlauffehler
at System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleNumber.ToUInt32(OciErrorHandle errorHandle, Byte[] value)
at System.Data.OracleClient.OracleNumber.ToDecimal(OciErrorHandle errorHandle, Byte[] value)
at System.Data.OracleClient.OracleNumber.MarshalToDecimal(NativeBuffer buffer, Int32 valueOffset, OracleConnection connection)
at System.Data.OracleClient.OracleColumn.GetDecimal(NativeBuffer_RowBuffer buffer)
at System.Data.OracleClient.OracleColumn.GetValue(NativeBuffer_RowBuffer buffer)
at System.Data.OracleClient.OracleDataReader.GetValues(Object[] values)
at System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values)
at System.Data.ProviderBase.SchemaMapping.LoadDataRow()
at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)
Beim 9er Oracle ODP-Provider ist alles OK, der 10er liefert:
System.OverflowException: Arithmetic operation resulted in an overflow.
at Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr numCtx)
at Oracle.DataAccess.Client.OracleDataReader.GetDecimal(Int32 i)
at Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)
at Oracle.DataAccess.Client.OracleDataReader.GetValues(Object[] values)
at System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values)
at System.Data.ProviderBase.SchemaMapping.LoadDataRow()
at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at Oracle.DataAccess.Client.OracleDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at Oracle.DataAccess.Client.OracleDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)
Der in der anderen Antwort in diesem Thread angesprochene Workaround mit dem Zahlen-Runden kommt aus verschiedenen Gründen für uns nicht in Frage.
Wir verwenden mit Bauchschmerzen den uralten MSDAOR OleDB-Provider - der macht bisher den wenigsten Ärger. Zugriff auf BLOB und CLOB-Spalten machen wir mit einem Package - das geht auch mit dem MSDAOR.
Unsere Erfahrung aus vielen Jahren Programmierung mit Oracle: Die Jungs können keine Treiber schreiben!
Viele Grüße,
Volker Reimann
Betreff |
Von |
Datum |
|
|
G.
Guest
|
14.12.2006 19:48 |
|
|
Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!