2010-10-01 32 views
0

這是我用來從我的數據庫中選擇一些記錄的代碼。我將兩個日期綁定到我的sql中,但是,當我到達sqlite3_step時,我得到了SQLITE_DONE,我應該獲得SQLITE_ROW。它看起來像處理綁定而不是查詢數據。iPhone,sqlite3,我如何將值傳遞給select語句?

我在做什麼錯?

NSString *startDateRangeString = @"2000-05-01"; 
NSString *endDateRangeString = @"2011-05-01"; 

sqlite3 *database; 
int result = sqlite3_open("mydb.db", &database); 
if(result != SQLITE_OK) 
{ 
    NSLog(@"Could not open db."); 
} 

const char *sql = "select pid from tmp where due >= '%@' and due < '%@' order by due, pid;"; 
sqlite3_stmt *statementTMP; 

int error_code = sqlite3_prepare_v2(database, sql, -1, &statementTMP, NULL); 
if(error_code == SQLITE_OK) { 

    sqlite3_bind_text(statementTMP, 1, [startDateRangeString UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(statementTMP, 2, [endDateRangeString UTF8String], -1, SQLITE_TRANSIENT); 

    int step_error_code = sqlite3_step(statementTMP); 

    while(sqlite3_step(statementTMP) == SQLITE_ROW) // I get 101 aka SQLITE_DONE 
    { 
     NSLog(@"Found!!"); 
    } 
} 
sqlite3_finalize(statementTMP); 
sqlite3_close(database); 

回答

1
char *statementTMP = "select pid from tmp where due >= '?1' and due < '?2' order by due, pid"; 
.... 
    sqlite3_bind_text(statementTMP, 1, [startDateRangeString UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(statementTMP, 2, [endDateRangeString UTF8String], -1, SQLITE_TRANSIENT); 
+0

這是正確的答案嗎? – Pavan 2010-10-01 13:28:09

+0

Pavan,我錯了嗎? – kovpas 2010-10-01 13:29:19

+1

這是正確的,因爲他修正了位置參數。 Grr,我的相似答案第一次來:) – 2010-10-01 13:30:17

3

我認爲你的SQL很糟糕。您應該使用「%@」而不是%@爲位置參數。

我強烈建議使用包裝來簡化生活。 FMDB是一個偉大的在http://github.com/ccgus/fmdb

0

這是設計。

sqlite3_step爲結果集中的每一行返回SQLITE_ROW,SQLITE_DONE指示沒有更多行。因此,如果結果集包含N行,則N個調用將返回SQLITE_ROW,並且(N + 1)st返回SQLITE_DONE。一個空的結果集不是特別的,它遵循與N = 0相同的邏輯(所以第一次調用返回SQLITE_DONE)。這允許客戶端代碼統一處理所有結果集。

希望有所幫助。

讓我知道你是否需要任何幫助。

PK

-1

如果我正確讀取。您不執行..你只是準備語句..你必須做兩..

這部分剛準備查詢

if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) != SQLITE_OK) 
{ 
      NSLog(@"SQL Warning: failed to prepare statement 
with message '%s'.", sqlite3_errmsg(database)); 
} 

這部分實際上執行該查詢

if(sqlite3_exec(database, sql, nil, &stmt, &errmsg) == SQLITE_OK) 
{ 
     NSLog(@"it means that you query executed correctly"); 
     if(sqlite3_step(stmt) == SQLITE_ROW) 
     { 
      NSLog(@"Found!!"); 
     } 
}else 
{ 
     NSLog(@"SQL Warning: '%s'.", sqlite3_errmsg(database)); 
} 

=)

相關問題