Как установить двоичные данные с помощью setBlob () в коннекторе C ++ - PullRequest
1 голос
/ 10 июля 2009

Я знаю, что об этом уже спрашивали, и я пытался реализовать решение, но я просто получаю ошибки исключения, когда вызываю ps-> executeUpdate (). У кого-нибудь есть явный пример?

Ответы [ 3 ]

0 голосов
/ 17 мая 2010

Этот код отлично работает для меня:


  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(); 

надеюсь, это поможет ... Ярослав Прибыль

0 голосов
/ 19 апреля 2017

Это сообщение немного устарело, но я столкнулся с тем же вопросом. Я использовал описанный выше метод, и он не совсем сработал для моего случая, когда я пытался взять вектор и использовать его для потока. Что я делал, так это брал 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.

Надеюсь, это поможет кому-то и сэкономит им время.

0 голосов
/ 10 июля 2009

Извините Мэтью - я предположил предыдущий ответ на этот вопрос (по элрохину). Может быть, я должен был ответить на это. В любом случае вот код, который он предложил:

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 с последними (бета) коннекторами / cpp debug libs Я также пытался использовать char * вместо string.

...