返回 SQLUINTEGER 时,64 位 SQLGetStmtAttr 将 8 个字节写入值缓冲区

64-bit SQLGetStmtAttr writes 8 bytes to value buffer when returning SQLUINTEGER

我对我在这段代码中看到的内容感到惊讶:

SQLUINTEGER uiCursorType;
SQLINTEGER  iLength;
SQLRETURN sSQLReturn;
sSQLReturn = SQLGetStmtAttr( shStmtHandle, SQL_ATTR_CURSOR_TYPE, &uiCursorType, SQL_IS_UINTEGER, &iLength);

我最初被告知这里可能存在问题,因为当包含函数 returns 时,Visual Studio(远程)调试器告诉我变量 [=11 附近存在堆栈损坏=].进一步调查我发现这很可能是正确的。 SQLGetStmtAttr函数执行后,uiCursorType中的值为2iLength中的值为8。在调试器中检查 sizeof(uiCursorType)sizeof(SQLUINTEGER) 的值,它报告两者的 4。但是我从 iLength 中的值开始相信该函数实际上写入了 8 个字节。我看不出代码如何能更清楚地说明它期望返回匹配它提供的变量缓冲区的值:SQLUINTEGERSQL_IS_UINTEGER 看起来非常匹配。这个函数在 64 位平台上有问题吗?

在进行 Google 搜索时,我在 http://lists.freedesktop.org/archives/libreoffice/2012-January/024859.html 找到了某种似乎相关的补丁程序,但我不知道如何找到有关它的更多信息。是否有关于此问题的更多信息以及如何修复它?

你不应该使用 SQLULEN 作为缓冲区(你的 uiCursorType)吗?在 64 位中,SQLULEN 被定义为 INT64,这将是您正在观察的 8 字节。

Microsoft 关于 SQL_ATTR_CURSOR_TYPE ( https://msdn.microsoft.com/en-us/library/ms712631%28v=vs.85%29.aspx ) 的文档说该值为 SQLULEN.

SQL_ATTR_CURSOR_TYPE (ODBC 2.0)
An SQLULEN value that specifies the cursor type:

另外 请注意,如果属性不是字符串或二进制属性 (https://msdn.microsoft.com/en-us/library/ms715438%28v=vs.85%29.aspx),驱动程序很可能会忽略 BufferLength 的值:

If Attribute is an ODBC-defined attribute and *ValuePtr is an integer, BufferLength is ignored.