System.Data.SQLite

Login
This project makes use of Eagle, provided by Mistachkin Systems.
Eagle: Secure Software Automation
Ticket Hash: 376beb269db1a8aa10de6a26f09f4c4b416dbab0
Title: code produces error "database is locked"
Status: Closed Type: Incident
Severity: Important Priority: Medium
Subsystem: Transaction Resolution: Works_As_Designed
Last Modified: 2014-06-22 19:13:10
Version Found In: 1.0.92.0
User Comments:
anonymous added on 2014-06-22 06:06:14:
I've a form that put some values into a database. The database was previously populated with data. The thing is that the insertion works only the first time. From the second and onwards the code produces a "database is locked" error. Don't know if my fault (not great coder) or a bug.

The offending code is this:
Using objConexion As New SQLiteConnection
                objConexion.ConnectionString = cadena_conexion
                objConexion.Open()
                Using objComando As SQLiteCommand = objConexion.CreateCommand
                    Using trans As SQLiteTransaction = objConexion.BeginTransaction
                        objComando.CommandText = "INSERT INTO clientes " & _
                                              "(ID_cliente, STR_nombre, IT_RUT, STR_direccion, IT_fecha_nacimiento, ID_region, ID_comuna, IT_fono_fijo, " & _
                                              "IT_fono_movil, IT_email, ID_captador, IT_fecha_ingreso, IT_fecha_instalacion, IT_fecha_contrato, IT_obs) " & _
                                         "VALUES " & _
                                              "( NULL , @cliente, @rut, @direccion, @fecha_nac, @id_reg, @id_com, @tel_fijo_1, " & _
                                              "@tel_cel_1, @email_1, @capt, @fecha_ingreso, @fecha_inst, @fecha_cont, @obs)"
                        'hora de llenar los parametros
                        objComando.Parameters.AddWithValue("@cliente", cliente)
                        objComando.Parameters.AddWithValue("@rut", rut)
                        objComando.Parameters.AddWithValue("@direccion", direccion)
                        objComando.Parameters.AddWithValue("@fecha_nac", f_nac)
                        objComando.Parameters.AddWithValue("@id_reg", region)
                        objComando.Parameters.AddWithValue("@id_com", comuna)
                        objComando.Parameters.AddWithValue("@tel_fijo_1", tel_fijo)
                        objComando.Parameters.AddWithValue("@tel_cel_1", tel_cel)
                        objComando.Parameters.AddWithValue("@email_1", email)
                        objComando.Parameters.AddWithValue("@capt", captador)
                        objComando.Parameters.AddWithValue("@fecha_ingreso", f_ing)
                        objComando.Parameters.AddWithValue("@fecha_inst", f_ins)
                        objComando.Parameters.AddWithValue("@fecha_cont", f_cto)
                        objComando.Parameters.AddWithValue("@obs", obs)
                        objComando.ExecuteNonQuery()
                        trans.Commit()
                    End Using
                End Using
            End Using

and the exception is thrown in the "trans.Commit()" line. and a file "aguas.db-journal" is written to disk. The program is freeze about 1 minute and the exception is thrown

I'm uploading a reduced version of the project (Visual Basic .net, on visual studio 2013). This produces the exception on my windows 8.1 machine and my windows 7 notebook. Fair Warning: The code is horrible, i'm vb beginner and self-taught. The source file is in clientes.vb, and the database is aguas.db. i tried to modify the form to be self-explanatory  then just press the button, will call another form, fill it (where it says RUN, insert 4 or 5 zeros), and press "ingresar cliente" button. The first time will work, the next won't.

file is around 21 mb. hosted in mega (if this is a problem, i can upload somewhere else, but where?)

https://mega.co.nz/#!kMAwlY6J!rf_NxtqhvjLFZwvY1QLLxnUtQBbXaLuYmoVAgDu_pWA

mistachkin added on 2014-06-22 15:46:12:
After creating a command, you need to set the Transaction property (when you are
using transactions), e.g.:

Using objConexion As New SQLiteConnection
    objConexion.ConnectionString = cadena_conexion
    objConexion.Open()
    Using objComando As SQLiteCommand = objConexion.CreateCommand
        Using trans As SQLiteTransaction = objConexion.BeginTransaction
            objComando.Transaction = trans ' NOTE: This is new.
            objComando.CommandText = "INSERT INTO clientes " & _
                                  "(ID_cliente, STR_nombre, IT_RUT, STR_direccion, IT_fecha_nacimiento, ID_region, ID_comuna, IT_fono_fijo, " & _
                                  "IT_fono_movil, IT_email, ID_captador, IT_fecha_ingreso, IT_fecha_instalacion, IT_fecha_contrato, IT_obs) " & _
                             "VALUES " & _
                                  "( NULL , @cliente, @rut, @direccion, @fecha_nac, @id_reg, @id_com, @tel_fijo_1, " & _
                                  "@tel_cel_1, @email_1, @capt, @fecha_ingreso, @fecha_inst, @fecha_cont, @obs)"
            'hora de llenar los parametros
            objComando.Parameters.AddWithValue("@cliente", cliente)
            objComando.Parameters.AddWithValue("@rut", rut)
            objComando.Parameters.AddWithValue("@direccion", direccion)
            objComando.Parameters.AddWithValue("@fecha_nac", f_nac)
            objComando.Parameters.AddWithValue("@id_reg", region)
            objComando.Parameters.AddWithValue("@id_com", comuna)
            objComando.Parameters.AddWithValue("@tel_fijo_1", tel_fijo)
            objComando.Parameters.AddWithValue("@tel_cel_1", tel_cel)
            objComando.Parameters.AddWithValue("@email_1", email)
            objComando.Parameters.AddWithValue("@capt", captador)
            objComando.Parameters.AddWithValue("@fecha_ingreso", f_ing)
            objComando.Parameters.AddWithValue("@fecha_inst", f_ins)
            objComando.Parameters.AddWithValue("@fecha_cont", f_cto)
            objComando.Parameters.AddWithValue("@obs", obs)
            objComando.ExecuteNonQuery()
            trans.Commit()
        End Using
    End Using
End Using

anonymous added on 2014-06-22 19:13:10:
Still doesn't work. Produces the same error. Changed the code to include the line you indicated in each transaction, in all transactions of the file. Doesn't work.

A workaround i found half hour ago is not to use any prepared sentence nor transactions when dealing with INSERTs. 

That is i just insert the data the direct way:

objComando.CommandText = "INSERT INTO clientes (ID_cliente, ... , IT_obs) VALUES ( NULL , " & string_var_cliente & " ... " & "string_var_obs)"

and removing all the prepared sentenced and the transaction seems to work just fine. This on both machines.

Since you closed this, i think i'm just use unprepared and not enclosed in any transactions sentences. seems to work just fine.