【问题标题】:best way to generate mass insert statement in c#?在 C# 中生成批量插入语句的最佳方法?
【发布时间】:2009-02-14 02:16:43
【问题描述】:

我需要将一堆类似的记录插入到表中,并且想知道是否有一种很好/简单的方法可以做到这一点。

我知道只构建一个大字符串很容易,但我希望我能找到一种更优雅的方法来做到这一点。

【问题讨论】:

  • 这个“一堆”有多大?
  • codesmith 之类的代码生成器会提供帮助吗?
  • 这些记录目前存储在哪里?
  • 嗯,也许最多 30 个,但我说的一堆我真的只是指超过 1 个。

标签: c# sql insert


【解决方案1】:

SqlBulkCopy 类具有写入多条记录的 WriteToServer 方法。

我创建了一个实现IDataReader 接口的类,我可以将它作为参数传递给SqlBulkCopy.WriteToServer 方法(有关如何实现IDataReader 接口的示例,请参见ADO.NET: Building a Custom Data Provider for Use with the .NET Data Access Framework)。

可能有比实现IDataReader 更简单的方法(即使用其他SqlBulkCopy.WriteToServer 方法之一)。

【讨论】:

    【解决方案2】:

    我认为一般的经验法则是您不想为每个插入打开/关闭连接。听起来很明显,值得一提的是,我已经两次目睹了这个问题,都是在 SQL Server 上。在一个循环中,我修复的代码调用了一个外部类库,它打开/关闭每个插入的连接。在忙碌的一天,连接池填满了,异常变得疯狂。它也会导致其他应用程序出错,因为无法建立连接。当然,解决方法是在循环之前打开连接,在循环中调用 ExecuteNonQuery() 函数(一遍又一遍),然后在循环之后关闭连接。看似微不足道,但确实是一个常见的错误。

    最好的问候...

    【讨论】:

      【解决方案3】:

      如果您的数据存储在 Csv 或 XML 中,您可以使用 SQL Server 导入记录(假设您使用的是 SQL Server)

      【讨论】:

      • 抱歉,刚刚看到你之前的评论。所有数据都在内存/简单类中。
      【解决方案4】:

      如果源数据位于文本文件(CSV 或您可以阅读的某些标准)中,请使用 StreamReader 读取每一行,并使用一个函数获取该行并将其转换为单个插入语句。那就让它飞吧

      例如,假设您有这样的文件:

      foo 1
      bar 2
      baz 3
      ...
      
      
      using(StreamReader sr = new StreamReader(File.Open("sourcefile.txt", FileMode.Open)))
      {
        using(SqlConnection conn = new SqlConnection(connectionString))
        {
         conn.Open();
        string line ="";
        while((line = sr.ReadLine()) != "")
        {
           string[] parts = line.split(new string[]{" "}, StringSplitOptions.None);
           string cmdTxt = String.Format("INSERT INTO MyTable(name, value) VALUES('{0}','{1}')", parts[0], parts[1]);
      
            using(SqlCommand cmd = new SqlCommand(cmdTxt, conn))
            {
               cmd.ExecuteNonQuery();
            }
         }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 2013-04-04
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多