2

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

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

4

4 回答 4

5

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

我创建了一个实现IDataReader接口的类,我可以将它作为参数传递给SqlBulkCopy.WriteToServer方法(有关如何实现接口的示例,请参见ADO.NET:构建与 .NET 数据访问框架一起使用的自定义数据提供程序IDataReader)。

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

于 2009-02-14T02:36:17.807 回答
3

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

最好的祝福...

于 2009-02-14T02:42:36.467 回答
0

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

于 2009-02-14T02:27:35.690 回答
0

如果源数据位于文本文件(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();
      }
   }
}

}

于 2009-02-14T02:43:45.760 回答