Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;ODBC未处理的异常/访问冲突写入位置_C++_Sql_Exception_Odbc_Runtime Error - Fatal编程技术网

C++ C++;ODBC未处理的异常/访问冲突写入位置

C++ C++;ODBC未处理的异常/访问冲突写入位置,c++,sql,exception,odbc,runtime-error,C++,Sql,Exception,Odbc,Runtime Error,我正在编写一个ODBC数据库类,其中包含一个成员函数,用于从给定查询中获取一系列属性和元组 我在下面的语句中有一行代码,导致在调试模式下抛出此运行时错误: Unhandled exception at <mem loc> in <prog name>: 0xC0000005: Access violation writing location <mem loc>. 你知道为什么会抛出这个错误吗?这是为length赋值的 谢谢您的时间。当编译器将可执行代码映射

我正在编写一个ODBC数据库类,其中包含一个成员函数,用于从给定查询中获取一系列属性和元组

我在下面的语句中有一行代码,导致在调试模式下抛出此运行时错误:

Unhandled exception at <mem loc> in <prog name>: 0xC0000005: Access violation writing location <mem loc>.
你知道为什么会抛出这个错误吗?这是为
length
赋值的


谢谢您的时间。

当编译器将可执行代码映射到源代码中的代码行时,它们通常无法区分拆分为多行的语句中的行。因此,如果调试器说某个错误发生在特定的行上,它实际上可以出现在整个语句中的任何位置,因此:

this->sReturn = SQLGetData(this->sHandle, i + 1, info[i].columnType, value,
    info[i].columnSize*sizeof(SQLCHAR),
    &length);
这里唯一不稳定的指针是
value
,它指向空静态字符串,因此指向包含空字节的单字符长数组。此外,根据编译器选项,此数组可以位于只读数据段中。SQLGetData()认为它指向的位置至少是
info[i].columnSize*sizeof(SQLCHAR)
字节大小,并且它将从SQL列写入(而不是读取)数据


我可能会错过其他细节,但我的第一个猜测是,这就是导致内存访问冲突的原因。

除了Frederic所说的之外。您正在编译64位代码吗?如果是这样,您会发现SQLGetData为最后一个参数获取指向SQLLEN的指针,而不是SQLINTEGER:

SQLRETURN  SQL_API SQLGetData(SQLHSTMT StatementHandle,
                              SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType,
                              SQLPOINTER TargetValue, SQLLEN BufferLength,
                              SQLLEN *StrLen_or_Ind);
在64位windows中,SQLLEN是8个字节,而不像SQLINTEGER那样是4个字节

SQLRETURN  SQL_API SQLGetData(SQLHSTMT StatementHandle,
                              SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType,
                              SQLPOINTER TargetValue, SQLLEN BufferLength,
                              SQLLEN *StrLen_or_Ind);