如何正确使用SqlDataReader
本文关键字:SqlDataReader 何正确 | 更新日期: 2023-09-27 18:26:49
我有两种方法,如下所示:
internal static SqlDataReader SelectData(string sql)
{
using (var sqlConnection = new SqlConnection(Constant.ConnectionString))
{
sqlConnection.Open();
var sqlCommand = new SqlCommand(sql, sqlConnection);
var dataReader = sqlCommand.ExecuteReader();
return dataReader;
}
}
====================
并且使用这种方法作为:
var dataReader = SelectData(---some sql ---);
private void AddData(dataReader)
{
while (dataReader.Read())
{
Employee e = new Employee();
e.FirstNamei = dataReader["Name"].ToString();
}
dataReader.Close();
}
我知道我们可以合并这两种方法,但我正在寻找更好的方法来写,或者这会引起一些问题??
实际上,你让自己有点开放。你真的想这样写:
using (SqlConnection cnn = new SqlConnection(cnnString))
using (SqlCommand cmd = new SqlCommand(sql, cnn))
{
// use parameters in your SQL statement too, so you can do this
// and protect yourself from SQL injection, so for example
// SELECT * FROM table WHERE field1 = @parm1
cmd.Parameters.AddWithValue("@parm1", val1);
cnn.Open();
using (SqlDataReader r = cmd.ExecuteReader())
{
}
}
因为您需要确保这些对象得到处理。此外,通过朝这个方向前进,您不需要dataReader.Close()
。当它被using
语句自动处理时,它将被调用。
现在,将该语句集合封装在try...catch
中,就可以开始工作了。
1) 由于您正在关闭SelectData
上的连接,dataReader
应该在AddData
上爆炸,因为它需要一个打开的连接
2) AddData
不应该关闭dataReader,因为他没有打开它。
3) 也许您隐藏了一些代码,但我看不出您使用了在AddData
上创建的Employee
实例
从技术上讲,如果要进行,第一种方法是正确的
sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);
然后,您的客户端将关闭阅读器,您的连接也将关闭。
第二个例子也是正确的,如果你没有把阅读器关闭在里面。把阅读器传递给一个方法只是为了迭代它并没有犯罪行为。但它必须从创建的地方进行控制。你如何打开和处理它——这是另一个问题。