1

大量のデータをタブ区切りファイルにダンプするレガシー アプリケーションがあります。各ファイルには単一のレコード タイプが含まれ、すべてのフィールドは固定長です。

これらのファイルは、コマンド ラインから 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

4

1 に答える 1

0

SqlDMO は Sql サーバー 2012 で廃止されましたが、Sqlserver 2008 R2 バージョンまで利用できます。SqlBulkCopy は、1.1 を除く 4.5 までのすべての .net フレームワークで使用できます。

確認のためにこのリンクを参照してください

BULK INSERT (コマンド ライン ユーティリティ) を使用して、一度に複数のレコードを挿入できます。

BULK
INSERT Tablename
FROM 'c:\csvtest.txt'
WITH
(
    FIELDTERMINATOR = ','
    ,ROWTERMINATOR = '\n'
    --,FIRSTROW = 2
    --,MAXERRORS = 0
)
GO
于 2012-05-25T07:19:07.717 に答える