关于#c##的问题:执行更新foreach 循环非常慢,不到100条语句执行好几分钟,2分钟后foreach 还没循环完

  
          /*  SqlConnection conn = new SqlConnection(detail);
            SqlConnection conn2 = new SqlConnection(connstr);
            double t5 = Convert.ToDouble(textEdit5.Text.Trim());
           
            int t6 = Convert.ToInt32(textEdit6.Text.Trim());
            int t7 = Convert.ToInt32(textEdit7.Text.Trim());
            
            string str11;
             
            string k = dateTimePicker18.Value.ToString("yyyyMMdd");
           
            conn.Open();
            conn2.Open();
            foreach (int i in gridView9.GetSelectedRows())
            {

                Random ran = new Random();
              
                string leixing = gridView9.GetRowCellDisplayText(0, gridView9.Columns["showname"]);
                if (leixing.Contains("苹果") || leixing.Contains("水果"))
                {
                    double randNum = ran.Next(t6, t7)/100;

                    double t8 = t5 + randNum;
                    str11 = (t8).ToString("0.00");
                }
                else if (leixing.Contains("蔬菜") || leixing.Contains("CO"))
                {
                    double randNum = ran.Next(t6, t7);

                    double t8 = t5 + randNum;
                    str11 = (t8).ToString("0");
                }
                else
                {
                    double randNum = ran.Next(t6, t7) / 100;

                    double t8 = t5 + randNum;
                    str11 = (t8).ToString("0.0") + "0";
                }
                DataRow row = gridView9.GetDataRow(i);
                string UniqueId = row[1].ToString();

                string IOTime = row[7].ToString();
                double DataFlag = Convert.ToDouble(str11);
                byte[] bytes = BitConverter.GetBytes(DataFlag);

                string Flag;
                Flag =  bytes[0].ToString("X2") + bytes[1].ToString("X2") + bytes[2].ToString("X2") + bytes[3].ToString("X2") + bytes[4].ToString("X2") + bytes[5].ToString("X2") + bytes[6].ToString("X2") + bytes[7].ToString("X2"); //转换为加密数

                string sql = "UPDATE DetailRealData"+k+ " SET DataFlag='"+Flag+"',StatusID=256 WHERE UniqueId="+UniqueId+ " AND ( IOTime < '"+IOTime+".999' AND IOTime > '"+IOTime+".000' ) ";

                SqlCommand cmd = new SqlCommand(sql, conn);
                string yunxing = "UPDATE AnalogRunRecord"+k+" SET StatusID=256,SValue="+str11+" WHERE UniqueID= "+UniqueId+ " AND  STime='" + IOTime + ".000'";
                SqlCommand cmd2 = new SqlCommand(yunxing, conn2);
                cmd.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();



            }
            simpleButton18_Click(sender,e);

            */
执行更新foreach 循环非常慢,不到100条语句执行好几分钟,2分钟后foreach 还没循环完,怎么解决呢?

你把两个ExecuteNonQuery代码部分注释一下看看速度,如果变快就重点排查这里的SQL语句,看下直接执行SQL语句的速度,确保数据库服务器不存在死锁等情况

当你设计的思路是不对的,打开数据库,使用事务更新完成,然后提交结果,这么做只打开关闭数据库一次
你的方法是一条一条提交,效率很低
望采纳

如果以下语句速度不够快,你把表中的UniqueID,IOTime ,STime加上索引,望采纳


  
          /*  SqlConnection conn = new SqlConnection(detail);
            SqlConnection conn2 = new SqlConnection(connstr);
            double t5 = Convert.ToDouble(textEdit5.Text.Trim());
           
            int t6 = Convert.ToInt32(textEdit6.Text.Trim());
            int t7 = Convert.ToInt32(textEdit7.Text.Trim());
            
            string str11;
            string yunxing="";
            string sql="";
             
            string k = dateTimePicker18.Value.ToString("yyyyMMdd");
           
            conn.Open();
            conn2.Open();
            foreach (int i in gridView9.GetSelectedRows())
            {
 
                Random ran = new Random();
              
                string leixing = gridView9.GetRowCellDisplayText(0, gridView9.Columns["showname"]);
                if (leixing.Contains("苹果") || leixing.Contains("水果"))
                {
                    double randNum = ran.Next(t6, t7)/100;
 
                    double t8 = t5 + randNum;
                    str11 = (t8).ToString("0.00");
                }
                else if (leixing.Contains("蔬菜") || leixing.Contains("CO"))
                {
                    double randNum = ran.Next(t6, t7);
 
                    double t8 = t5 + randNum;
                    str11 = (t8).ToString("0");
                }
                else
                {
                    double randNum = ran.Next(t6, t7) / 100;
 
                    double t8 = t5 + randNum;
                    str11 = (t8).ToString("0.0") + "0";
                }
                DataRow row = gridView9.GetDataRow(i);
                string UniqueId = row[1].ToString();
 
                string IOTime = row[7].ToString();
                double DataFlag = Convert.ToDouble(str11);
                byte[] bytes = BitConverter.GetBytes(DataFlag);
 
                string Flag;
                Flag =  bytes[0].ToString("X2") + bytes[1].ToString("X2") + bytes[2].ToString("X2") + bytes[3].ToString("X2") + bytes[4].ToString("X2") + bytes[5].ToString("X2") + bytes[6].ToString("X2") + bytes[7].ToString("X2"); //转换为加密数
 
                sql =sql + "UPDATE DetailRealData"+k+ " SET DataFlag='"+Flag+"',StatusID=256 WHERE UniqueId="+UniqueId+ " AND ( IOTime < '"+IOTime+".999' AND IOTime > '"+IOTime+".000' ); ";
 
               
                yunxing =yunxing + "UPDATE AnalogRunRecord"+k+" SET StatusID=256,SValue="+str11+" WHERE UniqueID= "+UniqueId+ " AND  STime='" + IOTime + ".000'";
            

 
 
 
            }
 SqlCommand cmd = new SqlCommand(sql, conn);
    SqlCommand cmd2 = new SqlCommand(yunxing, conn2);
                cmd.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();
            simpleButton18_Click(sender,e);
 
            */
执行更新foreach 循环非常慢,不到100条语句执行好几分钟,2分钟后foreach 还没循环完,怎么解决呢?

排除运行效率问题,应该是数据库执行sql慢,可以在数据库中尝试直接执行sql看看快慢,如果数据库执行本身慢,则应从优化数据库表和索引等方面找找问题。你的sql很简单按道理不应该很慢的。还要看下数据库表是否数据量过大或者表关联比较复杂。

sql语句的部分加个开始执行和结束的时间 调试看看耗时,目测是数据库执行慢拉低了效率,条件字段索引加一下

这个和foreach无关,是你在foreach中的提交数据库相关,可以使用事务或者是最后提交一次。

更新时,要保证字段的传值类型和数据库类型一致,否则会影响效率;另一方面,可以先删除数据库的索引(提前备份好以便用于恢复),因为对于update操作,索引将对原先的数据进行删除标记,然后增加一条新的记录,所以当索引设计的不合理时,会影响更新操作,而且对于频繁插入、更新的表,不建议建立太多索引

这个其实和c#中的foreach没啥太大关系,可以考虑使用事务、还有索引(不过不建立太多)来进行尝试解决。