C# SQLite,读取后数据库被锁定
C# SQLite, database being left locked after a read
看了一些相关的帖子,不是很明白。发生的事情是,在访问数据库之后,数据库被锁定,因此可以读取,但不能写入。退出应用程序后,数据库再次解锁。你能不能看着它像我无知一样和我说话,指出我处理这个问题的错误?
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;
}
参考文献:
- Proper use of the IDisposable interface
- Do I have to Dispose the SQLiteCommand objects?
- SqlConnection SqlCommand SqlDataReader IDisposable
看了一些相关的帖子,不是很明白。发生的事情是,在访问数据库之后,数据库被锁定,因此可以读取,但不能写入。退出应用程序后,数据库再次解锁。你能不能看着它像我无知一样和我说话,指出我处理这个问题的错误?
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;
}
参考文献:
- Proper use of the IDisposable interface
- Do I have to Dispose the SQLiteCommand objects?
- SqlConnection SqlCommand SqlDataReader IDisposable