【发布时间】:2013-04-19 09:42:14
【问题描述】:
当我的应用程序部署在仅服务器上时,而不是在我的本地计算机上运行完全相同的可执行文件时,我收到以下 oracle 错误:
堆栈跟踪指向一个带有连接的简单选择语句,我可以在本地通过TOAD 和在问题服务器上通过SQL Plus 成功执行该语句。
stacktrace 的上半部分是:
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()**
我只能想象这是一个 oracle 客户端问题,但我应该从哪里解决这个问题?
【问题讨论】:
-
你有自动提交吗?如果您尝试通过提交获取游标(您不应在游标循环内提交),则会引发此错误。
-
@VincentMalgrat - 不是我们相信,连接字符串完全一样,但也许可以在 oracle 客户端上设置?
-
是的,自动提交只能由客户端设置。该错误不是来自 SQL 语句本身,而是来自游标的错误使用(在返回最后一行后获取,对于 FOR UPDATE 游标,在提交后获取,在重新绑定后获取而不重新执行或在回滚后获取)。跨度>
-
我做了一些研究,发现
To disable Autocommit, call SQLSetConnectOption with the SQL_AUTOCOMMIT_OFF qualifier.但是我在哪里做呢? ODBC 的文档很差。
标签: sql oracle oracle11g oracleclient