c# - SQLite事务保存点问题

标签 c# sqlite xamarin xamarin.android cross-platform

我在使用事务的 SQLite 中遇到了一个奇怪的错误,我无法弄清楚...... 下面是我的代码:

_connection.RunInTransaction(() =>
                {
                    _connection.UpdateAll(objProposte);
                    foreach (Proposte objProposta in objProposte)
                    {
                        string propostaID = objProposta.PropostaID;
                        List<ProposteDetails> lstProdDet = _connection.Table<ProposteDetails>().Where(x => x.PropostaID == propostaID).ToList();

                        if (lstProdDet != null && lstProdDet.Count() > 0)
                        {
                            //AN UPDATE GIVE ME THE SAME ERROR
                            _connection.DeleteAll(lstProdDet);
                            _connection.InsertAll(lstProdDet);
                        }
                    }
                });

似乎 _connection.UpdateAll(objProposte);工作正常,但是当我尝试在同一事务中执行其他操作时,出现以下异常:

System.ArgumentException: savePoint is not valid, and should be the result of a call to SaveTransactionPoint. Parameter name: savePoint
at SQLite.Net.SQLiteConnection.DoSavePointExecute (System.String savePoint, System.String cmd) [0x00063] in <8f2bb39aeff94a30a8628064be9c7efe>:0 at SQLite.Net.SQLiteConnection.Release (System.String savepoint) [0x00000] in <8f2bb39aeff94a30a8628064be9c7efe>:0 at SQLite.Net.SQLiteConnection.RunInTransaction (System.Action action) [0x0001d] in <8f2bb39aeff94a30a8628064be9c7efe>:0 at SQLite.Net.SQLiteConnection.InsertAll (System.Collections.IEnumerable objects, System.Boolean runInTransaction) [0x0001e] in <8f2bb39aeff94a30a8628064be9c7efe>:0

在互联网上阅读似乎与嵌套事务有关,但不是我的情况,因为都是在同一个事务中完成的。

谢谢, L-

编辑 28-05-2018 12:16:该配置有效......但应该执行与上述相同的操作:(

string my_transaction_point = null;
            try
            {
                my_transaction_point = _connection.SaveTransactionPoint();
                    _connection.UpdateAll(objProposte, runInTransaction: false);
                    foreach (Proposte objProposta in objProposte)
                    {
                        string propostaID = objProposta.PropostaID;
                        List<ProposteDetails> lstProdDet = _connection.Table<ProposteDetails>().Where(x => x.PropostaID == propostaID).ToList();
                        if (lstProdDet != null && lstProdDet.Count() > 0)
                        {
                            _connection.DeleteAll(lstProdDet);
                            _connection.InsertAll(lstProdDet, runInTransaction: false);
                        }
                    }
                _connection.Commit();
            }
            catch (Exception ex)
            {
                _connection.RollbackTo(my_transaction_point);
                throw new Exception("UpdateProposta, " + ex.Message, ex);
            }

最佳答案

.UpdateAll 默认情况下在其自己的事务中运行,您可以通过覆盖默认为 true 的第二个参数来关闭它:

_connection.RunInTransaction(() =>
{
    _connection.UpdateAll(objProposte, false);

    // perform the rest of your CRUD operations
    ~~~
    ~~~
});

关于c# - SQLite事务保存点问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50562472/

相关文章:

c# - 什么是 sint32 类型

android - 三星更新后的错误 |单人游戏 |将 viewport.height 检测为设备宽度

c# - Xamarin NUnitLite 测试方法 : How to do shared tests that run in every platform?

c# - 在 c# 中将字符串转换为 xml 会出现空白错误

c# - 在具有特定值的字典中获取第一个 KeyValuePair

c# 使用热键启动事件?

c# - Xamarin ContentView/View 生命周期

android - 字段 _id 始终为 0

sqlite - 使用select花费太长时间检索SQLite数据

objective-c - 传递数据集