Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的SQL嵌套查询和连接打开问题_C#_.net_Asp.net_Sql Server - Fatal编程技术网

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上查找它,这样您就可以在一次调用中获得所需的信息。如果没有您正在使用的实际代码,很难判断。