我正在将客户添加到客户数据表中,我使用控制器和迁移完成了这项工作,并且我正在使用 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 上调用上述方法。
如果有人知道如何解决它,请帮忙