2012-02-26 15 views
2

SQLGetData()を呼び出してフィールド値を取得しています。これは32ビットアプリケーションとしてはうまく動作しますが、スタックを64ビットとして破棄しています。SQLINTEGER *をSQLLENにキャストできません。*(x64)

奇妙なことは、SQLLENが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です。それは、64ビットのものを期待しているときは、32ビット整数に渡している

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

SQLINTEGERtypedefある「longにD):ここにあなたのスタックの破損を引き起こしているものです。

+0

ああ、そうだった。ありがとう! – James

関連する問題