Exception de verrouillage de la base de données SQLite

je suis la base de données est verrouillée exception de SQLite pour certaines requêtes.

ci-dessous est mon code: Quand j'exécute n'importe quelle instruction select cela fonctionne très bien.

Quand j'exécute n'importe quelle déclaration d'écriture sur Jobs Table il fonctionne aussi très bien.

Cela fonctionne très bien:

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

mais de la même façon si j'exécute des requêtes pour Employees tableau, il est en train de lancer une exception base de données est verrouillé.

Cela lève une Exception:

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

Voici mes fonctions:

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

C'est l'Exception: À la ligne 103:Cmd.ExecuteNonQuery();

Exception Trouvée: Type: System.Données.SQLite.SQLiteException Message: la base de données est verrouillée base de données est verrouillée Source: Système D'.Données.SQLite

Stacktrace: système at.Données.SQLite.SQLite3.Step (SQLiteStatement stmt)) à Système.Données.SQLite.SQLiteDataReader.NextResult() au Système.Données.SQLite.SQLiteDataReader..ctor (SQLiteCommand cmd, CommandBehavior behave) au Système.Données.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior comportement) au Système.Données.SQLite.SQLiteCommand.Exécutenonquery() at TimeSheet6.DbOp.ExecuteNonQuery(String sql) dans la d:ProjectsC# ApplicationsProjets AchevésTimeSheet6TimeSheet6DbOp.cs: ligne 103

35
demandé sur coding 2013-07-11 15:52:01

4 réponses

quelque part en cours de route, une connexion est laissée ouverte. Se débarrasser de OpenConnection et CloseConnection et changez ExecuteNonQuery à:

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

plus loin, changez la façon dont vous lire données:

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

N'essayez pas, gérer la mise en commun de la connexion par vous-même, comme vous êtes ici. Premièrement, c'est beaucoup plus complexe que ce que vous avez codé, mais deuxièmement, c'est déjà traité à l'intérieur du SQLiteConnection objet. Enfin, si vous n'êtes pas en tirant parti de using vous êtes pas d'élimination ces objets correctement et vous vous retrouvez avec des questions comme ce que vous voyez maintenant.

78
répondu Mike Perrenoud 2013-07-11 12:02:08

Vous pouvez utiliser l'instruction 'using' comme ci-dessous, qui fera en sorte que connection & command dispose correctement même dans exception

private static void ExecuteNonQuery(string queryString)
{
    using (var connection = new SQLiteConnection(
               ConnectionString))
    {
        using (var command = new SQLiteCommand(queryString, connection))
        {
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
    }
}
14
répondu Damith 2013-07-11 12:01:39

Vous devriez fermer votre DataReader avant d'essayer d'écrire des données dans la base de données. Utilisation:

dr.Close();

après avoir utilisé le lecteur de données.

0
répondu salman 2017-10-18 14:14:50

j'avais aussi la même erreur ici:

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

mais quand je viens de changer SQLiteConnection declearation place

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

tout va bien maintenant. espérons qu'il peut fonctionner pour vous aussi. si quelqu'un peut dire comment cela se passerait s'il vous plaît dites, je voudrais savoir pour améliorer mes connaissances.

0
répondu RAM DANE 2018-06-27 17:12:54