C# 在一个事务下更新WinRT中的两个虚拟表
我正在Cordova框架下创建一个插件,目标是Win10(UWP),所以我的项目在WinRT中。我正在成功地使用SQLite3,我有SQLite.Net.Core-PCL和SQLite.Net-PCL(v3.1.1)的参考,并使用SQLite.UWP.2015版本3.13.0为我的Win10项目添加了SQLite3。 我必须使用虚拟表在给定的数据库上进行一些工作,但每当我想在一个事务中更新两个不同虚拟表中的某一行时,我的应用程序将在不引发任何异常的情况下退出,如果我不从VisualStudio2015运行它,我会得到以下结果: 我在fts3中找到了行:C# 在一个事务下更新WinRT中的两个虚拟表,c#,sqlite,transactions,windows-runtime,uwp,C#,Sqlite,Transactions,Windows Runtime,Uwp,我正在Cordova框架下创建一个插件,目标是Win10(UWP),所以我的项目在WinRT中。我正在成功地使用SQLite3,我有SQLite.Net.Core-PCL和SQLite.Net-PCL(v3.1.1)的参考,并使用SQLite.UWP.2015版本3.13.0为我的Win10项目添加了SQLite3。 我必须使用虚拟表在给定的数据库上进行一些工作,但每当我想在一个事务中更新两个不同虚拟表中的某一行时,我的应用程序将在不引发任何异常的情况下退出,如果我不从VisualStudio2
/*
**xSavepoint()方法。
**
**将挂起术语表的内容刷新到磁盘。
*/
静态int-fts3SavepointMethod(sqlite3_vtab*pVtab,int-iSavepoint){
int rc=SQLITE_OK;
未使用的_参数(iSavepoint);
assert(((Fts3Table*)pVtab)->inTransaction;
assert(((Fts3Table*)pVtab)->mxSavepointmxSavepoint=iSavepoint;
如果(((Fts3Table*)pVtab)->bIgnoreSavepoint==0){
rc=fts3SyncMethod(pVtab);
}
返回rc;
}
如果我在发布模式下运行,我不会得到这个错误,因为这个断言被排除在外,正如我看到的,行被成功修改,但在调试模式下,总是抛出我
我必须在一个事务中使用所有这些,因为如果其中一些事务失败,我必须回滚所有事务
你有什么想法,如何解决这个问题,或者为什么会发生这种情况
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);
}
}
/*
** 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;
}