我正在调用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 *?当我使用显式强制转换强制它时,为什么堆栈会被破坏?
感谢您的帮助!
答案 0 :(得分:3)
typedef
在64位API上有changed。这是造成你的堆栈损坏的原因:
#ifdef _WIN64
typedef INT64 SQLLEN;
typedef UINT64 SQLULEN;
#else
#define SQLLEN SQLINTEGER
#define SQLULEN SQLUINTEGER
#endif
当你需要一个64位整数时,你传入一个32位整数(SQLINTEGER
为typedef
'到long
)。