C#SQLite,数据库在读取后被锁定

我已经阅读了一些关于此的相关post,并不太明白。 发生的事情似乎是在访问数据库之后,数据库被锁定,以便可以读取数据库,但不能写入数据库。 退出应用程序后,数据库将再次解锁。 你能看到它并像我一样无知地跟我说话,指出我处理这种方式的错误吗?

public static Partner GetOnePartner(string code) { Partner partner = new Partner(); SQLiteConnection connection = GroomwatchDB.GetConnection(); string sqlStatement = "SELECT * FROM partners WHERE partner_code = @partner_code"; SQLiteCommand command = new SQLiteCommand(sqlStatement, connection); command.Parameters.Add(new SQLiteParameter("@partner_code")); command.Parameters["@partner_code"].Value = code; try { connection.Open(); SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow); if(reader.Read()) { partner.Code = reader["partner_code"].ToString(); partner.Last_name = reader["last_name"].ToString(); partner.First_name = reader["first_name"].ToString(); partner.Pay_rate = (double)reader["pay_rate"]; partner.Active = reader["active"].ToString(); } else { partner.Code = code; partner.Last_name = "Not Found"; } } catch (SQLiteException ex) { throw ex; } finally { connection.Close(); } return partner; } 

您应该使用IDisposable模式正确使用您的连接。

实际上,每个实现IDisposable接口的类都需要使用using来调用。 这样可以确保调用Dispose()方法,从而清除非托管资源(并且不会以打开的文件结束):

 public static Partner GetOnePartner(string code) { Partner partner = new Partner(); string sqlStatement = "SELECT * FROM partners WHERE partner_code = @partner_code"; using(SQLiteConnection connection = GroomwatchDB.GetConnection()) using(SQLiteCommand command = new SQLiteCommand(sqlStatement, connection)) { command.Parameters.Add(new SQLiteParameter("@partner_code")); command.Parameters["@partner_code"].Value = code; connection.Open(); using(SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow)) { if(reader.Read()) { partner.Code = reader["partner_code"].ToString(); partner.Last_name = reader["last_name"].ToString(); partner.First_name = reader["first_name"].ToString(); partner.Pay_rate = (double)reader["pay_rate"]; partner.Active = reader["active"].ToString(); } else { partner.Code = code; partner.Last_name = "Not Found"; } } } return partner; } 

参考文献:

  • 正确使用IDisposable接口
  • 我是否必须处理SQLiteCommand对象?
  • SqlConnection SqlCommand SqlDataReader IDisposable