1

我刚刚开始评估 Rust。使用 Rust 和 Github 上的 sqlite3 存储库,我试图确定光标的 EOF。我不确定如何“正确”地做到这一点,我认为这可能是通过“匹配”语句。

以下 2 行中的第 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;
}
4

1 回答 1

1

我不知道目前是否有正确的方法,但您也可以从 types 模块中获取结果代码:

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 是 NULL 指针,sqlite3_data_count(P) 例程也返回 0。如果先前对 sqlite3_step(P) 的调用返回 SQLITE_DONE,则 sqlite3_data_count(P) 例程返回 0。如果先前对 sqlite3_step(P) 的调用返回 SQLITE_ROW,则 sqlite3_data_count(P) 将返回非零值,但在 PRAGMA incremental_vacuum 的情况下,它始终返回零,因为该多步 pragma 的每个步骤都返回 0 列数据。

正如自述文件中提到的那样,rustsqlite 接口尚未最终确定,请注意更改。

于 2013-10-24T00:29:54.747 回答