SQLiteException: 数据库被锁定 数据库被锁定

时间:2021-07-14 12:10:27

标签: c# sqlite telerik

我正在将客户添加到客户数据表中,我使用控制器和迁移完成了这项工作,并且我正在使用 SQLite 数据库。但是当我添加客户时,它给了我这个错误

: 'An error occurred while starting a transaction on the provider connection. See the inner exception for details.'

Inner Exception
SQLiteException: database is locked
database is locked

这是我的添加客户控制器

 public override int Add()
        {
            using (Models.ModelContext db = new Models.ModelContext())
            {

                Models.Customer customer = null;
                if (this.bindingSource == null)
                    customer = (Customer)this.model;
                else
                    customer = bindingSource.Current as Models.Customer;
                if (customer != null)
                {
                    if (db.Entry<Models.Customer>(customer).State == EntityState.Detached)
                    {
                        db.Set<Models.Customer>().Attach(customer);
                    }
                    if (customer.CustomerId == 0)
                    {
                        db.Entry<Models.Customer>(customer).State = EntityState.Added;
                    }
                    else
                    {
                        db.Entry<Models.Customer>(customer).State = EntityState.Modified;
                    }
                    db.SaveChanges();  //here the controls stop
                    System.Windows.Forms.MessageBox.Show("Record is saved Successfully");

                }
            }

            return 1;
        }

这是onclick添加按钮的代码

 private void Save_btn_Click(object sender, EventArgs e)
        {
            editinfopanel.Enabled = true;

            string code = "C-";
            int code_start_digits = 000000;
            string tablename = "Customers";
            Models.Customer customer = new Models.Customer();
            Models.LedgerHeads ledgerHeads = new Models.LedgerHeads();


            obj.GetCon().Open();
            obj.cmd = new SQLiteCommand("select count(*) as rowNumber from Customers", obj.con);
            obj.read = obj.cmd.ExecuteReader();
            string rowNumber = "";
            while (obj.read.Read())
            {
                rowNumber = obj.read["rowNumber"].ToString();
            }
            obj.GetCon().Close();

            int rownum = Convert.ToInt32(rowNumber);


            //customer.Code = cust_code_txt.Text;
            customer.Address = cust_address_txt.Text;
            customer.Name = cust_name_txt.Text;
            customer.Group_ = group_cb.Text;
            customer.Phone = Convert.ToInt32(cust_phone_txt.Text);
            customer.Cell = Convert.ToInt32(cust_cell_txt.Text);
            customer.Email_address = cust_email_txt.Text;
            customer.Date = DateTime.Parse(cust_date.Text);
            customer.Opening_balance = Convert.ToInt32(cust_balance_txt.Text);

            if (rownum == 0)
            {
                //code logic
                int number = code_start_digits + 1;
                customer.Code = code + "00000" + number;
                if (customer.Name != "")
                {
                    Controller.CustomerController newcustomer = new Controller.CustomerController(customer);
                    newcustomer.Add();  // here i am calling add method
                    cust_id_txt.Text = customer.CustomerId.ToString();


                    //ledgerhead
                    ledgerHeads.ConcerendId = customer.CustomerId;
                    ledgerHeads.TableName = tablename;
                    Controller.LedgerheadController newledger = new Controller.LedgerheadController(ledgerHeads);
                    newledger.Ledgerhead();

                }
                else
                {
                    RadMessageBox.Show("Name is the required field");
                }
            }
            else
            {
                //code logic
                string codevalue = "";
                string query = "select Code from Customers order by CustomerId DESC limit 1";
                using (obj.GetCon())
                {
                    obj.GetCon().Open();
                    using (obj.cmd = new SQLiteCommand(query, obj.con))
                    {
                        using (obj.read = obj.cmd.ExecuteReader())
                        {
                            while (obj.read.Read())
                            {
                                codevalue = obj.read["Code"].ToString();
                            }
                        }
                    }
                    obj.GetCon().Close();
                }

                string[] split_code = codevalue.Split('-');
                int numbervalue = Convert.ToInt32(split_code[1]);
                string a = numbervalue.ToString();
                int length = a.Length;
                int cal = 6 - length;
                string create_zero = "";
                for (int i = 0; i < cal; i++)
                {
                    create_zero += "0";
                }
                customer.Code = code + create_zero + (numbervalue + 1);

                if (customer.Name != "")
                {
                    Controller.CustomerController newcustomer = new Controller.CustomerController(customer);
                    newcustomer.Add();  // here i am calling add method
                    cust_id_txt.Text = customer.CustomerId.ToString();


                    //ledgerhead
                    ledgerHeads.ConcerendId = customer.CustomerId;
                    ledgerHeads.TableName = tablename;
                    Controller.LedgerheadController newledger = new Controller.LedgerheadController(ledgerHeads);
                    newledger.Ledgerhead();

                }
                else
                {
                    RadMessageBox.Show("Name and Code are the required fields");
                }

            }
            

        }
       

它有其他逻辑,但我调用控制器 add 方法的主要部分是我添加注释的地方。

我在 FormLoad 上做的第二件事是

public void GetData()
        {
            using (SQLiteConnection c = new SQLiteConnection("Data Source=|DataDirectory|JDS_DB.sqlite"))
            {
                c.Open();
                string sql = "select * from Customers";
                using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
                {
                    cmd.ExecuteNonQuery();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd);
                    DataSet ds = new System.Data.DataSet();
                    dataAdapter.Fill(ds);
                    datagridview.DataSource = ds;
                }}}

我在 FormLoad 上调用上述方法。

如果有人知道如何解决它,请帮忙

0 个答案:

没有答案