c# .net sqlite ado.net system.data.sqlite

c# - Excepción bloqueada de la base de datos SQLite



.net ado.net (4)

Debe cerrar su DataReader antes de intentar escribir cualquier dato en la base de datos. Utilizar:

dr.Close();

después de que termine de usar el DataReader.

Estoy recibiendo la excepción de bloqueo de base de datos de SQLite solo para algunas consultas.

A continuación está mi código: cuando ejecuto cualquier declaración de selección funciona bien.
Cuando estoy ejecutando cualquier declaración de escritura en la Tabla de Jobs , también funciona bien.

Esto funciona bien:

ExecuteNonQuery("DELETE FROM Jobs WHERE id=1");

Pero de la misma manera, si estoy ejecutando consultas para la tabla de Employees estoy lanzando una excepción de que la base de datos está bloqueada .
Esto arroja una excepción:

ExecuteNonQuery("DELETE FROM Employees WHERE id=1");

A continuación están mis funciones:

public bool OpenConnection() { if (Con == null) { Con = new SQLiteConnection(ConnectionString); } if (Con.State == ConnectionState.Closed) { Con.Open(); //Cmd = new SQLiteCommand("PRAGMA FOREIGN_KEYS=ON", Con); //Cmd.ExecuteNonQuery(); //Cmd.Dispose(); //Cmd=null; return true; } if (IsConnectionBusy()) { Msg.Log(new Exception("Connection busy")); } return false; } public Boolean CloseConnection() { if (Con != null && Con.State == ConnectionState.Open) { if (Cmd != null) Cmd.Dispose(); Cmd = null; Con.Close(); return true; } return false; } public Boolean ExecuteNonQuery(string sql) { if (sql == null) return false; try { if (!OpenConnection()) return false; else { //Tx = Con.BeginTransaction(IsolationLevel.ReadCommitted); Cmd = new SQLiteCommand(sql, Con); Cmd.ExecuteNonQuery(); //Tx.Commit(); return true; } } catch (Exception exception) { //Tx.Rollback(); Msg.Log(exception); return false; } finally { CloseConnection(); } }

Esta es la excepción: en la línea 103: Cmd.ExecuteNonQuery();

Excepción encontrada: Tipo: System.Data.SQLite.SQLiteException Mensaje: la base de datos está bloqueada La base de datos está bloqueada Fuente: System.Data.SQLite

Stacktrace: en System.Data.SQLite.SQLite3.Step (SQLiteStatement stmt) en System.Data.SQLite.SQLiteDataReader.NextResult () en System.Data.SQLite.SQLiteDataReader..ctor (SQLiteCommand cmd, CommandBehavior behave) en System.Data .SQLite.SQLiteCommand.ExecuteReader (comportamiento CommandBehavior) en System.Data.SQLite.SQLiteCommand.ExecuteNonQuery () en TimeSheet6.DbOp.ExecuteNonQuery (String sql) en d: / Projects / C # Applications / Completed Projects / TimeSheet6 / TimeSheet6 / DbOp. cs: línea 103


En algún momento, se deja abierta una conexión. Deshágase de OpenConnection y CloseConnection y cambie ExecuteNonQuery a este:

using (SQLiteConnection c = new SQLiteConnection(ConnectionString)) { c.Open(); using (SQLiteCommand cmd = new SQLiteCommand(sql, c)) { cmd.ExecuteNonQuery(); } }

Además, cambia la forma en que lees los datos a esto:

using (SQLiteConnection c = new SQLiteConnection(ConnectionString)) { c.Open(); using (SQLiteCommand cmd = new SQLiteCommand(sql, c)) { using (SQLiteDataReader rdr = cmd.ExecuteReader()) { ... } } }

No intente administrar el agrupamiento de conexiones por su cuenta como lo hace aquí. En primer lugar, es mucho más complejo que lo que ha codificado, pero en segundo lugar, ya se maneja dentro del objeto SQLiteConnection . Finalmente, si no aprovecha el using , no está eliminando estos objetos correctamente y termina con problemas como los que está viendo ahora.


Puede usar la instrucción ''using'' como se muestra a continuación, que asegurará que la conexión y el comando se eliminen correctamente incluso en la excepción

private static void ExecuteNonQuery(string queryString) { using (var connection = new SQLiteConnection( ConnectionString)) { using (var command = new SQLiteCommand(queryString, connection)) { command.Connection.Open(); command.ExecuteNonQuery(); } } }


También estaba obteniendo el mismo error aquí:

if (new basics.HindiMessageBox(HMsg, HTitle).ShowDialog()==true) { SQLiteConnection m_dbConnection = new SQLiteConnection(MainWindow.con); m_dbConnection.Open(); sql = "DELETE FROM `users` WHERE `id`=" + SelectedUser.Id; command = new SQLiteCommand(sql, m_dbConnection); command.ExecuteNonQuery(); m_dbConnection.Close(); LoadUserDG(); }

pero cuando acabo de cambiar el lugar de decoloración SQLiteConnection

public partial class User : Window { SQLiteCommand command; string sql; AddUser AddUserObj; List<basics.users> usersList; basics.users SelectedUser; SQLiteConnection m_dbConnection; // ... private void DeleteBtn_Click(object sender, RoutedEventArgs e) { // ... if (new basics.HindiMessageBox(HMsg, HTitle).ShowDialog()==true) { m_dbConnection = new SQLiteConnection(MainWindow.con); m_dbConnection.Open(); sql = "DELETE FROM `users` WHERE `id`=" + SelectedUser.Id; command = new SQLiteCommand(sql, m_dbConnection); command.ExecuteNonQuery(); m_dbConnection.Close(); LoadUserDG(); } }

todo está bien ahora. Espero que también te funcione. si alguien puede decir cómo sucede esto, dígale que me gustaría saber para mejorar mi conocimiento.