使用Using语句进行SQLConnection,从里面调用SQLDataReader?

Spo*_*oks 3 sql asp.net using

只是想确保这是调用连接,从数据库中获取数据的最佳方法,还是应该如何在using语句之外调用datareader?(为了更快地关闭连接?)或者你有什么个人改变吗?

using (SqlConnection cn = new SqlConnection(connStr))
        {
            using (SqlCommand cm = new SqlCommand(connStr, cn))
            {  
                cm.CommandType = CommandType.StoredProcedure;
                cm.CommandText = "GetExchRatesByDate";
                cm.Parameters.Add("@Date", SqlDbType.VarChar).Value = txtStartDate.Text;
                cn.Open();
                SqlDataReader dr = cm.ExecuteReader();

                while (dr.Read())
                {
                    firstName = (string)dr["GivenName"];
                    lastName = (string)dr["sn"];;
                }
                dr.Close();
            }
        }
Run Code Online (Sandbox Code Playgroud)

kem*_*002 5

您无法在using语句之外成功调用datareader,因为它需要打开连接才能读取数据.

连接将以你拥有的方式足够快地关闭,甚至不会真正"关闭".它将返回到连接池(假设您使用的是连接池).由于您可能是这样,因此您无需担心连接在此上下文中的关闭速度,因为需要连接的应用程序的其他部分将从池中获取可用的连接.这假设您没有真正高流量的应用程序,它可能在这种情况下变得很重要,但这是很多很多很多并发用户,您可以通过增加池中的连接数来缓解这个问题.

克里斯提出了一个很好的观点:它应该在一个使用声明中:

  SqlDataReader dr = cm.ExecuteReader();

                while (dr.Read())
                {
                    firstName = (string)dr["GivenName"];
                    lastName = (string)dr["sn"];;
                }
                dr.Close();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您的读者抛出异常,它将永远不会达到,dr.Close();因此它将比它需要的时间长得多(也许甚至在应用程序的生命周期中).

数据阅读器


Wil*_*ler 5

不仅你不能调用语句的SqlDataReader外部,using因为变量中的所有声明都将被处理,你需要一个打开的连接来读取数据,你最好写一个将被返回的对象,甚至是你的列表宾语.

public class MyObject {
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

public IEnumerable<MyObject> GetObjects() {
    ICollection<MyObject> myObjects = new List<MyObject>();

    using (SqlConnection cn = new SqlConnection(connStr))
    {
        using (SqlCommand cm = new SqlCommand(connStr, cn))
        {  
            cm.CommandType = CommandType.StoredProcedure;
            cm.CommandText = "GetExchRatesByDate";
            cm.Parameters.Add("@Date", SqlDbType.VarChar).Value = txtStartDate.Text;
            cn.Open();

            using(SqlDataReader dr = cm.ExecuteReader()) 
                while (dr.Read()) {
                    MyObject myObject = new MyObject();
                    myObject.FirstName = (string)dr["GivenName"];
                    myObject.Surname = (string)dr["sn"];
                    myObjects.Add(myObject);
                }
        }
    }
    return myObjects;
}
Run Code Online (Sandbox Code Playgroud)