【问题标题】:How to get BLOB data using oracle ODBC如何使用 oracle ODBC 获取 BLOB 数据
【发布时间】:2014-12-24 10:44:18
【问题描述】:

我正在尝试获取存储在 BLOB 中的图像,然后将其保存为 jpg。

在这里我检索二进制数据并将其保存在 str;

  string str;
  SQLCHAR buf[500] = {0};
  while ((SQL_SUCCEEDED(SQLGetData(StmtHandle, colnum, SQL_C_BINARY, buf, sizeof(buf), NULL))))
  {
     string data(reinterpret_cast< const char* >(buf), reinterpret_cast< const char* >(buf) +    sizeof(buf));
     str = str + data;
  }

然后我把它写在文件里

ofstream file;  
file.open("C:\\Users\\tom\\Desktop\\img.jpeg");
file << str;
file.close();

我得到了不正确的图像。

这种数据提取方法有什么问题(我用this)?

【问题讨论】:

  • “我得到了不正确的图像。” 这不是您期望的图像?还是图片文件损坏了?
  • 图像文件已损坏,无法打开,并且这个手动创建的文件的二进制数据与原始二进制数据不同

标签: c++ oracle odbc


【解决方案1】:

我不熟悉 ODBC 编程,但乍一看,我看到的一个问题是您假设您的数据长度是缓冲区大小的倍数。但不能保证最后一次读取准确返回 500 字节的数据。

你应该写这样的东西。也许:

  string str;
  SQLCHAR buf[500];
  SQLLEN cbLeft;      // #bytes remained

  while ((SQL_SUCCEEDED(SQLGetData(StmtHandle, 
                                   colnum, 
                                   SQL_C_BINARY, 
                                   buf, 
                                   sizeof(buf),
                                   &cbLeft))))
  //                               ^^^^^^^
  {
          string data(reinterpret_cast< const char* >(buf),
                      reinterpret_cast< const char* >(buf)
                      + cbLeft);
          //            ^^^^^^
          str = str + data;

请花几分钟时间查看Using Length/Indicator Values,以检查长度/指标值是如何使用的。

【讨论】:

  • thx,我检查了它,现在使用长度/指标值,但我的问题仍然没有解决
  • @Infated 也许是时候比较hexdump您的数据文件和预期的内容以查明问题(错误的大小?错误的数据?丢失的字节?额外的字节?...)
猜你喜欢
  • 2011-08-06
  • 2019-05-15
  • 1970-01-01
  • 2012-09-28
  • 2015-03-04
  • 2015-01-31
  • 2022-01-15
  • 2014-10-02
相关资源
最近更新 更多