Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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中嵌套查询_C#_Sql_Loops - Fatal编程技术网

C# 避免在C中嵌套查询

C# 避免在C中嵌套查询,c#,sql,loops,C#,Sql,Loops,目前,我有一个C代码来显示gridview中的数据,它基于几个条件。因此,我必须对gridview进行嵌套。我的代码是这样的 con.ConnectionString = ConfigurationManager.ConnectionStrings["mySQLConnection"].ToString(); con.Open(); SqlCommand cmd = new SqlCommand("SELECT uname FROM vusers", con);

目前,我有一个C代码来显示gridview中的数据,它基于几个条件。因此,我必须对gridview进行嵌套。我的代码是这样的

con.ConnectionString = ConfigurationManager.ConnectionStrings["mySQLConnection"].ToString();
con.Open();

            SqlCommand cmd = new SqlCommand("SELECT uname FROM vusers", con);
            var dr = cmd.ExecuteReader();


            if (dr.HasRows)
            {
                while (dr.Read())
                {


        con1.ConnectionString = ConfigurationManager.ConnectionStrings["mySQLConnection"].ToString();
        con1.Open();

                SqlCommand cmd1 = new SqlCommand("SELECT mydata FROM vdata where uname="+dr["uname"].ToString(), con1);
                var dr1 = cmd1.ExecuteReader();


                if (dr1.HasRows)
                {
                        while (dr1.Read())
                        {
                            getmydata = dr1["mydata"].ToString();
                    }
                }

        con2.ConnectionString = ConfigurationManager.ConnectionStrings["mySQLConnection"].ToString();
        con2.Open();

                SqlCommand cmd2 = new SqlCommand("SELECT mynewdata FROM vnewdata where uname="+dr["uname"].ToString(), con2);
                var dr2 = cmd2.ExecuteReader();


                if (dr2.HasRows)
                {
                        while (dr2.Read())
                        {
                            getmynewdata = dr2["mydata"].ToString();
                    }
                }
                }
            }

在上面的代码中,我从外部SQL查询获得uname&在uname的基础上,我从两个内部SQL查询获得数据。对于一个大型数据库来说,这是一个缓慢而耗时的过程。如何防止循环中的2内部查询执行。如何提高效率,减少时间和资源消耗?

您不需要三个连接对象,只需运行三次查询,就可以在单个查询中实现这些值

           SqlConnection con = new SqlConnection();
            con.ConnectionString = ConfigurationManager.ConnectionStrings["mySQLConnection"].ToString();
            con.Open();
            // As per @fubo's comment
            SqlCommand cmd = new SqlCommand("SELECT uname, mydata,mynewdata FROM vusers u JOIN vdata v ON u.uname = v.uname JOIN vnewdata n ON u.uname = n.uname", con);
            using (var dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        var getmydata = dr["mydata"].ToString();
                        var getmynewdata = dr["mydata"].ToString();
                    }
                }

简单的第一步:您不需要3个连接。您可以对所有查询使用相同的连接。这将在每个循环中节省几毫秒。请阅读更多关于Join的信息,我同意第二步,John Woo告诉您,您最好返回到表级别,或者根据您的Join select再构建一个视图。从设计的角度来看,在文本字段上进行连接是一个非常糟糕的想法,它也会严重影响性能。希望下面的表使用int-id、主键和外键,它们将用于连接上的表;vdata、Vuser、vnewdata已经是从不同表生成的视图。所以,我不想进一步使用连接,这将使它更慢。我正在寻找一种在时间和资源有限的情况下提高效率的方法。@bogojane,使用连接是非常好的实践。我不明白为什么在你看来,使用连接比其他技术节省时间和资源。注意,上面的代码应该使用更少的资源,因为整个作业是在服务器端完成的——一次,而不是三次@你有证据证明那句话吗?胡乱猜测在优化中通常没有用处。试着看看执行计划,找出为什么它没有达到你期望的效果。可能是您缺少一个重要的索引,或者该索引不正确/不是最新的。您可能希望使用架构绑定视图。当您想要拆分MS SQL刚刚放弃的复杂查询时,您可能希望在数据库中使用中间表变量,这非常有用。@MaciejLos OP非常明确,他从中选择的视图已经包含联接,并且联接的成本通常会在视图边界上传播。现在,我并不是说我真的相信OP,当他说如果它真的会变慢的时候,他会给出具体的数据和支持他的主张的计划,但是如果他真的测试了它,事实上它变慢了,那么这可能是有很多原因的。在任何情况下,通过结果集进行循环都是一件可怕的事情,这表明数据库设计非常糟糕,对MS SQL的理解也很差。哦,好吧。