Вопросы | sqlite

SQLite3: вставка BLOB с символами NULL в C ++

Вопрос

jbatista | 13382 просмотров | рейтинг: 9

Я работаю над разработкой C ++ API, который использует специально разработанные плагины взаимодействовать с различными механизмами баз данных, используя их API и специфический SQL синтаксис. В настоящее время я пытаюсь найти способ вставки больших двоичных объектов, но поскольку NULL завершающий символ в C / C ++, BLOB становится усеченным при построении строка запроса INSERT INTO. До сих пор я работал с

 //...
char* sql;
void* blob;
int len;
//...
blob = some_blob_already_in_memory;
len = length_of_blob_already_known;
sql = sqlite3_malloc(2*len+1);
sql = sqlite3_mprintf("INSERT INTO table VALUES (%Q)", (char*)blob);
//...
 
Я ожидаю, что, если это вообще возможно сделать в интерактивной консоли SQLite3, можно создать строку запроса с правильно экранированными символами NULL. Может быть, есть способ сделать это с помощью стандартного SQL, который также поддерживается синтаксисом SQLite SQL? Наверняка кто-то уже сталкивался с такой же ситуацией и раньше. Я гуглил и нашел некоторые ответы, но были на других языках программирования (Python). Заранее благодарю за отзыв.

Комментарии:

zvrba

[На этой] (http://www.sqlite.org/c3ref/bind_blob.html) странице, кажется, перечислены все необходимые вам функции.




Ответы

Louis Gerbarg

+ 1 -
Вы хотите предварительно скомпилировать оператор sqlite_prepare_v2(), а затем связать большой двоичный объект с помощью sqlite3_bind_blob(). Обратите внимание, что оператор, с которым вы связываетесь, будет INSERT INTO table VALUES (?).  


jbatista

+ 9 -
Еще раз спасибо всем за ваши отзывы. На этот раз я сообщаю, как я решил проблему с помощью указаний, приведенных здесь. Надеюсь, это поможет другим в будущем. Как было предложено в первых трех статьях, я использовал подготовленные операторы - кроме того, потому что я также был заинтересован в получении типов данных столбцов, а простой sqlite3_get_table() не подойдет. После подготовки оператора SQL в виде следующей константной строки:
 INSERT INTO table VALUES(?,?,?,?);
 

оно остается обязательным для соответствующих значений. Это делается с помощью столько же вызовов sqlite3_bind_blob(), сколько в столбцах. (Я также прибегнул к sqlite3_bind_text() для других простых типов данных, потому что API, над которым я работаю, может переводить целые / двойные / и т. Д. В строку). Так:
 void* blobvalue[4];
int blobsize[4];
char *tail, *sql="INSERT INTO table VALUES(?,?,?,?)";
sqlite3_stmt *stmt=0;
sqlite3 *db;
/* ... */
db=sqlite3_open("sqlite.db");
sqlite3_prepare_v2(db,
                   sql, strlen(sql)+1,
                   &stmt, &tail);
for(int i=0; i<4; i++)
    sqlite3_ bind_ blob(stmt,
                        i+1, blobvalue[i], blobsize[i],
                        SQLITE_TRANSIENT);
if(sqlite3_step(stmt)!=SQLITE_DONE)
    printf("Error message: %s/n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);
 

Также обратите внимание, что некоторые функции (sqlite3_open_v2(), sqlite3_prepare_v2()) появляются в более поздних версиях SQLite (я полагаю, 3.5.x и более поздние).


Теги

sqlite | null | escaping | blob