3

我有以下两种方法:

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

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

4

3 回答 3

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语句自动处理时,它将被调用。

现在,将语句集合包装在 atry...catch中,您就可以开始工作了。

于 2013-08-08T14:10:04.253 回答
2

几件事

1)由于您要关闭连接SelectDatadataReader因此应该会爆炸,AddData因为它需要打开连接

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

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

于 2013-08-08T14:10:19.490 回答
0

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

    sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);

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

如果您没有关闭其中的阅读器,第二个示例也是正确的。将读者传递给一个方法只是为了迭代它,这并没有犯罪。但必须从创建它的地方对其进行控制。你如何打开和处理它 - 这是不同的问题。

于 2013-08-08T14:30:04.953 回答