【问题标题】:SQLite transaction save Point IssueSQLite 事务保存点问题
【发布时间】:2018-11-06 19:36:55
【问题描述】:

我在使用事务的 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 无效,应该是 调用 SaveTransactionPoint 的结果。参数名称:savePoint
在 SQLite.Net.SQLiteConnection.DoSavePointExecute (System.String savePoint, System.String cmd) [0x00063] 在 :0 在 SQLite.Net.SQLiteConnection.Release(System.String 保存点) [0x00000] 在 :0 处 SQLite.Net.SQLiteConnection.RunInTransaction(System.Action 动作) [0x0001d] 在 :0 中 SQLite.Net.SQLiteConnection.InsertAll (System.Collections.IEnumerable 对象,System.Boolean runInTransaction) [0x0001e] 在 :0

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

谢谢, L-

edit 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);
            }

【问题讨论】:

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


    【解决方案1】:

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

    _connection.RunInTransaction(() =>
    {
        _connection.UpdateAll(objProposte, false);
    
        // perform the rest of your CRUD operations
        ~~~
        ~~~
    });
    

    【讨论】:

    • 在所有 updateall/insertall/deleteall 中使用“false”到 trasaction 我得到了同样的错误:(
    • edit在deleteall的意思不同,但不是那个问题。
    • @Legion .DeleteAllTableMapping 作为其唯一参数...(如果您使用它的通用版本,则没有参数)。你用的是什么 SQLite 包?
    • 哦,对不起,我正在使用那个 NugetPackage -> github.com/oysteinkrog/SQLite.Net-PCL ,这是我从以前的开发人员那里收到的东西,所以更改它为时已晚。
    • @Legion 很高兴听到这个消息。
    猜你喜欢
    • 2011-06-19
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多