0

我正在使用 csharp-sqlite 库。

编码:

var conn = new SQLite.SQLiteConnection(DatabasePath);
conn.Execute("insert or replace into Option(Key, Value) values ('A', '1')");
conn.Execute("insert or replace into Option(Key, Value) values ('B', '2')");

它按我的预期工作。但是,当我使用 BeginTransaction() 和 Commit 时,在第二个 Excute 中出现异常:“CannotOpen”,本机是 SQLITE_CANTOPEN(错误 14)。

代码将是:

var conn = new SQLite.SQLiteConnection(DatabasePath);
try
{
  conn.BeginTransaction();
  conn.Execute("insert or replace into Option(Key, Value) values ('A', '1')");
  conn.Execute("insert or replace into Option(Key, Value) values ('B', '2')");
  conn.Commit();
}
catch (SQLiteException ex)
{
     _conn.Rollback();

}

我究竟做错了什么?

谢谢

4

3 回答 3

2

从我看到的示例中,虽然它们并非都使用 CSharp-Sqlite,但您应该像这样使用它:

using(var conn = new SQLite.SQLiteConnection(DatabasePath)) 
{
  conn.Open();
  using(var tr = conn.BeginTransaction())
  {
    try
    {
      using(var cmd = conn.CreateCommand())
      {
        cmd.Transaction = tr;
        cmd.CommandText = @"insert or replace into Option(Key, Value) 
                              values ('A', '1')";
        cmd.ExecuteNonQuery();
        cmd.CommandText = @"insert or replace into Option(Key, Value) 
                              values ('B', '2')";
        cmd.ExecuteNonQuery();
      }
      tr.Commit();
    }
    catch (SQLiteException ex)
    {
      tr.Rollback();
    }
  }
  conn.Close();
}

这是其中一个例子

于 2013-01-22T22:07:14.320 回答
2

我在 WinRT 上运行时遇到了这个问题。

这个编译指示解决了这个问题:

using(var connection = new SQLiteConnection(dbPath))
{
   connection.Execute(string.Format("PRAGMA temp_store_directory = '{0}';", Windows.Storage.ApplicationData.Current.TemporaryFolder.Path));
}

请参阅 http://sqlite.1065341.n5.nabble.com/Transaction-issues-with-WinRT-build-td63817.html

于 2013-02-06T21:30:21.553 回答
2

我认为您需要将 SQLite 用于 WinRT(而不是默认的 SQLite 包)和 sqlite-net 中的 SQLite 异步包装器。Windows 8 中的文件 IO 接口已更改,因此当本机 DLL 尝试使用它们时会出现异常。

有关如何使用异步包装器的演练,请参见此处:http: //blog.thomaslebrun.net/2012/10/windows-8-using-sqlite-in-your-windows-store-application/

于 2013-01-22T22:16:31.707 回答