C# C中的SQL嵌套查询和连接打开问题
我有三个表,我的要求是使用每个表的父记录获取它们的记录 所以我有三个问题。下面是一个代码示例: 第一个问题C# C中的SQL嵌套查询和连接打开问题,c#,.net,asp.net,sql-server,C#,.net,Asp.net,Sql Server,我有三个表,我的要求是使用每个表的父记录获取它们的记录 所以我有三个问题。下面是一个代码示例: 第一个问题 SQLConnection con = new SQLConnection("connectionstring"); SQLCommand cmd1 = new SQLCommand (1stQuery,con); SQLDataReader rs1 = cmd1.DataReader(); while (rs1.Read()) { // Making 2nd Query, 2nd
SQLConnection con = new SQLConnection("connectionstring");
SQLCommand cmd1 = new SQLCommand (1stQuery,con);
SQLDataReader rs1 = cmd1.DataReader();
while (rs1.Read()) {
// Making 2nd Query, 2nd Query is using 1st Query result
SQLCommand cmd2 = new SQLCommand(2ndQuery,con);
SQLDataReader rs2 = cmd2.DataReader();
while (rs2.Read()){
//Making 3rd Query using 2nd Query result
}
}
它给出的错误是已经有一个打开的DataReader。我不想关闭SQL连接并为每个查询打开它,因为这对性能有害
我只想对所有查询使用一个SQL连接。如果要嵌套对数据库的调用,则需要使用不同的连接 这里有一个更糟糕的问题,在循环中调用DB,也称为
我建议重写数据库和应用程序逻辑-在数据库中使用联接将单独的查询合并为一个查询,并更改逻辑以使用结果。您不需要关闭连接。错误提示的问题是,您没有在启动下一个数据读取器之前关闭一个数据读取器 正如Oded所说,您有一个选择的N+1问题,但是为了这个答案,让我们忽略它 最简单的方法是在开始读取下一个数据集之前,将整个第一个数据集读取到内存中:
var list1 = new List<Foo>();
using (var rdr1 = cmd1.ExecuteReader())
{
list1.Add(...);
}
var list2 = new List<Bar>();
var cmd2 = ...;
foreach (var item in list1)
{
// assign parameters to cmd2 from item
using (var rdr2 = cmd2.ExecuteReader())
{
list2.Add(...);
}
}
。。。等等
另一个选项是在您的连接上启用,这允许您同时激活多个数据读取器。这几乎总是一个坏主意,所以让我们假装我从未建议过它。我建议使用ExecuteDataSet。它将包含所有三个查询的结果。此外,这些查询应该在存储过程中执行
否则,您将邀请Sql注入
将连接字符串的属性设置为true,但代码的性能很差。尝试将查询包装在存储过程中以避免循环。我不能在这里使用任何联接,要求应用数值公式,我认为它的Npower3,N X N X N。每个循环都有要执行的数值。@Muhammad Atif Agha-调用DB的嵌套循环会破坏性能,不是因为您使用了第二个连接。@Muhammad Atif Agha-重写DB逻辑以避免N+1问题。您很可能能够使用SQL连接实现您想要的功能。例如,在W3S上查找它,这样您就可以在一次调用中获得所需的信息。如果没有您正在使用的实际代码,很难判断。