我有一份小作业,它接收电子邮件/邮政编码的文本文件,并将它们插入到sql server 2005表中。它读取源文件的每一行,检查以确保它解析为有效的电子邮件地址/邮政编码,创建一个sql insert命令,将其添加到字符串构建器并最终执行它。我想做一次执行而不是单独的sql调用,因为可能有几千个插入。
这有效,但我想知道这是不是一个坏方法。这里最好的做法是什么?
Dim SqlString As String = "insert into [CollectedEmail] values('{0}','{1}');"
Do Until sourceFile.Peek = -1
line = sourceFile.ReadLine
If line.Length > 0 Then
Dim emailAddress As String = Trim(line.Substring(0, EmailLength))
Dim zipcode As String = Trim(line.Substring(EmailLength + 2, ZipCodeLength))
If CVal.validEmail(emailAddress) AndAlso CVal.validZip(zipcode) Then
SQL.AppendLine(String.Format(SqlString, emailAddress, zipcode))
ElseIf CVal.validEmail(emailAddress) Then
SQL.AppendLine(String.Format(SqlString, emailAddress, ""))
Else
badAddresses.WriteLine(emailAddress)
End If
End If
Loop
InsertToDatabase(SQL.ToString)
谢谢
答案 0 :(得分:1)
对于批量插入,请查看.NET 2.0以上版本,SqlBulkCopy类(在System.Data.SqlClient命名空间中)
Marc Gravell在SO上发布了一个使用它的示例:Copy from one database table to another C#
更新以回复评论:您可以将已清理的数据读入DataTable
,并将其与SqlBulkCopy
一起使用,类似于此example。< / p>
答案 1 :(得分:0)
如果您有sql server 2008,那么您可以使用表值参数,请参阅此处获取更多信息Table-Valued Parameters in SQL Server 2008和示例代码。否则请批量插入
答案 2 :(得分:0)
您还可以将电子邮件捆绑到XML参数中,并拥有一些能够处理它的存储过程。
CREATE PROCEDURE [dbo].[saveEmails]
(
@emails xml
)
AS
BEGIN
SET NOCOUNT ON;
insert into collectedemail
(address
,zipcode)
select
x.value('address[1]', 'nvarchar(255)')
,x.value('zipcode[1]', 'nvarchar(10)')
from @emails.nodes('/items/item') emails(x)
END
GO
您可以保留一个计数器,用于存储排队的记录数,然后在您指定的批量大小后执行。