0

このコードでレコードを挿入すると、いくつかのエラーが発生するため、練習のためにいくつかのsqliteプログラムを試しました

-(void) insertRecordIntoTableNamed:(NSString *) tableName
                            withField1:(NSString *) field1
                           field1Value:(NSString *) field1Value
                             andField2:(NSString *) field2
                           field2Value:(NSString *) field2Value {
        NSString *sql = [NSString stringWithFormat:
                         @"INSERT INTO ‘%@‘ (‘%@‘, ‘%@‘) VALUES (‘%@‘,’%@‘)",tableName, field1, field2, field1Value, field2Value];
        char *err;
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(0, @"Error updating table.");
        }
    }

エラーメッセージは

** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error updating table.'

端末からデータを挿入しようとすると、データが正しく取得されます

プログラムを介してデータを挿入するのを手伝ってください

4

2 に答える 2

2

char * as sql ステートメントを NSString オブジェクトとして使用すると、うまく機能する可能性があります。例えば:

char *sql = "INSERT INTO '?' ('?', '?') 値 ('?' ....";

を置き換えるには?NSString 引数を使用して、以下の関数を使用します。

sqlite3_bind_text(insert_statement, 1, [tableName UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(insert_statement, 2, [field1 UTF8String], -1, SQLITE_TRANSIENT); 等....

まず、insert_statement を定義する必要があります。static sqlite3_stmt *insert_statement = nil; ...そして最後に、sqlite3_reset(insert_statement); でステートメントをリセットする必要があります。

于 2013-01-05T17:39:41.943 に答える
1

LEFT SINGLE QUOTATION MARK は、SQLite で識別子または値を引用するのには適していません。識別子を " (\x22) で、データを ' (\x27) で引用します。

また、SQL インジェクションの可能性が問題にならない程度にプログラムが単純であることを願っています。

于 2013-01-05T11:28:46.727 に答える