首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将数据库变量传递给Rust中的函数?

如何将数据库变量传递给Rust中的函数?
EN

Stack Overflow用户
提问于 2013-10-22 06:24:08
回答 1查看 516关注 0票数 1

我才刚开始看铁锈。我想用一个数据库进行实验,并发现了sqlite,这是一个很好的实验。

我想知道将sqlite数据库变量传递给函数的“正确”方法。我最初从编译器获得的错误消息似乎表明,当我将Db变量从main()传递给函数时,它消失了,所以我返回了它。虽然这似乎是可行的,但在我看来,这并不是正常的方式。虽然我并不相信大量的全局变量,但我试图创建一个全局变量,但我无法发现如何做到这一点。

下面是测试程序。请注意,我还没有使用铁锈命名约定,但这是非常早期的。

有关的主要方针是:

代码语言:javascript
复制
oDb1 = fCreateTable(oDb1);
fn fCreateTable(oDb1:sqlite::database::Database) -> sqlite::database::Database  {

还有什么可供选择的,为什么(在这种情况下)返回它是必要的?

示例程序:

代码语言:javascript
复制
extern mod sqlite;

fn main() {
  let mut oDb1:sqlite::database::Database;
  oDb1  = fOpenDb();        
  oDb1 = fCreateTable(oDb1) ;

  let mut iInsertTot: int = 0;
  while iInsertTot < 25 {
    let oDbExec = oDb1.exec("INSERT INTO test (sname, iborn) VALUES ('xxxxx', 1973)");
    if (! oDbExec.is_ok()) {
      fail!(fmt!("Insert Nr. %d Failed!", iInsertTot+1));
    }
    iInsertTot += 1;
  } 
  println (fmt!("Inserts completed = %d", iInsertTot));
}

fn fOpenDb() -> sqlite::database::Database {
  let oDbOpen = sqlite::open("test.db");
  if oDbOpen.is_err() {
    fail!(fmt!("Error opening test.db: %?", oDbOpen));
  }
  println(fmt!("Database Open OK? %?", oDbOpen.is_ok()));
  oDbOpen.unwrap()
}

fn fCreateTable(oDb1:sqlite::database::Database) -> sqlite::database::Database  {
  let mut oDbExec = oDb1.exec("drop table if exists test");
  println(fmt!("Drop Table OK? %?", oDbExec.is_ok()));  
  if (!oDbExec.is_ok()) {
    fail!("Drop-table failed");
  } 
  oDbExec = oDb1.exec("CREATE TABLE test (ikey INTEGER PRIMARY KEY not null,
            sname text, iborn int)");
  println(fmt!("Create OK? %?", oDbExec.is_ok()));
  if !oDbExec.is_ok() {
    fail!("Create Table failed");
  }
  oDb1
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-22 20:55:35

sqlite::database::Database实现了Drop,这意味着它有一个析构函数,意味着它永远不会被复制和移动:fCreateTable(oDb1)将数据库对象从oDb1中移出:现在oDb1中什么都没有了!当然,你可以把东西放回去。例如,当您从fCreateTable返回数据库时,再次移回fCreateTable

但这是个愚蠢的舞蹈。首先,不要移动数据库,借用一个指向它的指针:

代码语言:javascript
复制
fn main() {
    let oDb1 = fOpenDb();
    fCreateTable(&oDb1);
    ...
}

fn fCreateTable(oDb1: &sqlite::database::Database) {
    ...
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19510454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档