代码之家  ›  专栏  ›  技术社区  ›  Legion

SQLite事务保存点问题

  •  1
  • Legion  · 技术社区  · 6 年前

    我在使用事务的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:保存点无效,应为 调用SaveTransactionPoint的结果。参数名称:保存点
    在sqlite.net.sqliteconnection.dosavepointexecute(system.string savepoint,system.string cmd)[0x00063]输入 sqlite.net.sqliteConnection.release(system.string保存点) [0x0000]输入<8f2bb39aeff94a30a8628064be9c7efe>:0 sqlite.net.sqliteConnection.runInTransaction(system.action操作) [0x0001d]输入<8f2bb39aeff94a30a8628064be9c7efe>:0,位于 sqlite.net.sqliteConnection.InsertAll(System.Collections.IEnumerable 对象,system.boolean runintransaction)[0x0001e]in <8f2bb39aeff94a30a8628064be9c7efe>:0

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

    谢谢, L -

    编辑 2018年5月28日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);
                }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   SushiHangover    6 年前

    .UpdateAll 默认情况下在自己的事务中运行,可以通过重写第二个默认为 true :

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