C#海量SQL更新查询

时间:2010-10-12 14:18:25

标签: c# sql

无处不在的情景:

我有一个180万行文本文件,我需要注入一个SQL表,我的代码工作正常,只是有点慢(如每天250k行)。不幸的是,我有大约4个这样大小的文本文件,所以我需要一种方法来加快这个过程。任何帮助,将不胜感激。如果某些代码看起来不正确,那么我会省略一些隐私的东西。我知道我可以砍掉file.appendall,但我用它来跟踪它,我也做了明星++,所以我可以在第二天拿起来不停止备份。

DirectoryInfo dinfo = new DirectoryInfo(ocrdirectory);
FileInfo[] Files = dinfo.GetFiles("*.txt");
foreach (FileInfo filex in Files)
{
        string[] primaryfix = File.ReadAllLines(dinfo + "\\" + filex);
        string filename = filex.ToString();
        string[] spltifilename = filename.Split('.');
        foreach (string primary in primaryfix)
        {
            string sqltable = ("dbo.amu_Textloadingarea");
            string sql = "update " + sqltable + 
                         " set [Text] = [Text] + '" + primary +"|"+ 
                         "' where unique = '" + spltifilename[0] + "'";
            File.AppendAllText(@"C:\convert\sqltest.txt", sql+"\n");
            SqlConnection con = new SqlConnection("Data Source= Cote ;Initial Catalog= eCASE;Integrated Security= SSPI");
            con.Open();
            SqlCommand cmd = new SqlCommand(sql, con);
            SqlDataReader reader = cmd.ExecuteReader();
            con.Close();
            Console.WriteLine(start);
            start++;
        }

5 个答案:

答案 0 :(得分:10)

答案 1 :(得分:7)

我建议您尝试使用预定的SSIS解决方案或bcp解决方案,而不是通过代码。

此外,通过查看您的代码,您已经构建了最低效率的代码。虽然你所拥有的将适用于应用程序,但它绝对不适合批量操作。你的问题:

  • 您正在使用每次循环迭代创建数据库对象,只需要创建一次
  • 您每次都重新连接到数据库。这也需要进行一次(每次会话)
  • 你需要打破这种方法......但是,这仍然不是最好的解决方案

正如我和其他人所提到的,你真的需要制定一个特殊的批量插入解决方案。

答案 2 :(得分:2)

我会尝试使用SQL Server SSIS来满足这样的要求。 SSIS具有允许动态替换值的包变量。

答案 3 :(得分:2)

对于初学者,只打开一次连接(在循环外)。此外,请致电cmd.ExecuteNonQuery(),而不是创建一个你只是要扔掉的读者。您也可以考虑创建SqlCommand一次(打开连接后)并将SQL语句重新分配给.CommandText属性。如果你这样做,也要把它作为预备语句,并将值分配给参数。

答案 4 :(得分:0)

以上所有。然而,一些简单的加速将是使用字符串生成器而不是字符串连接,并保持数据库连接打开,这些应该节省您很多时间。