Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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# 提高SQL查询执行时间_C#_Sql Server_Winforms - Fatal编程技术网

C# 提高SQL查询执行时间

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

我有一个dataGridView,它显示一个表中的数据,在我将这些数据导出为xml文件后,我将唯一字段添加到另一个表中,以便只显示未导出的数据

如何仅显示尚未导出的数据:

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可以重复使用相同的计划,但仍然需要相同的时间