大量のデータをタブ区切りファイルにダンプするレガシー アプリケーションがあります。各ファイルには単一のレコード タイプが含まれ、すべてのフィールドは固定長です。
これらのファイルは、コマンド ラインから BCP ユーティリティを使用して、SQL サーバー データベースの対応するテーブルに簡単にインポートできます。SQLDMO.BulkCopy ルーチンを使用してこれらのファイルをインポートする VS 2003 で作成された VB.Net プログラムがあります。
SQL Server 2008 で VS 2010 を使用するようにシステムを更新しています。Microsoft のドキュメントによると、SQLDMO は使用できなくなりました。
インターネットで検索し、インポート ルーチンを書き直して、Microsoft.Jet.OLEDB.4.0 プロバイダーを使用してタブ区切りファイルを DataTable にインポートしました。次に、SqlClient.BulkCopy オブジェクトを使用して、この DataTable をインポートします。私が抱えているこの問題は、スペースに設定されているタブ区切りファイルのフィールドが、DataTable にインポートされたときに NULL として扱われていることです。DataTable が SqlClient.BulkCopy によって処理されると、NOT NULL として定義された SQL テーブル フィールドによって null 値が拒否されるため、コピーは失敗します。
テスト中のコードを以下に示します
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim data As DataTable = RetrieveSourceData()
CopyData(data)
End Sub
Private Function RetrieveSourceData() As DataTable
Dim connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\temp\;Extended Properties='text;HDR=No;FMT=TabDelimited'"
Dim sourcedata As New DataTable
Using conn As New OleDb.OleDbConnection(connstring)
conn.Open()
Dim command As New OleDb.OleDbCommand("Select * from X1.CSV", conn)
Dim adapter As New OleDb.OleDbDataAdapter(command)
adapter.Fill(sourcedata)
conn.Close()
End Using
Return sourcedata
End Function
Private Sub CopyData(SourceData As DataTable)
Dim dbConnString As String = "Data Source=(local);Initial Catalog=XtractDB;User ID=xxxx;Password=yyyy;"
Using bcp As New SqlClient.SqlBulkCopy(dbConnString)
bcp.DestinationTableName = "X1"
bcp.BatchSize = 1000
bcp.WriteToServer(SourceData)
End Using
End Sub
入力ファイルが TabDelimited として認識されるようにするには、入力ファイルと同じディレクトリに schema.ini ファイルを作成する必要がありました。内容を以下に示します
[X1.CSV]
Format=TabDelimited
DataTable を作成するときに、スペースを含むフィールドを強制的に NULL として扱わないようにする方法はありますか?
これは、VB.Net プログラムを介して一括コピーを処理するための最良の方法ですか?
ティア、
アンディ
保存先: デフォルト
色のテーマを切り替える
メッセージの背景色を
選択... メッセージ領域の幅を選択...
メッセージ テキストのフォント サイズを調整...
自動リンクを無効にする 頭字語を有効にする メッセージ ヘッダーを無効にする 自動引用を有効にする このスレッドのタイトルを更新する...
SQL 一括コピースレッド # 1544244 メッセージ #1544244