sqlite3_bind_parameter_index возвращает 0? - PullRequest
0 голосов
/ 21 мая 2011

Счетчик возвращает количество параметров и является хорошим. Однако индекс возвращает 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, &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 Ответ

3 голосов
/ 21 мая 2011

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

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

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

?
Знак вопроса, за которым не следует число, создает параметр, номер которого на единицу больше, чем самый большой параметрномер уже присвоен.
...
: AAAA
Двоеточие, за которым следует имя идентификатора, содержит место для именованного параметра с именем : AAAA .

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...