2013-10-23 48 views
1

我剛開始評估Rust。在Github上使用Rust和sqlite3回購,我試圖確定一個Cursor的EOF。我不知道如何做到「正確」,我想這可能是通過「匹配」聲明。如何使用sqlite3選擇Rust中的遊標末尾?

在下列2行第二行是我當前如何確定EOF,但是這顯然不是「正確」的方式:

let oNextResult:sqlite::types::ResultCode = oDbCursor.step(); 
tDone = (fmt!("%?", oNextResult) == ~"SQLITE_DONE"); 

以下是包含2行以上的未完成的功能。請原諒缺乏Rust命名約定,但我會考慮實現這一點。

/******************** 
**** Update Data **** 
*********************/ 
fn fUpdateData(oDb1:&sqlite::database::Database, iUpdateMax:int) -> bool { 
    println(fmt!("Updating %d Rows .......", iUpdateMax)); 

    let sSql:~str = fmt!("Select ikey, sname, iborn, dbal from test LIMIT %d", 
         iUpdateMax);  

    let oDbExec = oDb1.exec(sSql); 
    if oDbExec.is_err() { 
    println(fmt!("Select Failed! : %?, sql=%s", oDbExec, sSql)); 
    return false; 
    } 

    println("Select succeeded. Processing select list ....."); 
    let mut iUpdateCount: int = 0; 
    let oDbCursor:sqlite::cursor::Cursor = oDb1.prepare(sSql, &None).unwrap(); 
    let mut tDone:bool = false; 
    while !tDone { 
    let oNextResult:sqlite::types::ResultCode = oDbCursor.step(); 
    tDone = (fmt!("%?", oNextResult) == ~"SQLITE_DONE"); 
    if !tDone { 
     let sKey = oDbCursor.get_text(0); 
     let sName = oDbCursor.get_text(1); 
     let sBorn = oDbCursor.get_text(2); 
     let sBal = oDbCursor.get_text(3); 
     println(fmt!("skey = %s, sname = %s, sBorn = %s, sBal = %s", sKey, 
        sName, sBorn, sBal)); 
     iUpdateCount += 1; 
    } 
    } 
    println(fmt!("Update succeeded, items updated = %d", iUpdateCount)); 
    return true; 
} 

回答

1

我不知道是否有在目前以正確的方式,但你也可以從類型模塊的結果代碼:

use sqlite::types::ResultCode; 

,然後做這樣的事情,所以沒有必要爲了使用fmt!

while cursor.step() == SQLITE_ROW {...} 

或該:

while cursor.get_column_count() != 0 {...; cursor.step()} 

功能get_column_count返回int。如果沒有數據則返回0,它調用int sqlite3_data_count(sqlite3_stmt *pStmt);引擎蓋下和這裏就是sqlite的文件說一下吧:

的sqlite3_data_count(P)接口返回 列數的結果集的當前行準備好的語句P.如果準備好 語句P沒有準備好返回的結果(通過調用接口的sqlite3_column _ *()調用 ),則sqlite3_data_count(P)將返回 0.如果P中的sqlite3_data_count(P)例程也返回0是一個NULL指針。如果前面調用sqlite3_step(P)的 返回SQLITE_DONE,則sqlite3_data_count(P)例程返回0。該 sqlite3_data_count(P)將返回非零值,如果到 sqlite3_step(P)之前的調用返回SQLITE_ROW,除了在PRAGMA incremental_vacuum它總是返回零,因爲的 每一步,多步編譯返回0列的情況下,數據的。

正如自述文件中提到的,rustsqlite接口沒有完成,請留意更改。

+1

非常感謝。我希望有一個優雅的解決方案,因爲我討厭使用「break」。 - 我知道別人不同意。我必須對你的解決方案做一些小的修改,如下所示:「while(oDbCursor.step()== sqlite :: types :: SQLITE_ROW){」。如果這是正確的,你可能想編輯你的答案。順便說一句,我還沒有在生產中使用回購,我準備進行改變。 –

+0

已將SQLITE_OK更改爲SQLITE_ROW。 –

相關問題