如何正确使用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();
}

我知道我们可以合并这两种方法,但我正在寻找更好的方法来写,或者这会引起一些问题??

如何正确使用SqlDataReader

实际上,你让自己有点开放。你真的想这样写:

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);

然后,您的客户端将关闭阅读器,您的连接也将关闭。

第二个例子也是正确的,如果你没有把阅读器关闭在里面。把阅读器传递给一个方法只是为了迭代它并没有犯罪行为。但它必须从创建的地方进行控制。你如何打开和处理它——这是另一个问题。