【发布时间】:2017-03-07 13:42:11
【问题描述】:
我有一个页面加载方法,可以将带有 sql 查询的 asp 下拉列表加载到我的 SQL Server 2012 数据库中。我是新手,基本上独立学习了我正在从事的合作项目需要做的很多事情。
我一直遇到连接未正确关闭的问题,并且我的连接池在仅适度使用我的应用程序的情况下爆炸,因此我一直在尝试改进我在后面的 c# 代码中执行查询的方式.但是我对自己的理解没有信心,所以我将发布我的代码示例,希望更流利的人能够指导我一点。
string constr = ConfigurationManager.ConnectionStrings["CurrencyDb"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr)) {
using (SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.Category")) {
try {
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
con.Open();
//Populate Category Dropdown
DDCategory.DataSource = cmd.ExecuteReader();
DDCategory.DataTextField = "CategoryName";
DDCategory.DataValueField = "CategoryId";
DDCategory.DataBind();
}
catch (SqlException sqlex) {
throw new Exception("SQL Exception loading data from database. " + sqlex.Message);
}
catch (Exception ex) {
throw new Exception("Error loading Category data from database. " + ex.Message);
}
}
using (SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.SubCategory ORDER BY SubCategoryName")) {
try {
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
//Populate SubCategory Dropdown
DDSubCategory.DataSource = cmd.ExecuteReader();
DDSubCategory.DataTextField = "SubCategoryName";
DDSubCategory.DataValueField = "SubCategoryId";
DDSubCategory.DataBind();
}
catch (SqlException sqlex) {
throw new Exception("SQL Exception loading data from database. " + sqlex.Message);
}
catch (Exception ex) {
throw new Exception("Error loading Subcategory data from database. " + ex.Message);
}
}
}
以上是我的页面加载方法上的两个查询,大概8个。
我最近的错误是
已经有一个打开的 DataReader 与此命令关联,必须先关闭。
这促使我提出这个问题,我在我的 Web.config 连接字符串中设置了 MultipleActiveResultSets=true 并且我的应用程序现在可以运行了,但我觉得这似乎是一个补丁来覆盖可能是糟糕的代码。
这样做的最佳做法是什么?提前非常感谢!
【问题讨论】:
-
IMO,最好的方法是对一个查询使用一个连接。你想执行另一个查询吗?设置另一个连接。 :)
-
使用 cmd.ExecuteReader() 或在完成后调用 DataReader 上的 Dispose
标签: c# sql asp.net sql-server datareader