Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dh-00

[VB.net] - Problema com sqlite e múltiplas transações

Recommended Posts

Estou migrando um projeto, que utiliza access para o sqlite. Todo o projeto foi feito com conexao oledb. O problema que tenho agora com o sqllite, mas que funciona perfeitamente era com transações multiplas no banco de dados. Abaixo tem o codigo que estou usando, o banco retorna um erro de db locked ao executar o segundo comando no banco, e não estou conseguindo arrumar.

 

'metodo que realiza a alteração na base de dados

        If (txt_nome.Text <> "" And txt_endereco.Text <> "") Then

            Dim d As DialogResult = MsgBox("Confirma a atualização do cadastro da escola?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Aviso!")

            Dim trans As SQLite.SQLiteTransaction = Nothing

            If d.ToString = "Yes" Then

                Try

                    'Parametros de conexao
                    Dim v_obj_conn = New Conexao()
                    conn = v_obj_conn.Inicia_conexao

                    conn.Open()

                    'cria a transação
                    trans = conn.BeginTransaction(IsolationLevel.ReadCommitted)

                    'descobre o novo sequencial

                    'comando SQL
                    v_sql = "select max(seq)+1 as seq from cad_escola_versao where id_escola=@id_escola"

                    Dim sql_cod = New SQLite.SQLiteCommand(v_sql, conn, trans)

                    With sql_cod.Parameters
                        .Add(New SQLite.SQLiteParameter("@id_escola", txt_codigo.Text.Trim()))
                    End With

                    Dim dr As Sqlite.SQLiteDataReader = sql_cod.ExecuteReader
                    dr.Read()
                    Dim v_new_seq = dr("seq")

                    v_sql = Nothing

                    'grava o registro na tabela de versao para historico
                    Util.Grava_versao_cad_escola(conn, _
                                                 txt_codigo.Text.Trim(), _
                                                 v_new_seq, _
                                                 txt_nome.Text.Trim(), _
                                                 Util.Retirar_mascara(txt_cnpj.Text.Trim()), _
                                                 txt_endereco.Text.Trim(), _
                                                 txt_cidade.Text.Trim(), _
                                                 Util.Retirar_mascara(txt_cep.Text.Trim()), _
                                                 cmb_uf.Text.Trim(), _
                                                 Util.Retirar_mascara(txt_tel1.Text.Trim()), _
                                                 Util.Retirar_mascara(txt_tel2.Text.Trim()), _
                                                 Util.Retirar_mascara(txt_fax.Text.Trim()), _
                                                 txt_email.Text.Trim(), _
                                                 Frm_principal.lbl_usuario.Text.Trim, _
                                                 trans)

                    'realiza o update

                    v_sql = "update cad_escola set  seq=@seq," & _
                                                  " razao_social=@razao_social," & _
                                                  " cnpj=@cnpj," & _
                                                  " endereco=@endereco," & _
                                                  " cidade=@cidade," & _
                                                  " cep=@cep," & _
                                                  " uf=@uf," & _
                                                  " tel_1=@tel_1," & _
                                                  " tel_2=@tel_2," & _
                                                  " fax=@fax," & _
                                                  " email=@email," & _
                                                  " usuario_criacao=@usuario_criacao," & _
                                                  " data_criacao=Now()" & _
                            " where id_escola=@id_escola"

                    Dim sql = New SQLite.SQLiteCommand(v_sql, conn, trans)

                    'monta os paremtros
                    With sql.Parameters
                        .Add(New SQLite.SQLiteParameter("@seq", v_new_seq))
                        .Add(New SQLite.SQLiteParameter("@razao_social", txt_nome.Text.Trim()))
                        .Add(New SQLite.SQLiteParameter("@cnpj", Util.Retirar_mascara(txt_cnpj.Text.Trim())))
                        .Add(New SQLite.SQLiteParameter("@endereco", txt_endereco.Text.Trim()))
                        .Add(New SQLite.SQLiteParameter("@cidade", txt_cidade.Text.Trim()))
                        .Add(New SQLite.SQLiteParameter("@cep", Util.Retirar_mascara(txt_cep.Text.Trim())))
                        .Add(New SQLite.SQLiteParameter("@uf", cmb_uf.Text.Trim()))
                        .Add(New SQLite.SQLiteParameter("@tel_1", Util.Retirar_mascara(txt_tel1.Text.Trim())))
                        .Add(New SQLite.SQLiteParameter("@tel_2", Util.Retirar_mascara(txt_tel2.Text.Trim())))
                        .Add(New SQLite.SQLiteParameter("@fax", Util.Retirar_mascara(txt_fax.Text.Trim())))
                        .Add(New SQLite.SQLiteParameter("@email", txt_email.Text.Trim()))
                        .Add(New SQLite.SQLiteParameter("@usuario_criacao", Frm_principal.lbl_usuario.Text.Trim))
                        .Add(New SQLite.SQLiteParameter("@id_escola", txt_codigo.Text))
                    End With

                    'Executa o comando SQL

                    sql.ExecuteNonQuery()

                    sql.Dispose()

                    trans.Commit()

                    MsgBox("Atualização de cadastro de escola efetuado com sucesso!", MsgBoxStyle.Information, "Aviso!")

                    Limpa_campos()
                    cmd_cadastrar.Enabled = True
                    cmd_atualizar.Enabled = False

                Catch ex As Exception
                    MsgBox("Houve um erro durante a atualização do cadastro!" + Chr(13) + ex.Message, MsgBoxStyle.Critical, "Aviso!")
                    trans.Rollback()
                Finally
                    If (conn.State = ConnectionState.Open) Then
                        conn.Close()

                    End If
                End Try
            End If
        Else
            MsgBox("Para atualizar o cadastro é obrigatório o preenchimento do nome e endereço!", MsgBoxStyle.Information, "Aviso!")
        End If

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

DB Locked é quando você executa muitas transações ao mesmo tempo e o DB não consegue segurar todas elas. Isso é problema de configuração de banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

DB Locked é quando você executa muitas transações ao mesmo tempo e o DB não consegue segurar todas elas. Isso é problema de configuração de banco.

 

KhaosDoctor, mas como realizo essa configuração? Lembrando que estou usando o modelo IsolationLevel.ReadCommitted, para não ter problema na leitura dos dados.

 

O que acontece, é que dou um insert em uma tabela de historico, e depois um update. na hora do update ocorre o erro, e o rollback é executado.

 

valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.