/* 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没啥太大关系,可以考虑使用事务、还有索引(不过不建立太多)来进行尝试解决。