2012-02-26 49 views
2

我正在調用SQLGetData()來獲取字段值。這適用於32位應用程序,但它將堆棧廢棄爲64位。無法將SQLINTEGER *轉換爲SQLLEN *(x64)

奇怪的是,SQLLEN被#defined定義爲SQLINTEGER,所以它們是一樣的。事實證明,它們都是長類型的。

unsigned long Field::asUnsignedLong() const 
{ 
unsigned long result; 
SQLINTEGER sizeNeeded = 0; 

    // Trashes the stack around sizeNeeded... 
    if(!SQL_SUCCEEDED(SQLGetData(_statement, _columnIndex, SQL_C_ULONG, &result, sizeof(result), &sizeNeeded))) 
    { 
     throw std::runtime_error(getError(SQL_HANDLE_STMT, _statement)); 
    } 

    return result; 
} 

爲什麼Visual Studio認爲它不能將SQLLEN *轉換爲SQLINTEGER *?當我使用明確的強制轉換強制執行時,爲什麼堆棧會損壞?

感謝您的幫助!

回答

3

typedef在64位API上有changed。這裏是什麼導致你的籌碼腐敗:

#ifdef _WIN64 
typedef INT64 SQLLEN; 
typedef UINT64 SQLULEN; 
#else 
#define SQLLEN SQLINTEGER 
#define SQLULEN SQLUINTEGER 
#endif 

你傳遞一個32位整數(SQLINTEGERtypedef倒是給long)時,它期待一個64位的一個。

+0

啊哈,就是這樣。謝謝! – James 2012-02-26 14:18:08