如何正确使用SqlDataReader?

时间:2013-08-08 14:06:17

标签: c# .net ado.net

我有两种方法如下:

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

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

3 个答案:

答案 0 :(得分:5)

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

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 :(得分:2)

一些事情

1)由于您要在SelectData上关闭联系,dataReader会因AddData而爆炸,因为它需要打开连接

2)AddData不应该关闭dataReader,因为他没有打开它。

3)也许您隐藏了一些代码,但我没有看到您使用Employee上创建的AddData实例

答案 2 :(得分:0)

从技术上讲,如果你愿意,第一种方法是正确的

    sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);

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

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