我需要将一堆类似的记录插入表中,并且想知道是否有一种很好/简单的方法可以做到这一点。
我知道只构建一个大字符串很容易,但我希望我能找到一种更优雅的方式来做到这一点。
该类SqlBulkCopy
具有WriteToServer
写入多条记录的方法。
我创建了一个实现IDataReader
接口的类,我可以将它作为参数传递给SqlBulkCopy.WriteToServer
方法(有关如何实现接口的示例,请参见ADO.NET:构建与 .NET 数据访问框架一起使用的自定义数据提供程序IDataReader
)。
可能有比实现更简单的方法IDataReader
(即使用其他SqlBulkCopy.WriteToServer
方法之一)。
我认为一般的经验法则是您不想为每个插入打开/关闭连接。听起来很明显,值得一提的是,我已经两次目睹了这个问题,都是在 SQL Server 上。在一个循环中,我修复的代码调用了一个外部类库,它打开/关闭每个插入的连接。在忙碌的一天,连接池填满了,异常变得疯狂。它也会导致其他应用程序出现错误,因为无法建立连接。当然,解决方法是在循环之前打开连接,在循环中调用 ExecuteNonQuery() 函数(一遍又一遍),然后在循环之后关闭连接。看似微不足道,但确实是一个常见的错误。
最好的祝福...
如果您的数据存储在 Csv 或 XML 中,您可以使用 SQL Server 导入记录(假设您使用的是 SQL Server)
如果源数据位于文本文件(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();
}
}
}
}