-1

For update a table, I write::update set =\"%@\" WHERE =\"%@\"",col1Value,col2Value];

But,this is not working. Please help.

My code is below:

    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt *statement;

    NSString *querySQL = [NSString stringWithFormat:@"UPDATE AssemblyAssessment SET countedunits=\"%@\" WHERE assemblyid=\"%@\"",self.SAcountedunits,self.asmbIdStr];
    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(ipadSites,query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {

            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                NSLog(@"done...");

            }
            else
            {
                NSLog(@"not done...");
            }


        sqlite3_finalize(statement);
        sqlite3_close(ipadSites);
    }
4

3 に答える 3

1
  1. "?"and を使用する代わりに、準備されたステートメントで使用しsqlite3_bind_text、 then を使用して文字列値をバインドする必要がstringWithFormatあり%@ます。このようにして、SQL リクエストでのSQL インジェクションやセキュリティの問題を防ぐことができます (たとえば、文字列に引用符やその他のものが含まれている場合)。

  2. あなたの問題については、「動かない」よりも正確にお願いします。エラーコードを返しますか? その場合、どのエラーコードを返しますか? OKステータスで返されますが、データベースが機能していませんか? 変数の型は何ですか? のような一時変数の値は何ですかquerySQL。コードにブレークポイントを設定して、何が起こっているかを確認しようとしましたか? などなど

于 2012-11-20T14:05:53.807 に答える
0

正確に機能していないもの。次のようなエラーメッセージを出力してみてください。

NSLog(@"%s",sqlite3_errmsg(ipadSites));

また、このような1行のリクエストには、sqlite3_exec()関数を使用できます。

sqlite3_exec(ipadSites, query_stmt, NULL,NULL, NULL);
于 2012-11-20T13:51:04.507 に答える
0

投稿したコードは、データベース ファイルへのパスを取得していることを示していますが、データベースを開くコードはありません。sqlite3_open_v2ステートメントの準備またはクエリの実行を試みる前に、 を呼び出す必要があります。

文字列形式を使用してクエリを作成することもお勧めできません。クエリは次のようになります。

const char *query_stmt = "UPDATE AssemblyAssessment SET countedunits = ? WHERE assemblyid = ?";

そのステートメントを準備し、適切なsqlite3_bind_xxxメソッドを使用して 2 つの値をクエリにバインドします。これははるかに安全なアプローチです。値の適切な引用とエスケープを処理します。

于 2012-11-20T15:39:33.433 に答える