c++ - 如何在 C++ 中使用 SQLGetData 获取 MySQL blob 作为二进制数据

标签 c++ mysql odbc blob

我有一个带有 mediumblob 列的 MySQL 数据库。我想在 Windows 上使用 ODBC 将二进制数据从 blob 字段获取到 C++ stringstream。

我首先调用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 数据,但它作为 HEX 字符串存储在 SqlChar 中。

我的程序希望 stringstream 中的数据以二进制形式存储。现在我可以先将 HEX 字符串转换为二进制,然后将其写入字符串流,但这对我来说并不合适。我真的很想直接从 SQLGetData 获取它的二进制文件。

所以有几个问题:

  1. 我是否为 blob 类型正确使用了 SQLGetData
  2. SQLCHAR 数组是写入的正确容器吗?
  3. 有没有办法通过 ODBC 直接从 MySQL 获取二进制数据?

谢谢。

最佳答案

提供 SQL_BINARY 作为参数是错误的(即使它在这里有效,因为 SQL_BINARYSQL_C_BINARY 似乎被定义为相同的值)。从 SQLGetData 的文档中,关于第三个参数 TargetType:

[Input] The type identifier of the C data type of the *TargetValuePtr buffer. For a list of valid C data types and type identifiers, see the C Data Types section in Appendix D: Data Types.

参见:https://msdn.microsoft.com/en-us/library/ms715441%28v=vs.85%29.aspx

输入标识符需要标识所用缓冲区的 C 类型。 c 类型标识符的名称都类似于 SQL_C_foobar

因此,您应该传递 SQL_C_BINARY 作为参数(如果您想告诉驱动程序获取纯二进制数据)或 SQL_C_CHAR(如果您想告诉驱动程序将数据转换为一些“字符数据”)。请注意,SQL_C_CHARSQL_CHAR 都定义为 1

关于驱动程序将数据转换为“字符串”的情况的更多解释:正如您从 C 数据类型列表中看到的那样,缓冲区类型 SQLCHAR 可用于多个“C 类型标识符”:如果您使用 SQLCHAR 缓冲区,并将 SQL_C_CHAR 作为 InputType 传递,驱动程序“知道”缓冲区是键入 SQLCHAR 并且您希望将数据作为“字符数据”获取。因此,在您的情况下,MySql 会将二进制数据转换为人类可读的内容,例如十六进制字符串。另一方面,如果您将 SQL_C_BINARY 作为 InputType 传递,驱动程序“知道”缓冲区的类型是 SQLCHAR 并且您感兴趣纯二进制值,因此驱动程序无需将二进制数据转换为人类可读的字符串,它只会用纯二进制数据填充缓冲区。

有关 c 类型及其相应缓冲区类型的列表,请参见此处:https://msdn.microsoft.com/en-us/library/ms714556%28v=vs.85%29.aspx

作为一般注意事项:注意文档中提到的是“Sql C 类型”还是“Sql 类型”。第一个用于标识缓冲区的 C 类型,另一个用于标识列的逻辑数据库类型。

关于c++ - 如何在 C++ 中使用 SQLGetData 获取 MySQL blob 作为二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996132/

相关文章:

c++ - 将字符串转换为 double 型,然后将其插入 While 循环中的 vector

c++ - Qt/C++ - 转换原始二进制数据并将其显示为图像(即 QImage)

mysql - 我可以在 MySQL 中加入两个表的列数上限?

mysql - 添加依赖项以生成文件 C++

mysql - 永久计算域mysql数据库

MySQL 到 MSSQL 查询转换

c++ - 对数组的每个元素求和函数的结果

sql-server - "String data, right truncation"select 语句上的警告

excel - 将 PowerPivot 连接到 PostgreSQL 数据库

c++ - RcppExport 错误原因