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

标签 c++ odbc stack corruption

我正在调用 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*?当我使用显式强制转换强制它时,为什么堆栈会损坏?

感谢您的帮助!

最佳答案

typedefchanged在 64 位 API 上。以下是导致堆栈损坏的原因:

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

当它期望 64 位整数时,您正在传递一个 32 位整数(SQLINTEGERtypedef 转换为 long)位一。

关于c++ - 无法将 SQLINTEGER* 转换为 SQLLEN* (x64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9452091/

相关文章:

c++ - 无法在 QT ubuntu 上使用 odbc 连接到 sql server

javascript - 我将如何解决我对这个曼哈顿天际线/石墙的处理方法,我哪里出错了? Javascript

c++ - 使用异步boost asio代码进行同步操作

c++ - 何时在 C++ 中使用字符数组而不是字符串?

c++ - 数据数组返回问题,覆盖

sql-server - Ruby 连接到 SQL Server

ubuntu - 无法在 Linux 上使用 alexbrainman/odbc 连接到 Go 中的第 3 方 ODBC 驱动程序

stack - LTE堆栈协议(protocol)开发

c - 从堆栈弹出时输出错误

c++ - 如何使用 opencv 去除图像中的船尾迹?