ORA-01002: fetch out of sequence
Ich bin immer die folgende oracle-Fehlermeldung, wenn meine app bereitgestellt wird, auf der server nur, und nicht bei der Ausführung der exakt gleichen ausführbaren auf meiner lokalen Maschine:
Den stack-trace-Punkte für eine einfache select-Anweisung mit einer Verknüpfung, die ich erfolgreich ausführen kann über KRÖTE lokal und über SQL-Plus auf dem problem-server.
Der oberen Hälfte der stacktrace ist:
Oracle.DataAccess.Client.OracleException ORA-01002: fetch out of sequence
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src, Boolean bCheck)
at Oracle.DataAccess.Client.OracleDataReader.Read()
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(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
at Reconciliation.Models.Legacy.EntityDbEnvironment.OpenEntity(String sql)
at Reconciliation.Models.Legacy.EntityDbEnvironment.Open(String& sql, DataTable& datatable)
**at myProject.Checks.ExecuteSql()**
Ich kann mir nur vorstellen, das ist ein oracle client problem, aber wo soll ich suchen um dieses Problem beheben?
Haben Sie autocommit auf? Dieser Fehler wird ausgelöst, wenn Sie versuchen zu Holen einen cursor über commit (Sie sollten nicht verpflichten, innerhalb einer cursor-Schleife).
Nicht, dass wir glauben, dass die Verbindungszeichenfolge ist genau das gleiche, aber vielleicht können festgelegt werden auf dem oracle-client?
Ja, autocommit kann nur eingestellt werden, durch den client. Der Fehler kommt nicht von der SQL-Anweisung selbst, sondern aus der falschen Nutzung der cursor (fetch nach der letzten Zeile zurück, Holen nach einem commit für eine FOR UPDATE-cursor, fetch nach binden, ohne re-Ausführung oder Holen Sie nach rollback).
Ich habe einige der Forschung getan und gefunden, dass
Nicht, dass wir glauben, dass die Verbindungszeichenfolge ist genau das gleiche, aber vielleicht können festgelegt werden auf dem oracle-client?
Ja, autocommit kann nur eingestellt werden, durch den client. Der Fehler kommt nicht von der SQL-Anweisung selbst, sondern aus der falschen Nutzung der cursor (fetch nach der letzten Zeile zurück, Holen nach einem commit für eine FOR UPDATE-cursor, fetch nach binden, ohne re-Ausführung oder Holen Sie nach rollback).
Ich habe einige der Forschung getan und gefunden, dass
To disable Autocommit, call SQLSetConnectOption with the SQL_AUTOCOMMIT_OFF qualifier.
aber wo Mach ich das? In der Dokumentation ODBC ist ziemlich schlecht.InformationsquelleAutor m.edmondson | 2013-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich das Problem auch. Meine Bewerbung war in Ordnung arbeiten auf einer Maschine, die genau die gleiche ausführbare Datei auf einem anderen Rechner war immer, dass fetch out of sequence Ausnahme.
Meine Anfrage ist groß, das dauert ein paar Minuten zu laufen. Es lief durch eine COM+. Ich merkte, dass meine beiden Umgebungen hatte ein etwas anderes Component Services-Konfiguration. Die fehlerhafte Umgebung hatte, eine Transaktion timeout auf 60s, die andere wurde eingestellt, um viel mehr.
Um dieses Problem zu lösen, ich musste einfach gehen Sie auf Komponentendienste, klicken Sie rechts auf Arbeitsplatz, Eigenschaften, Optionen, und erhöhen Sie die Transaktion timeout.
Macht es jetzt Sinn die fetch out of sequence Ausnahme passiert, wenn Sie versuchen, auf einem geschlossenen cursor. Ich verstehe, dass die COM+ - timeout Schloss die Transaktion, also den cursor, und geworfen, dass Oracle Ausnahme.
InformationsquelleAutor Antoine Dijoux