簡體   English   中英

C ++ ODBC未處理的異常/訪問沖突寫入位置

[英]C++ ODBC Unhandled exception / Access violation writing location

我正在編寫一個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
  }
}

為什么會引發此錯誤的任何想法? 這是有關SQLGetData()MSDN文檔 ,該文檔正在將一個值分配給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列中的數據。

我可能會錯過其他細節,但是我的第一個猜測是導致內存訪問沖突的原因。

除了弗雷德里克所說的。 您是否在編譯64位代碼? 如果是這樣,您會發現SQLGetData使用指向最后一個參數而不是SQLINTEGER的SQLLEN的指針:

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

在64位窗口中,SQLLEN是8個字節,而不是SQLINTEGER是4個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM