Разработка iPhone - sqlite3_bind_int не работает - PullRequest
2 голосов
/ 17 сентября 2010

Я пытаюсь вставить некоторые данные в базу данных, используя этот код:

-(void)insertLocationOnDatabase:(LocationType *)aLocation {
    sqlite3_stmt *stmt;
    int location = [aLocation.locationID intValue];
    NSLog(@"Location ID: %i", location);
    const char *sql = "insert into tbl_location values (?,?,?,?)";
    if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) == SQLITE_OK) {
        sqlite3_bind_int(stmt, 0, location);
        sqlite3_bind_text(stmt, 1, [aLocation.Description UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 2, [aLocation.isActive UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 3, [aLocation.sequenceOrder UTF8String], -1, SQLITE_TRANSIENT);
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"Location %@ inserted on database",aLocation.Description);
        }
        else {
            NSLog(@"Error on step: %i",sqlite3_errcode(database));
            }
    }
    else {
        NSLog(@"Error on prepare: %i",sqlite3_errcode(database));
    }
}

проблема в линии:

sqlite3_bind_int(stmt, 0, location);

без этой строки и изменения SQL, код работает нормально, но когда я помещаю эту строку обратно, я получаю эту ошибку:

2010-09-17 10:24:01.032 StockControl[944:207] Error on step: 20

Из sqlite3.h:

#define SQLITE_MISMATCH    20   /* Data type mismatch */

Кто-нибудь знает, где моя ошибка?

С уважением, Claudio

Ответы [ 2 ]

9 голосов
/ 17 сентября 2010

Согласно документации для методов привязки в SQLite , привязки считаются с одного, а не с нуля:

Второй аргумент - это индекс параметра SQLзадавать.Крайний левый параметр SQL имеет индекс 1.

. Это может привести к несоответствию типов.

1 голос
/ 17 сентября 2010

Почему бы не использовать следующие методы?

NSString *sqlCmd = [NSString stringWithFormat:
                   @"insert into tbl_location values (%d,'%@','%@','%@')",
                  location, 
                  aLocation.Description, 
                  aLocation.isActive, 
                  aLocation.sequenceOrder];

const char *sql = [sqlCmd UTF8String];

// ...

Я использую связывание только для больших данных, например, файла изображения.

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