sqlite3_bind_parameter_index возвращает 0?

#iphone #sqlite

#iPhone #sqlite

Вопрос:

Счетчик возвращает количество параметров и является хорошим. Однако индекс возвращает 0. Есть идеи?

 sqlite3 *database;
sqlite3_stmt *updateStmt;
int ID;
const char *sql;

sql = "update User set Name = ? , Dev = ?,ActiveLevel = ? Where _id = ?";


if(sqlite3_prepare_v2(database, sql, -1, amp;updateStmt, NULL) != SQLITE_OK)
  NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database));

NSLog(@"count %d",sqlite3_bind_parameter_count(updateStmt));

NSLog(@"Index %d",sqlite3_bind_parameter_index(updateStmt,"ActiveLevel"));
  

Ответ №1:

Из точного руководства:

int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
Возвращает индекс параметра SQL с учетом его имени.

И для параметров:

?
Вопросительный знак, за которым не следует число, создает параметр с номером, на единицу превышающим уже присвоенный наибольший номер параметра.

:АААА
Двоеточие, за которым следует имя идентификатора, содержит место для именованного параметра с именем:AAAA.

Акцент мой во втором разделе.

В вашем SQL вообще нет именованных параметров, у вас просто простые старые заполнители. Имя параметра — это имя заполнителя ( :AAAA ), а не имя рассматриваемого столбца; помните, что вы можете использовать заполнители в местах, где имя не может быть получено автоматически, поэтому вам придется называть их самостоятельно.

Если вы хотите использовать ActiveLevel в качестве именованного параметра, то ваш SQL должен выглядеть следующим образом:

 update User set Name = ? , Dev = ?, ActiveLevel = :ActiveLevel Where _id = ?
  

И вы, вероятно, захотите заменить другие заполнители ( ? ) именованными параметрами для обеспечения согласованности.

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

1. Аааа, я думал, что он ищет имена полей. Спасибо!

2. > помните, что вы можете использовать заполнители в местах, где имя не может быть получено автоматически, поэтому вам придется называть их самостоятельно, что вы имеете в виду под этим?

3. Хорошо, я попробовал, и я не смог выполнить такую привязку к имени таблицы (ошибка sqlite3_preparev2), поэтому я предполагаю, что это то, что вы имели в виду.

4.Также стоит отметить, что, хотя : , $ и @ все могут использоваться для обозначения именованного параметра, «интуитивный вызов» в соответствии с запросом OP неверен sqlite3_bind_parameter_index(updateStmt,"ActiveLevel") , префикс становится частью имени, поэтому: sqlite3_bind_parameter_index(updateStmt,":ActiveLevel") будет работать. из руководства Другими словами, начальное «:» или «$» или «@» или «?» включено как часть имени (протестировано на чистом C)