【发布时间】:2015-05-06 10:41:30
【问题描述】:
我已经阅读了一些有关此的相关帖子,但不太了解。正在发生的事情似乎是在对数据库的访问之后,数据库被锁定,以便可以读取,但不能写入。退出应用程序后,数据库再次解锁。你能不能看着我像无知一样跟我说话,指出我处理这个问题的方式的错误?
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;
}
【问题讨论】:
-
当我不得不猜测时:在 else 分支之后尝试 reader.Close()。至少它不会变得更糟。
-
如果 SQLiteDataReader、SQLiteCommand 或 SQLiteConnection 实现了 IDisposable 接口,您可以使用 using 语句确保它们被释放。
-
连接字符串是什么?您是否使用预写日志记录?
GetConnection方法有什么作用? -
您是否尝试从不同的线程访问数据库?你使用交易吗? SQLite 允许多个阅读器,但只有一个编写器,这可能意味着您打开了一个连接以便在某处进行写入
-
请使用
using来处理所有个一次性对象——连接、命令和阅读器。