我知道以前有人问过这个问题,并且我尝试实施该解决方案,但是当我调用 ps->executeUpdate() 时,我得到了异常错误。有没有人有一个明确的例子?
Paul
问问题
4875 次
3 回答
1
这篇文章有点旧,但我遇到了同样的问题。我采用了上面的方法,但它并不适合我的情况,它试图获取一个向量并将其用于流。我正在做的是获取一个 UUID 并将其转换为 16 字节的二进制版本以在表中使用。使用上面的方法,我发现只有一半的缓冲区被填充。
我最终使用了stringstream
.
std::vector<unsigned char> convertedId;
std::stringstream stream;
// convertedId has been populated with the 16 byte binary version
stream = std::stringstream(std::string(convertedId.begin(), convertedId.end()));
// Parameter 1 is BINARY(16)
pStatement->setBlob(1, &stream);
还有一些其他的事情要记住。execute
在调用其中一个变体之前不会访问该流。所以你需要保持流,直到你运行execute
。
希望这将帮助某人并节省他们的时间。
于 2017-04-19T18:06:07.010 回答
0
抱歉,马修 - 我假设了这个问题的先前答案(由 elrohin 提供)。也许我应该回答这个问题。无论如何,这是他建议的代码:
class DataBuf : public streambuf
{
public:
DataBuf(char * d, size_t s) {
setg(d, d, d + s);
}
};
// prepare sql update statement etc. and set the data pointer
string* pData = ; // ...not part of the original answer
DataBuf buffer((char*)pData->data(), pData->length());
istream stream(&buffer);
ps->setBlob(1, &stream);
ps->executeUpdate(); // This causes an exception in free.c
我正在使用带有最新(测试版)连接器/cpp 调试库的 VS9。我也尝试过使用 char* 而不是字符串。
于 2009-07-10T15:34:09.663 回答
0
这段代码对我来说很好:
Driver *driver;
Connection *conn;
driver = get_driver_instance();
conn = driver->connect("tcp://127.0.0.1:3306", "root", "root");
std::auto_ptr use_stmt(conn->createStatement());
use_stmt->execute("USE world");
std::auto_ptr stmt(conn->prepareStatement("INSERT INTO terrain_texture_tiles_0 (data) VALUES(?)"));
std::string value("A\0B", sizeof("A\0B") - 1);
std::istringstream tmp_blob(value);
stmt->setBlob(1, &tmp_blob);
stmt->execute();
希望它有所帮助...... Jaroslav Pribyl
于 2010-05-16T20:43:52.277 回答