我最近一直在做一个旧项目。我在项目中发现,以前的同事已经创建了一些用于打开数据库连接的常用方法。但是,一旦查询完成,我对它是否真正处理IDispose连接的过程存在疑问。
以下是方法:
连接数据库。
call function with (0,5,3)
call function with (2,5,3)
call function with (1,4,3)
call function with (1,6,3)
call function with (1,5,2)
call function with (1,5,4)
call function with (1,5,3)
然后我们使用GetDataReader,如下所示
/// <summary>
/// This method creates a connection object to the database.
/// </summary>
/// <returns>a new SQL Connection</returns>
public SqlConnection ConnectDB()
{
var db = new SqlConnection(ConnectionString);
db.Open();
return db;
}
public SqlDataReader GetDataReader(SqlCommand query)
{
var db = ConnectDB();
query.Connection = db;
var reader = query.ExecuteReader();
return reader;
}
您认为此过程会正确释放所有连接吗?
答案 0 :(得分:2)
代码不安全。处置/关闭阅读器不会自动关闭连接,因为您可能希望在同一连接上执行多个命令。即使您使用 关闭连接的the override,在您输入using
块之前可能发生的异常也会使连接保持打开状态。
典型的方法是在using
语句中包装连接,命令和阅读器:
using(var con=new SqlConnection(connectionString))
using(var command=new SqlCommand(sql,con))
{
con.Open();
using(var reader=command.ExecuteReader())
{
....
}
}
答案 1 :(得分:1)
SqlConnection
也实现了IDisposable
接口,因此您也必须关闭连接。所以你也应该在using
块中包装连接。
答案 2 :(得分:0)
不,您的代码没有正确释放所有连接,因为他们已在其他答案中确认。 虽然修改一个旧程序可能是一场噩梦我建议采用这样的方法
class Program
{
static IEnumerable<SqlDataReader> InteractionGetData(string query)
{
using (var connection = new SqlConnection(@"Data Source=localhost;Integrated Security=SSPI;"))
{
connection.Open();
using (var command = new SqlCommand(query, connection))
{
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
yield return reader;
}
}
}
}
}
static void Main(string[] args)
{
foreach (var reader in InteractionGetData("SELECT DISTINCT ProductName FROM Products"))
{
Console.WriteLine(reader.GetString(reader.GetOrdinal("ProductName")));
}
}
}