我需要在表中插入一堆类似的记录,并想知道是否有一个很好/简单的方法来做到这一点。
我知道建立一个大字符串会很容易,但我希望我能找到更优雅的方法来做到这一点。
答案 0 :(得分:5)
SqlBulkCopy
类有WriteToServer
个方法,可以写多个记录。
我创建了一个实现IDataReader
接口的类,我可以将其作为参数传递给SqlBulkCopy.WriteToServer
方法(有关如何实现{{1}的示例,请参阅ADO.NET: Building a Custom Data Provider for Use with the .NET Data Access Framework接口)。
可能有一种比实现IDataReader
更简单的方法(即使用其他IDataReader
方法之一)。
答案 1 :(得分:3)
我认为一般的经验法则是您不希望为每个插入打开/关闭连接。听起来很明显,值得一提的是,我已经两次使用SQL服务器见证了这个问题。在循环内部,我修复的代码称为外部类库,它打开/关闭每个插入的连接。在忙碌的一天,连接池已满,异常激增。它也导致其他应用程序出错,因为无法建立连接。当然,修复是在循环之前打开连接,在循环内调用ExecuteNonQuery()函数(反复遍历),并在循环之后关闭连接。看似微不足道,但这确实是一个常见的错误。
最好的问候......
答案 2 :(得分:0)
如果您的数据存储在Csv或XML中,您可以使用SQL服务器导入记录(假设您使用的是SQL服务器)
答案 3 :(得分:0)
如果源数据位于文本文件中(CSV或某些标准,您可以阅读),请使用StreamReader读取每一行,以及一个接受该行并将其转换为单个insert语句的函数。然后让它飞起来
例如,假设你有一个这样的文件:
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();
}
}
}
}