2009-07-06 10 views
0

私は、電子メール/郵便番号のテキストファイルを取り込んでSQL Server 2005テーブルに挿入する小さな仕事をしています。ソースファイルの各行を読み込み、有効な電子メールアドレス/郵便番号を解析し、sqlの挿入コマンドを作成し、文字列ビルダーに追加して最終的に実行します。私は個々のSQL呼び出しの代わりに1回の実行をしたいのですが、おそらく数千の挿入があるでしょう。バッチ処理された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) 

以降は、.NET 2.0をチェックアウトし、あなたに一括挿入するため

答えて

1

ありがとう、(System.Data.SqlClient名前空間内)SqlBulkCopyクラス

マルクGravellはここにその使用例を掲載しましたSO:あなたはDataTableにクレンジングデータを読み込み、そのSqlBulkCopyで使用することができます。をコメントに反応してCopy from one database table to another C#

を更新しましたこれと類似していますexample

+0

元のソースファイルを別のフラットファイルにクリーンアップしてから、SqlBulkCopyクラスを使用するのが正しい方法ですか? – GernBlandston

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 

あなたがキューに入れられた後、指定したバッチサイズの後に実行しているどのように多くのレコードが格納カウンタを維持することができます。

関連する問題