2011-05-02 56 views
0

我有一個INSERT語句,後面跟着一個SQLITE3_EXEC,後面跟着一個SELECT語句和另一個SQLITE3_EXEC。我在SELECT語句的EXEC上得到了一個SQLERROR 21(SQLITE_MISUSE)。INSERT語句後需要什麼?

我錯過了兩個EXEC之間的東西嗎?像一個COMMIT,或?

21是否可能試圖插入已存在的記錄?

NSString *insertCommand = [NSString stringWithFormat:@"INSERT INTO CardData (CARD_ID, CARD_NAME, CODE_VAL) VALUES ('/%@', '/%@', '/%@')", 
           symbol.data, @"Test Card", symbol.typeName]; 

    sqlite3_exec(db, [insertCommand UTF8String], NULL, NULL, &errmsg); 
    if(errmsg != NULL) 
     NSLog(@"insert error: /%@", &errmsg); // DEBUGGING ONLY! 

    // now, pull it back out of the d/b and display the data 
    const char *sqlStatement = @"select CARD_ID, CARD_NAME, CODE_VAL from CardData"; 
    sqlite3_stmt *compiledStatement; 
    int err = sqlite3_prepare_v2(db, [sqlStatement UTF8String], -1, &compiledStatement, NULL); // Setup the SQL Statement and compile it for faster access 
if(err != SQLITE_OK) 
    NSLog(@"prepare error: /%@", err); 
    else { 
     // Loop through the results and add them to the feeds array 
     while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 

      // Read the data from the result row 
     resultText.text = [NSString stringWithFormat:@"\nDatabase: \n%@ \n%@ \n%@", resultText.text, 
      [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)], 
      [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)], 
      [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]]; 
     } 
    sqlite3_finalize(compiledStatement); // release it... 
    sqlite3_close(db); 
    } 
+0

你爲什麼不提供你正試圖執行的SQL語句? – 2011-05-02 17:00:49

+0

這裏是... http://monobin.com/__d215dc84d – SpokaneDude 2011-05-02 17:09:20

+1

夥計。在問題中發佈相關文字。 – Joe 2011-05-02 17:20:35

回答

0

我決定使用FMDB ...感謝大家的建議,我感謝你的時間。

1

根據documentation,(1.4錯誤Codes-> SQLITE_MISUSE)也說,如果你試圖從兩個不同的線程訪問關閉的數據庫或致電sqlite_exec用同一個數據庫的指針,你可以得到這個錯誤。在你的情況下檢查這2種可能性。

希望它有幫助。

+0

我不認爲這適用於我,但感謝信息無論如何。我正在考慮去CoreData或FMDB ......這太費時了! – SpokaneDude 2011-05-03 15:03:25