仅 64 位应用程序中的 SQL 溢出异常

Posted

技术标签:

【中文标题】仅 64 位应用程序中的 SQL 溢出异常【英文标题】:Overflow exception from SQL in only 64 bit applications 【发布时间】:2014-01-09 00:59:22 【问题描述】:

我有一个在 AS400 上运行的 ODBC 数据库。我创建了一个连接字符串来连接到数据库并运行查询。当我将程序编译为 32 位时,我的所有查询都运行得很好,但是当我将它们编译为 64 位时,我得到了一个溢出异常。不幸的是,我必须将我的程序编译为 64 位。

什么可能导致此问题,我该如何解决?

更多信息: 我正在使用的驱动程序是 iSeries Access ODBC 驱动程序 我所有的数据库列都是字符串或小数 我使用的是连接字符串而不是 DNS 我使用的连接字符串是 "Driver=iSeries Access ODBC Driver;uid=XXX;data provider=ODBC;system=XXX;dbq=XXX;pwd = XXX"

感谢您的帮助。

代码如下所示:

MPDCHFTableAdapter configs = new MPDCHFTableAdapter();
variants = configs.GetDataByProduct("98.M1BODY");  

堆栈跟踪是:

System.OverflowException was unhandled
  HResult=-2146233066
  Message=Arithmetic operation resulted in an overflow.
  Source=System.Data
  StackTrace:
       at System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i)
       at System.Data.Odbc.OdbcDataReader.GetFieldType(Int32 i)
       at System.Data.ProviderBase.SchemaMapping.SetupSchemaWithoutKeyInfo(MissingMappingAction mappingAction, MissingSchemaAction schemaAction, Boolean gettingData, DataColumn parentChapterColumn, Object chapterValue)
       at System.Data.ProviderBase.SchemaMapping..ctor(DataAdapter adapter, DataSet dataset, DataTable datatable, DataReaderContainer dataReader, Boolean keyInfo, SchemaType schemaType, String sourceTableName, Boolean gettingData, DataColumn parentChapterColumn, Object parentChapterValue)
       at System.Data.Common.DataAdapter.FillMappingInternal(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
       at System.Data.Common.DataAdapter.FillMapping(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
       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.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
       at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
       at M3DataSorting.M3DataTableAdapters.MPDCHFTableAdapter.GetDataByProduct(String QIPRNO) in u:\Visual Studio 2012\Projects\M3DataSorting\M3DataSorting\M3Data.Designer.cs:line 8280
       at M3DataSorting.Program.update98SLURRY() in u:\Visual Studio 2012\Projects\M3DataSorting\M3DataSorting\Program.cs:line 314
       at M3DataSorting.Program.Main(String[] args) in u:\Visual Studio 2012\Projects\M3DataSorting\M3DataSorting\Program.cs:line 61
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

【问题讨论】:

如何向我们展示查询和完整的错误消息。 能否请您发布异常文本和完整的堆栈跟踪。 是的,一定要得到驱动程序的确切版本。这很可能是与仅适用于 32 位的驱动程序的兼容性问题。您可能需要从驱动程序的生产者那里获得 64 位版本。 【参考方案1】:

我发现使用 OLE 驱动程序而不是 ODBC 可以防止发生此问题。不过仍然不确定问题出在哪里。

【讨论】:

以上是关于仅 64 位应用程序中的 SQL 溢出异常的主要内容,如果未能解决你的问题,请参考以下文章

ODBC 调用失败 - 从 32 位 ODBC 5.1 移动到 64 位 5.3 后出现随机日期溢出错误

Linux_x64_Pwn溢出漏洞

导致除法溢出错误 (x86)

栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限固定地址的栈溢出攻击

Jarvis OJ- [XMAN]level2/3_x64-Writeup——64位简单栈溢出

克服 x86 idiv #DE 异常