使用连接时需要考虑以下几点。
1) 使用 using 语句在不再需要连接对象时立即处理它:
using (var conn = new SqlConnection(connectionstring))
{
// your sql magic goes here
}
2) 如果您不立即释放对象,您可以使用 try-finally 语句确保连接已关闭:
var conn = new SqlConnection(connectionstring);
try
{
// do sql shizzle
}
finally
{
conn.Close();
}
3) 为防止 SQL 注入,使用参数化查询,切勿串联字符串
using (var conn = new SqlConnection(connectionstring))
{
conn.Open();
using(var comm = new SqlCommand("select * from FooBar where foo = @foo", conn))
{
comm.Parameters.Add(new SqlParameter("@foo", "bar"));
// also possible:
// comm.Parameters.AddWithValue("@foo", "bar");
using(var reader = comm.ExecuteReader())
{
// Do stuff with the reader;
}
}
}
4) 如果您正在执行多个更新、插入或删除语句,并且它们都需要一次成功,请使用事务:
using (var conn = new SqlConnection(connectionstring))
{
conn.Open();
using(var trans = conn.BeginTransaction())
{
try
{
using(var comm = new SqlCommand("delete from FooBar where fooId = @foo", conn, trans))
{
comm.Parameters.Add(new SqlParameter { ParameterName = "@foo", DbType = System.Data.DbType.Int32 });
for(int i = 0; i < 10 ; i++)
{
comm.Parameters["@foo"].Value = i;
comm.ExecuteNonQuery();
}
}
trans.Commit();
}
catch (Exception exe)
{
trans.Rollback();
// do some logging
}
}
}
5) 存储过程的用法类似:
using (var conn = new SqlConnection(connectionstring))
{
conn.Open();
using (var comm = new SqlCommand("FooBarProcedure", conn) { CommandType = CommandType.StoredProcedure })
{
comm.Parameters.Add(new SqlParameter("@FooBar", "shizzle"));
comm.ExecuteNonQuery();
}
}
(源存储过程:this Answer)
多线程:使用多线程和 SQL 连接的最安全方法是始终关闭并释放连接对象。这是 SqlConnection 设计的行为。 (来源:Answer John Skeet)