0

私のデータベースには「Projtable」というテーブル名があります。プロジェクト名には4つのフィールドが含まれています。1. projct id = autoincrement(主キー)2。projctname = varchar 3. projct_detail = varchar 4. order_id = int

これで、projctnameとprojct_detailの挿入が完全に機能します。orderidの列の最大値を見つける必要があります。どうすればこれを見つけることができますか?

私のコードは:

-(void)insertProject:(Project *)projobj
{
//    next_orderid = next_orderid + 1;
//    projobj.orderid = next_orderid;

    NSLog(@" insert:: %@, %@, %d", projobj.outcome, projobj.projctname, projobj.orderid);
     sqlite3 *database;
    if (sqlite3_open([self.databasePath UTF8String] , &database) == SQLITE_OK)
    {
        const char *sql = "INSERT INTO proj_table (projctname, outcome, orderid) VALUES (?,?,?)";
        sqlite3_stmt *statement;
        statement = [self PrepareStatement:sql];

        int a1 = sqlite3_bind_text(statement, 1, [projobj.projctname UTF8String], -1, SQLITE_TRANSIENT);
        int a2 =  sqlite3_bind_text(statement, 2, [projobj.outcome UTF8String], -1, SQLITE_TRANSIENT);
       int a3= sqlite3_column_int( statement, 3);
        NSLog(@" integer :== %d",a3);
       // int a3 = sqlite3_bind_int(statement, 3, projobj.orderid);
            if (statement)
        {
            if (a1 != SQLITE_OK || a2 != SQLITE_OK || a3 != SQLITE_OK)
            {
                sqlite3_finalize(statement);
                return;
            }
            sqlite3_step(statement);
        }
        sqlite3_finalize(statement);
    }
}

結果は0です

4

2 に答える 2

2

次のようなクエリを使用して、列の最大値を見つけます。

SELECT MAX(orderid) FROM proj_table;

ただし、列をINTEGER PRIMARY KEY( の場合CREATE TABLE) として作成する方がよいため、自動インクリメントされます (最後に挿入された ID は で使用できますsqlite3_last_insert_rowid)。

それでも最大値を使用する理由がある場合は、データベースを更新する他のプロセス/スレッドが存在しないことが確実にわかっている場合を除き、単一のトランザクションでSELECT MAX...以下を実行するようにしてください。INSERT

于 2013-02-04T07:08:42.227 に答える
1

SQL 選択ステートメントを使用する

Select max(orderid) from proj_table;

その後、integer+1 を次の値として使用できます。

于 2013-02-04T07:07:02.097 に答える