C# 提高SQL查询执行时间
我有一个dataGridView,它显示一个表中的数据,在我将这些数据导出为xml文件后,我将唯一字段添加到另一个表中,以便只显示未导出的数据 如何仅显示尚未导出的数据:C# 提高SQL查询执行时间,c#,sql-server,winforms,C#,Sql Server,Winforms,我有一个dataGridView,它显示一个表中的数据,在我将这些数据导出为xml文件后,我将唯一字段添加到另一个表中,以便只显示未导出的数据 如何仅显示尚未导出的数据: for (int i = 0; i < dataGridView1.Rows.Count; i++) { SqlCommand queryLocal = new SqlCommand("SELECT *uniqueField* FROM myTable WHERE *uniqueField* = " + dat
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
SqlCommand queryLocal = new SqlCommand("SELECT *uniqueField* FROM myTable
WHERE *uniqueField* = " + dataGridView1.Rows[i].Cells[3].Value.ToString().Trim().Replace("'","''"), con);
var reader = queryLocal.ExecuteReader();
if (reader.Read())
{
dataGridView1.Rows.RemoveAt(i);
i--;
}
reader.Close();
}
问题是过滤不到400行需要20秒以上的时间。
如何提高性能?您可以尝试以下方法:
SqlCommand queryLocal = new SqlCommand("SELECT DISTINCT *uniqueField* FROM myTable");
var reader = queryLocal.ExecuteReader();
List<string> uniqueFields = new List<string>();
while (reader.Read())
uniqueFields.Add(reader[0]);
reader.Close();
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (uniqueFields.Contains(dataGridView1.Rows[i])
{
dataGridView1.Rows.RemoveAt(i);
i--;
}
}
首先,修复SQL注入攻击漏洞警告。第二,你看过执行计划了吗?第三,在循环中执行此操作也可能是一个问题选择n+1问题。您的数据提供程序是sql server-它是为您托管的还是您自己托管的?dataGridView1中有多少行,为什么必须分别查询其中的每一行?这可能是您最大的性能损失。您是否在*uniqueField*上有索引?您为什么不使用修改过的WHERE子句再次运行原始查询?@Neil我从ERP ODBC检索数据,并将其与本地数据库SQL Server Express中的表进行比较。Atm表中有349个订单,但仅显示4个,因为它们尚未导出*uniqueField*是唯一的制造订单号。关于您的最新编辑,从输入中删除单引号并不能修复SQL注入漏洞。使用一个参数,而不是将一个SQL字符串组合在一起-它将删除该漏洞并帮助您提高执行速度,因为SQL Server可以重复使用相同的计划,但仍然需要相同的时间