SQLite транзакция сохранить Точка Проблема - PullRequest
0 голосов
/ 28 мая 2018

У меня странная ошибка в 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] в <8f2bb39aeff94a30a8628064be9c7efe>: 0 в SQLite.Net.SQLiteConnection.Release (System.String)0x00000] в <8f2bb39aeff94a30a8628064be9c7efe>: 0 в SQLite.Net.SQLiteConnection.RunInTransaction (действие System.Action) [0x0001d] в <8f2bb39aeff94a30a8628064be9c7efe.: 0.runInTransaction) [0x0001e] в <8f2bb39aeff94a30a8628064be9c7efe>: 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);
            }

1 Ответ

0 голосов
/ 28 мая 2018

.UpdateAll по умолчанию выполняется в собственной транзакции, вы можете отключить ее, переопределив второй параметр, который по умолчанию равен true:

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

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