无法将SQLINTEGER *转换为SQLLEN *(x64)

时间:2012-02-26 09:48:03

标签: c++ odbc stack corruption

我正在调用SQLGetData()来获取字段值。这可以作为32位应用程序正常工作,但它将堆栈视为64位。

奇怪的是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 *?当我使用显式强制转换强制它时,为什么堆栈会被破坏?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

typedef在64位API上有changed。这是造成你的堆栈损坏的原因:

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

当你需要一个64位整数时,你传入一个32位整数(SQLINTEGERtypedef'到long)。