在一次交易中更新WinRT中的两个虚拟表

时间:2016-07-08 14:29:28

标签: c# sqlite transactions windows-runtime uwp

我在Cordova框架下创建了一个针对Win10(UWP)的插件,所以我的项目是在WinRT中。我成功使用SQLite3,我有SQLite.Net.Core-PCL和SQLite.Net-PCL(v3.1.1)的参考,并使用SQLite.UWP.2015为我的Win10项目添加了SQLite3。版本3.13.0。 我必须在使用虚拟表的给定数据库上做一些工作,但每当我想在单个事务中更新来自2个不同虚拟表的某一行时,我的应用程序退出而不会抛出任何异常,这就是我得到的内容,如果我没有&#39 ;从VisualStudio2015运行它:

SQLite error

Assertion failed!
Program: ..\sqlite3.dll
File: tsrc/fts3.c
Line: 3772
Expression: assert( ((Fts3Table *)pVtab)->mxSavepoint < iSavepoint );

我测试了这个时候,我创建了一个简单的例子,创建了两个虚拟表,插入了一些数据,并且在下一个事务中我更新了这两个数据,第一个是好的,但是第二个让我退出申请。

        var path = Path.Combine(ApplicationData.Current.LocalFolder.Path, "test.db");
        using (SQLiteConnection conn = new SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), path))
        {
            try
            {
                conn.BeginTransaction();
                conn.Execute("CREATE VIRTUAL TABLE T1 USING fts4(ID,VALUE)");
                conn.Execute("CREATE VIRTUAL TABLE T2 USING fts4(ID,VALUE)");
                conn.Execute("INSERT INTO T1 VALUES ('1','VALUE')");
                conn.Execute("INSERT INTO T2 VALUES ('2','VALUE')");
                conn.Commit();

                conn.BeginTransaction();
                conn.Execute("UPDATE T1 SET  VALUE =  'value2'  WHERE  ID =  '1'"); //Everything is fine
                conn.Execute("UPDATE T2 SET  VALUE =  'value2'  WHERE  ID =  '2'"); //Fail
                conn.Commit();

            }
            catch (Exception ex)
            {
                Log.Error("Error occured while executing " + ex.Message);
            }
        }

我在fts3中找到了行: https://github.com/mackyle/sqlite/blob/master/ext/fts3/fts3.c

/*
** The xSavepoint() method.
**
** Flush the contents of the pending-terms table to disk.
*/
static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){
  int rc = SQLITE_OK;
  UNUSED_PARAMETER(iSavepoint);
  assert( ((Fts3Table *)pVtab)->inTransaction );
  assert( ((Fts3Table *)pVtab)->mxSavepoint < iSavepoint );
  TESTONLY( ((Fts3Table *)pVtab)->mxSavepoint = iSavepoint );
  if( ((Fts3Table *)pVtab)->bIgnoreSavepoint==0 ){
    rc = fts3SyncMethod(pVtab);
  }
  return rc;
}

如果我在发布模式下运行,我不会收到此错误,因为此断言从那里排除,正如我所见,行已成功修改,但在调试模式下,抛出我总是。

我必须在一个事务中使用所有这些,因为如果其中一些失败,我必须回滚所有内容。

你有什么想法,如何解决这个问题,或者为什么会这样?

0 个答案:

没有答案