在我们的应用程序中,我们有ODBC连接。这些连接在x64版本中根本无法工作。
在64位的Windows程序中调用SQLBindCol总是失败,参数如下。
void *dataPtr = new char[ 512 ] ;
SDWORD count = 0;
SQLBindCol( hstmt, 1, SQL_C_CHAR, dataPtr, 512, &count);
令人惊讶的是,SQL日志显示的是一个巨大的数字-3689348818177884160,而不是512(BufferLength)。
T=1 6840-3404 ENTER SQLBindCol
HSTMT 0x000000000E363F40
UWORD 1
SWORD 1 <SQL_C_CHAR>
PTR 0x0000000000000000
SQLLEN -3689348818177884160
SQLLEN * 0x000000001BA1DC82
T=1 6840-3404 EXIT SQLBindCol with return code 0 (SQL_SUCCESS)
HSTMT 0x000000000E363F40
UWORD 1
SWORD 1 <SQL_C_CHAR>
PTR 0x0000000000000000
SQLLEN -3689348818177884160
SQLLEN * 0x000000001BA1DC82 (5714869293485654016)
DIAG [S1090] [Microsoft][ODBC Driver Manager] Invalid string or buffer length (0)
即使传递BufferLength为0,结果也是一个巨大的数值,就像SQL日志中显示的那样。编译32位时没有问题。安装了64位ACCESS驱动。
问题很简单--但不是那么容易找到。
在我的包含路径中的某个地方,确实存在着一些旧版本的sql.h sqlext.h sqltypes.h。
** (C) Copyright 1990 - 1995 By Microsoft Corp.
早在64位系统之前
我通过使用MSVC编译器的 "显示包含 "选项发现了这个问题。