【问题标题】:How to set binary data using setBlob() in C++ connector如何在 C++ 连接器中使用 setBlob() 设置二进制数据
【发布时间】:2010-11-09 16:06:18
【问题描述】:

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

【问题讨论】:

  • "并且我尝试实施解决方案" 如果您不发布任何代码,我们应该如何知道您尝试了什么?了解您正在使用的教程/示例也将有所帮助。

标签: c++ mysql binary blob sqlconnection


【解决方案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

希望这可以帮助某人并节省他们的时间。

【讨论】:

    【解决方案2】:

    对不起,马修 - 我假设了这个问题的先前答案(由 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* 代替字符串。

    【讨论】:

    • 如果 free.c 中出现异常,则意味着内存发生了不好的事情。我正看着那个字符演员表。
    【解决方案3】:

    这段代码对我来说很好用:

    
      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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2018-10-28
      • 2011-07-22
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多