我正在调用 SQLGetData() 来获取字段值。作为 32 位应用程序,这可以正常工作,但作为 64 位应用程序,它会破坏堆栈。
奇怪的是 SQLLEN 被 #define 为 SQLINTEGER,所以它们是同一个。事实证明,它们都是 long 类型。
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*?当我使用显式强制转换强制它时,为什么堆栈会损坏?
感谢您的帮助!
最佳答案
typedef
有 changed在 64 位 API 上。以下是导致堆栈损坏的原因:
#ifdef _WIN64
typedef INT64 SQLLEN;
typedef UINT64 SQLULEN;
#else
#define SQLLEN SQLINTEGER
#define SQLULEN SQLUINTEGER
#endif
当它期望 64 位整数时,您正在传递一个 32 位整数(SQLINTEGER
被 typedef
转换为 long
)位一。
关于c++ - 无法将 SQLINTEGER* 转换为 SQLLEN* (x64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9452091/