MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
MySQL c++ connector: what is the correct way to use SetBlob() to set multiple blob data in a query?
我在stackexchange db admin上问了同样的问题,这似乎是这个问题的合适位置,但问题是甚至没有人查看这个问题。所以我再次在这里发布同样的问题:
我正在研究 Mysql 表插入。表创建语句如下所示:
CREATE TABLE files_table (fid INT NOT NULL AUTO_INCREMENT, idx TINYBLOB, head TINYBLOB, size BLOB, PRIMARY KEY(fid));
我可以手动插入记录
mysql> select * from files_table order by fid asc;
+-----+------+------+------------+
| fid | idx | head | size |
+-----+------+------+------------+
| 1 | 1 | 1 | 1 |
+-----+------+------+------------+
但是当我使用连接器通过 c++ 连接器添加下一个值时:
class StreamBufferData : public std::streambuf
{
public:
StreamBufferData(const char *in_data, size_t in_size)
{
setg(in_data, in_data, in_data + in_size);
}
};
enum{QUERY_SIZE=256;}
char ins[QUERY_SIZE];
strcpy(ins, "INSERT INTO files_table (idx, head, size) VALUES (?,?,?)");
try
{
std::unique_ptr<sql::PreparedStatement> statement(ptr_connection->prepareStatement(ins));
char test_data[2] = "0";
StreamBufferData buffer0(test_data, 2);
std::istream test_s0(&buffer0);
statement->setBlob(1, &test_s0);
strcpy(test_data, "1");
StreamBufferData buffer1(test_data, 2);
std::istream test_s1(&buffer1);
statement->setBlob(2, &test_s1);
strcpy(test_data, "2");
StreamBufferData buffer2(test_data, 2);
std::istream test_s2(&buffer2);
statement->setBlob(3, &test_s2);
statement->executeUpdate();
}
catch(sql::SQLException &e)
{
std::cout << e.what() << ‘n’;
return;
}
结果是 :
+-----+------+------+------------+
| fid | idx | head | size |
+-----+------+------+------------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
+-----+------+------+------------+
只有最后一个值正确插入到表中。我的问题是:用户 msql::P reparedStatement::setBlob(( 在查询中设置多个 blob 的正确方法是什么?
[环境]
Ubuntu 16.04.2
MySQL 5.7 MySQL 连接器版本:7.1.1.7
boost 1.58.0 g++ 5.4.0
感谢您的帮助
荣
不同的std::istream
对象指向由test_data
分配的同一缓冲区。我以为 istream 对象会复制 char 数组中的值。事实是,事实并非如此。
同样值得指出的是,如果在语句->executeUpdate((执行之前销毁了std::istream对象。最后一个流对象将填充到表的第一列中,这可能是我的机器(Ubuntu 16.04.2 LTS(上未定义的行为。它看起来像:
+-----+------+------+------------+
| fid | idx | head | size |
+-----+------+------+------------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | | |
+-----+------+------+------------+
因此,如果表具有与上一个表类似的奇怪结果,请检查代码以确保 std::stream、StreamBufferData 和指向缓冲区的指针在语句>executeUpdate(( 执行之前仍然有效。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
- 从数据集 Blob 字段中打开和编辑文件
- 如何使用由 PNG 数据构建的 blob 初始化 Magick::Image obj(PNG 由 cv::imencod
- Cassandra 中的 blob 数据类型
- 如何将数据从 CGImageRef 发送到 Magick++ blob
- 从数据库中以 blob 数据类型形式存储的原始图像数据中检索 CImage 对象
- blob内部数据的对齐和填充
- 如何在 C++ 中使用 SQLGetData 获取 MySQL blob 作为二进制数据
- 如何使用oracle ODBC获取BLOB数据
- 将二进制数据 blob 解码为结构
- 使用 ADO 将原始文件数据插入访问表的 BLOB("OLE 对象")字段
- 从void*数据blob加载sqlite数据库
- SQLite blob数据类型
- mysql数据库c++中存储blob数据的语法