#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)