c# - 在一种方法中构造多个查询的最佳方法 c# asp.net

标签 c# sql asp.net sql-server datareader

我有一个页面加载方法,可以将带有 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);
                        }
                    }
                }

以上是我的页面加载方式上的2条8左右的查询。

我最近的错误是

已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。

这促使我提出这个问题,我在我的 Web.config 连接字符串中设置了 MultipleActiveResultSets=true 并且我的应用程序现在可以工作了,但我觉得好像这是一个补丁来覆盖可能糟糕的代码。

执行此操作的最佳做​​法是什么?提前致谢!

最佳答案

嗯,可能有多种方法,但我觉得您应该将所有这些查询包装在一个存储过程中,然后在您的代码后面调用该 SP。不要使用 DataReader,而是使用 DataSet 并用不同的结果集填充它。

您还可以使用 DataReader 实例的 NextResult() 方法来获取下一个 SELECT 结果并进行处理。

关于c# - 在一种方法中构造多个查询的最佳方法 c# asp.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42649889/

相关文章:

c# - 如何使用 C# 在 Active Directory 中获取组所属的组?

c# - 如果长度恰好为一个,或者否则为默认值,我如何获得 IEnumerable 的第一个值?

时间:2019-03-17 标签:c#DataContractJsonSerializer返回null

sql - 使用 Oracle 在 SQL 查询中集成 COUNT 函数时遇到问题

asp.net - 将WebMatrix项目迁移到VS2010

c# - 在 foreach 中使用 ref 的替代方案?

sql - 检查 "empty or null value"的最佳方法

sql - 从 Firebird 中删除制表

c# - ASP.NET 仅使用 MasterPage 的实例访问 MasterPage 中的控件

c# - 为什么不处理/关闭 SqlConnection?