我有两种方法如下:
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();
}
我知道我们可以合并这两种方法,但我正在寻找更好的方法来写这个,或者这可能会导致一些问题?
答案 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);
然后,您的客户将关闭阅读器,您的连接也将关闭。
如果你没有关闭里面的阅读器,那么第二个例子也是正确的。将读者传递给方法只是为了迭代它是没有罪犯的。但它必须从它的创建地点进行控制。你如何打开和处理它 - 这是另一个问题。