none
c# SQLITE database is locked hatası RRS feed

  • Soru

  • c# ve sqlite ile bir otomasyon uygulaması geliştiriyorum. veritabanından projeme veri çekebiliyorum ama ekleme yaptığım zaman "Database is locked" hatası alıyorum. 3 gündür internetteki bütün forumları dolaştım her çözümü denedim ama bir türlü ekleme ve güncelleme işlemini yapamadım. projemdeki bütün bağlantılar kapalı hepsini tek tek kontrol ettim hatta projeyi sıfırdan tekrar yazdım ama sorunu hala çözemedim.

    örnek kod:

    SQLiteConnection acentaekle = new SQLiteConnection("Data Source=db.db; version=3");
            private void metroButton1_Click(object sender, EventArgs e)
            {
                SQLiteCommand cmd = new SQLiteCommand("INSERT INTO acenta(acenta_adi,acenta_adres,acenta_numara,acenta_vergiDaire,acenta_vergiNo,acenta_fax,acenta_mail) VALUES(@acenta_adi,@acenta_adres,@acenta_numara,@acenta_vergiDaire,@acenta_vergiNo,@acenta_fax,@acenta_mail)", acentaekle);
                //SQLiteCommand cmd = new SQLiteCommand("UPDATE acenta set acenta_adi=@acenta_adi, acenta_adres=@acenta_adres, acenta_numara=@acenta_numara, acenta_vergiDaire=@acenta_vergiDaire, acenta_vergiNo=@acenta_vergiNo, acenta_fax=@acenta_fax,acenta_mail=@acenta_mail where acenta_adi='"+isim_txt.Text+"'",bag);
                cmd.Parameters.AddWithValue("@acenta_adi", isim_txt.Text);
                cmd.Parameters.AddWithValue("@acenta_adres", adres_txt.Text);
                cmd.Parameters.AddWithValue("@acenta_numara", telefon_txt.Text);
                cmd.Parameters.AddWithValue("@acenta_vergiDaire", vergiDaire_txt.Text);
                cmd.Parameters.AddWithValue("@acenta_vergiNo", vergiNo_txt.Text);
                cmd.Parameters.AddWithValue("@acenta_fax", fax_txt.Text);
                cmd.Parameters.AddWithValue("@acenta_mail", mail_txt.Text);
                acentaekle.Open();
                cmd.ExecuteNonQuery();
                acentaekle.Close();
              }

    ----------------------------------------------------------------------------------------------------------------------------------------

    veritabanına bağlanmayı using ile de denedim ama öyle de olmadı.

    22 Kasım 2017 Çarşamba 14:25

Yanıtlar

  • SQLite kullanırken yanda database manager'da açık, ara sıra veri ekleme sırasında tıkanıklık oluyor, database manager'ı kapatınca sorun çözülüyor veya birçok class'dan veri eklemeye çalışınca da dar boğaz yapıp yine lock oluyor. Ayrıca try cath içinde kullanıyorsan finally bloğunda mutlaka bağlantıyı kapatman gerekir ve using içinde executereader'ı kullanırsan memory leak'lardan kaçınmış olursun.

    Aşağıdaki örnekte veri okurken open async,  execute nonquery async kullandığımı görebilirsin, sadece veri tabanına çok fazla erişim değil belkide thread/task'da da dar boğaz olabilir, dolaylı olarak performansa etki ediyor, gecikmeler, yığılmalar falan.

                            await sqlitecon.OpenAsync();
                            SQLiteCommand sqlitecom = new SQLiteCommand("SELECT * FROM queues", sqlitecon);
                            await sqlitecom.ExecuteNonQueryAsync();
    
                            using (SQLiteDataReader rdr = sqlitecom.ExecuteReader())
                            {
                                // if has rows, reading and setting parameters
                                if (rdr.HasRows)
                                {
                                    while (await rdr.ReadAsync())
                                    {
                                        UpdateList.Add(new UpdateList()
                                        {
                                            id = rdr["id"].ToString(),
                                            appid = rdr["appid"].ToString(),
                                            appkey = rdr["appkey"].ToString(),
                                            applicense = rdr["applicense"].ToString(),
                                            appexepath = rdr["appexepath"].ToString(),
                                            userid = rdr["userid"].ToString(),
                                            usertoken = rdr["usertoken"].ToString(),
                                            checkurl = await CreateCheckURL(rdr["appid"].ToString()),
                                            updatestatus = await UpdateCheck(await CreateCheckURL(rdr["appid"].ToString())),
                                            jsonsource = JsonSource
                                        });
    
                                        await Task.Delay(500);
                                    }
                                }
                            }
                            sqlitecon.Close();

    DataAdapter, DataSet ve DataTable Kavramları Nedir? diye küçük bir yazım var, datatable, data set ve dataadapter üzerinde çalışırsan bu dar boğazların önüne bir nebze geçersin.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...



    23 Kasım 2017 Perşembe 17:01

Tüm Yanıtlar

  • Merhaba, sistem ile ilgili bir durum olabilir SQLite veritabanı dosyanızın kullanıcı izinlerini kontrol etmenizi öneririm.

    22 Kasım 2017 Çarşamba 21:47
  • SQLite kullanırken yanda database manager'da açık, ara sıra veri ekleme sırasında tıkanıklık oluyor, database manager'ı kapatınca sorun çözülüyor veya birçok class'dan veri eklemeye çalışınca da dar boğaz yapıp yine lock oluyor. Ayrıca try cath içinde kullanıyorsan finally bloğunda mutlaka bağlantıyı kapatman gerekir ve using içinde executereader'ı kullanırsan memory leak'lardan kaçınmış olursun.

    Aşağıdaki örnekte veri okurken open async,  execute nonquery async kullandığımı görebilirsin, sadece veri tabanına çok fazla erişim değil belkide thread/task'da da dar boğaz olabilir, dolaylı olarak performansa etki ediyor, gecikmeler, yığılmalar falan.

                            await sqlitecon.OpenAsync();
                            SQLiteCommand sqlitecom = new SQLiteCommand("SELECT * FROM queues", sqlitecon);
                            await sqlitecom.ExecuteNonQueryAsync();
    
                            using (SQLiteDataReader rdr = sqlitecom.ExecuteReader())
                            {
                                // if has rows, reading and setting parameters
                                if (rdr.HasRows)
                                {
                                    while (await rdr.ReadAsync())
                                    {
                                        UpdateList.Add(new UpdateList()
                                        {
                                            id = rdr["id"].ToString(),
                                            appid = rdr["appid"].ToString(),
                                            appkey = rdr["appkey"].ToString(),
                                            applicense = rdr["applicense"].ToString(),
                                            appexepath = rdr["appexepath"].ToString(),
                                            userid = rdr["userid"].ToString(),
                                            usertoken = rdr["usertoken"].ToString(),
                                            checkurl = await CreateCheckURL(rdr["appid"].ToString()),
                                            updatestatus = await UpdateCheck(await CreateCheckURL(rdr["appid"].ToString())),
                                            jsonsource = JsonSource
                                        });
    
                                        await Task.Delay(500);
                                    }
                                }
                            }
                            sqlitecon.Close();

    DataAdapter, DataSet ve DataTable Kavramları Nedir? diye küçük bir yazım var, datatable, data set ve dataadapter üzerinde çalışırsan bu dar boğazların önüne bir nebze geçersin.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...



    23 Kasım 2017 Perşembe 17:01