64位SQLGetStmtAttr在返回SQLUINTEGER时向值缓冲区写入8字节

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

本文关键字:缓冲区 8字节 SQLGetStmtAttr 返回 SQLUINTEGER 64位      更新时间:2023-10-16

我对我在这段代码中看到的东西感到惊讶:

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

我最初被告知这里可能存在问题,因为当包含函数返回时,Visual Studio(远程)调试器告诉我变量uiCursorType附近有堆栈损坏。进一步调查,我发现那件事很可能是对的。SQLGetStmtAttr函数执行后,uiCursorType的值为2, iLength的值为8。在调试器中检查sizeof(uiCursorType)sizeof(SQLUINTEGER)的值,它报告两者的4。但是我从放入iLength的值中相信该函数实际上写了8个字节。我不明白代码如何能够更清楚地了解它期望返回匹配它所提供的变量缓冲区的值:SQLUINTEGERSQL_IS_UINTEGER似乎匹配得很好。这个函数在64位平台上有bug吗?

做一个谷歌搜索,我发现某种补丁在http://lists.freedesktop.org/archives/libreoffice/2012-January/024859.html似乎是相关的,但我不知道如何找到更多的信息。是否有关于这个问题的更多信息以及如何修复它?

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

微软关于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)
指定游标类型的SQLULEN值:

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

如果Attribute是odbc定义的属性,且*ValuePtr是整数,则忽略BufferLength。