如何在C ++连接器中使用setBlob()设置二进制数据

时间:2009-07-10 09:54:04

标签: c++ mysql binary blob sqlconnection

我知道之前已经问过这个问题,我试图实现解决方案,但是当我调用ps-> executeUpdate()时,我只是遇到异常错误。有人有明确的例子吗?

3 个答案:

答案 0 :(得分: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

我正在使用VS9和最新的(beta)连接器/ cpp调试库。我也尝试使用char *而不是string。

答案 1 :(得分: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

答案 2 :(得分:0)

这篇文章有点陈旧,但我遇到了同样的问题。我采用了上面的方法,它对我的​​情况不太正常,它试图采用一个向量并将其用于流。我正在做的是获取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

希望这会帮助别人并节省时间。