2009-07-06 75 views
0

我有一个小型作业,需要一个电子邮件/邮政编码的文本文件并将它们插入到sql server 2005表中。它读取源文件的每一行,检查它是否解析为有效的电子邮件地址/邮政编码,创建sql插入命令,将其添加到字符串构建器并最终执行它。我想做一个单独的执行而不是单个的sql调用,因为可能会有几千个插入。创建批处理的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) 

谢谢

回答

1

对于批量插入,看看.NET 2.0起,SqlBulkCopy类(在System.Data.SqlClient命名空间)

马克Gravell在这里公布了其使用的例子SO:Copy from one database table to another C#

更新响应评论:你可以读取数据净化成DataTable,并利用该SqlBulkCopy ,类似于这个example

+0

然后将原始源文件清理成另一个平面文件然后使用SqlBulkCopy类是正确的方法吗? – GernBlandston 2009-07-06 15:00:40

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 

您可以保留一个计数器,该计数器存储已排队的记录数,然后在指定的批处理大小后执行。