我在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运行它:
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;
}
如果我在发布模式下运行,我不会收到此错误,因为此断言从那里排除,正如我所见,行已成功修改,但在调试模式下,抛出我总是。
我必须在一个事务中使用所有这些,因为如果其中一些失败,我必须回滚所有内容。
你有什么想法,如何解决这个问题,或者为什么会这样?