Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLite transaction save Point Issue

i've a strange error in SQLite using a transaction, that i cannot figured out.... below there is my code:

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

Seems that the _connection.UpdateAll(objProposte); works correctly, but when i try to do something else in the same transaction i got the following exception:

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

Reading on the internet seems something related to a nested transaction, but is not my situation because is all done in the same transaction.

Thanks, L-

edit 28-05-2018 12:16: That configuration works.... but should do the same things of the above :(

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);
            }
like image 375
Legion Avatar asked Aug 28 '26 16:08

Legion


1 Answers

.UpdateAll runs within its own transaction by default, you can turn that off by overriding the second parameter which defaults to true:

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

    // perform the rest of your CRUD operations
    ~~~
    ~~~
});
like image 76
SushiHangover Avatar answered Aug 31 '26 06:08

SushiHangover



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!