簡體   English   中英

如何防止Sqlite數據庫被鎖定?

[英]How to prevent Sqlite Database is locked?

我在數據庫上讀了一個線程。 當我點擊menustrip時,它顯示錯誤“數據庫被鎖定”。 它有時只會發生。 有什么方法可以防止數據庫鎖定? 我試過WAL但它不起作用。

讀:

private void checkPort(string ipIN, char[] input, string output)
    {
        try
        {
            bool building = false;
            Thread beep = new Thread(Beep);
            using (SQLiteConnection c = new SQLiteConnection(dbconnection))
            {
                c.Open();
                string query = "select * from ALL_IO(nolock)";
                using (SQLiteCommand cmd = new SQLiteCommand(query, c))
                {
                    using (SQLiteDataReader dr = cmd.ExecuteReader())
                    {
                        int Contact;
                        while (dr.Read())
                        {
                            string _IP = dr.GetString(0);
                            string _IO_I = dr.GetString(1);
                            string _BuildingName = dr.GetString(4);
                            int IO_I = Convert.ToInt32(dr.GetString(1).Replace("DI ", ""));
                            if (dr.GetString(3) == "NC")
                            {
                                Contact = 1;
                            }
                            else
                            {
                                Contact = 0;
                            }
                            _tableName = dr.GetString(8);
                            string _name = dr.GetString(5);
                            var _active = dr.GetString(6);
                            var _status = dr.GetString(7);
                            if (_active == "Yes" && _status == "Enable")
                            {
                                 //Some condition check here
                            }

        }
        catch { }
    }

寫作:

void contexMenuuu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        data = "";
        ToolStripItem item = e.ClickedItem;
        using (SQLiteConnection c = new SQLiteConnection(dbconnection))
        {
            c.Open();
            string sql = "select * from " + Properties.Settings.Default.TableName + "(nolock) where Name= '" + Properties.Settings.Default.LabelName.Replace(" DO", "") + "' ";
            using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
            {
                using (SQLiteDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        _controllerIP = dr.GetString(0);
                        _IO = dr.GetString(1);
                        _IO_O = dr.GetString(2).Replace("DO ", "");
                        _Name = dr.GetString(4);
                        _Interval = Convert.ToInt32(dr.GetString(9));
                    }
                }
            }
        }
        if (item.Text == "Bypass Enable")
        {
            using (SQLiteConnection c = new SQLiteConnection(dbconnection))
            {
                //c.DefaultTimeout = 2000;
                c.Open();
                string sql = "update ALL_IO SET Active='Yes', Status='Bypass' where ControllerIP='" + _controllerIP + "' and DI='" + _IO + "';";
                using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
                {
                    lock (lockobj)
                    {
                        //SQLiteConnection.ClearAllPools();
                        cmd.ExecuteNonQuery(); //Error occur here
                    }                     
                }

            }

        }

功能完成后,您必須關閉數據庫連接以避免數據庫鎖定問題。 為了執行查詢,您打開了數據庫連接,之后您沒有關閉它。 所以你需要關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM