C ++ sqlite3 параметры привязки - PullRequest
2 голосов
/ 24 января 2012

Я играл с библиотекой sqlite3 для C ++ всего несколько дней, но это вызывает у меня большое разочарование.

Я хочу определить параметризованный CREATE TABLE, а затем привязать к нему параметры. Это выглядит примерно так:

const char[] CREATE_SQL = 
  "CRAETE TABLE t1 ("
  "  name VARCHAR(:NAME_LEN)"
  "  other VARCHAR(:OTHER_LEN)"
  ");";

Идея заключается в том, что в другом файле (.cpp для этого заголовочного файла) я смогу связать эти параметры с:

int index = sqlite3_bind_parameter_index(stmt, ":NAME_LEN");
sqlite3_bind_int(stmt, index, _DB_FIELD_SIZE_NAME);

где _DB_FIELD_SIZE_NAME также определено в другом месте.

Я не хочу использовать sprintf() с CREATE_SQL, содержащим %d вместо :NAME_LEN и :OTHER_LEN, потому что я могу изменить порядок параметров или добавить новые, и я хотел бы сохранить привязка явная.

Теперь к проблеме: моя подготовка не возвращает SQLITE_OK, но приводит к нулевому указателю для sqlite3_stmt. Вот что у меня есть:

sqlite3_stmt *stmt;
const char *pStmt = 0;
if( SQLITE_OK != sqlite3_prepare_v2(*db, CREATE_SQL, -1, &stmt, &pStmt) )
    // throws exception with the sqlite3_errmsg(*db) text

Итак, ошибка, которую я получаю, такова:

near ":NAME_LEN": syntax error

Что я делаю не так? Я уверен, что соединение с базой данных открывается ОК.

1 Ответ

0 голосов
/ 25 января 2012

Чтобы не отвечать на ваш вопрос, sqlite не имеет строгого размера столбцов текста.Он принимает типы VARCHAR для совместимости, но не имеет различий в его поведении.

Вы всегда получите что-то эквивалентное этому:

const char *sql = 
  "CREATE TABLE t1 ("
  "  name TEXT"
  "  ,other TEXT"
  ");";

Чтобы ответить на ваш вопрос, я нене верю, что тебе разрешено это делать.Механизмы подстановки в Sqlite работают только с теми параметрами, которые обычно считаются значениями.

Например, то, что вы обычно видите в операторах INSERT или UPDATE.

const char *sql = "INSERT INTO foo (a,b) VALUES (?1,?);";

Надеюсьне помните, можете ли вы вообще сделать их в операторе CREATE, возможно, для параметра по умолчанию?Прошло много времени.

Я обнаружил, что boost::format с гораздо меньшей вероятностью сломает и создаст более понятный код, чем любое другое решение, которое я пробовал, когда вам нужно изменить не имеющие значения параметры.

#include <boost/format.hpp>

// ... 

int instance_id = 42;
const char *sql = "CREATE TABLE type_%1% (a,b);";
boost::str( boost::format(sql) % instance_id );

Я бы определенно рекомендовал вам избегать замены не значащих параметров, если только вам не нужно абсолютно .Это хлопоты по обслуживанию и подвержены ошибкам.

...