【问题标题】:C++ ODBC Unhandled exception / Access violation writing locationC++ ODBC未处理异常/访问冲突写入位置
【发布时间】:2012-10-31 02:11:31
【问题描述】:

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

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

Unhandled exception at <mem loc> in <prog name>: 0xC0000005: Access violation writing location <mem loc>.

这是ERROR 指出违规行的代码:

SQLINTEGER length = 0;
vector<vector<string>> data;
this->sReturn = SQLFetch(this->sHandle);

while (this->sReturn == SQL_SUCCESS) {
  vector<string> tuple;

for (int i = 0; i < columnCount; i++) {
  SQLPOINTER value = "";

  switch (info[i].columnType) {
    case 0 : //SQL_UNKNOWN_TYPE
      throw DatabaseAttributeTypeUnknown("The database returned an attribute of an unknown type.");
      break;

    case 1 : //SQL_CHAR
      this->sReturn = SQLGetData(this->sHandle, i + 1, info[i].columnType, value,
        info[i].columnSize*sizeof(SQLCHAR),
ERROR   &length);
        break;

     //Some more cases
  }
}

知道为什么会抛出这个错误吗?这是MSDN documentation on SQLGetData(),它为length赋值。

感谢您的宝贵时间。

【问题讨论】:

    标签: c++ sql exception odbc runtime-error


    【解决方案1】:

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

    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 列写入(而不是读取)数据。

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

    【讨论】:

      【解决方案2】:

      除了弗雷德里克所说的。您是否正在编译 64 位代码?如果是这样,您会发现 SQLGetData 将指针指向最后一个参数的 SQLLEN,而不是 SQLINTEGER:

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

      SQLLEN 在 64 位窗口中是 8 个字节,而不是像 SQLINTEGER 那样是 4 个字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2011-08-24
        相关资源
        最近更新 更多