64位SQLGetStmtAttr在返回SQLUINTEGER时向值缓冲区写入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);
我最初被告知这里可能存在问题,因为当包含函数返回时,Visual Studio(远程)调试器告诉我变量uiCursorType
附近有堆栈损坏。进一步调查,我发现那件事很可能是对的。SQLGetStmtAttr
函数执行后,uiCursorType
的值为2
, iLength
的值为8
。在调试器中检查sizeof(uiCursorType)
和sizeof(SQLUINTEGER)
的值,它报告两者的4
。但是我从放入iLength
的值中相信该函数实际上写了8个字节。我不明白代码如何能够更清楚地了解它期望返回匹配它所提供的变量缓冲区的值:SQLUINTEGER
和SQL_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。
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 从原始字节解码协议缓冲区(以 C++为单位)
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 将constexpr字节数组与缓冲区的一部分(指向数据的指针)进行比较
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- Fread C++ in C#.我知道我需要字节缓冲区,但并不完全在那里
- 如何通过1024字节缓冲区和强力冲洗在插座连接上发送6个字符的C弦
- 将缓冲区与 N 字节边界对齐,而不是 2N 字节边界?
- std::字符串与字节缓冲区(C++的差异)
- 删除字节数组 : Qt 缓冲区之间的空字符 (\x00)
- 浅拷贝到协议缓冲区的字节字段中
- InternetReadFile 填充缓冲区,但返回零字节读取
- 平面缓冲区:访问冲突:字节序标量
- 缓冲区视图中的字节偏移量大于字节长度
- 将数组与传入的字节*缓冲区进行比较的最快方法
- 在内存(C 和/或 C++)中创建和管理字节缓冲区,该缓冲区可以根据需要自动调整大小
- 高效生成字节缓冲区,而不会破坏严格的混叠
- 如何在 Poco C++ 中复制缓冲区字节块
- DirectX 11追加缓冲区字节宽度