【发布时间】:2016-06-29 23:58:01
【问题描述】:
我有一个带有 mediumblob 列的 MySQL 数据库。我想在 Windows 上使用 ODBC 将二进制数据从 blob 字段转换为 C++ 字符串流。
我首先调用SQLDescribeCol,它表明它的类型是SQL_LONGVARBINARY。
然后我拨打SQLGetData如下:
SQLLEN indicator;
SQLCHAR SqlChar[8000];
SQLGetData(m_sqlstatementhandle, i, SQL_CHAR, &SqlChar, sizeof(SqlChar), (SQLLEN*)&indicator);
然后我继续将数据写入stringstream:
stringstream ss;
ss.write((char*)&SqlChar, indicator);
这确实给了我 blob 数据,但它以十六进制字符串的形式存储在 SqlChar 中。
我的程序希望字符串流中的数据以二进制形式存储。现在我可以先将 HEX 字符串转换为二进制,然后将其写入字符串流,但这对我来说感觉不对。我真的很想直接从SQLGetData 获得二进制文件。
有几个问题:
- 我是否正确地将
SQLGetData用于 blob 类型? -
SQLCHAR数组是正确的写入容器吗? - 有没有办法通过 ODBC 直接从 MySQL 获取二进制数据?
谢谢。
【问题讨论】:
-
但它作为 HEX 字符串存储在 SqlChar 中。 -- 你怎么知道数据真的是一个十六进制字符串?也许是您的调试器向您显示数据 as 十六进制字符串,而不是数据实际上是十六进制字符串。此外,您应该在调用 ODBC 函数时检查您的返回码。调用
SQLGetData后的返回值是多少? -
@PaulMcKenzie 感谢您的评论。以上只是一些使问题清晰的最小代码。我确实在我的实际代码中检查了返回代码。事实证明,一旦我找到它,修复就非常简单。