bcp(バルクコピー)

.NETでADO Entity Data Modelを使わずに、DataSet、TableAdapterを用いる仕様を練習してみることにした。

練習用のデータベースで適当なものとして、エクセルとしてダウンロードできる厚労省の医薬品データの内用薬を選んだ。

そこから、Visual Studioに内包されているSQL Serverに落とすにはどうしたらよいか。

エクセルから保存したCSVをDB BrowserでSQLiteに取り込んで、SQL Serverのbcpを利用してみた。

12列の1万件程だが、実行ボタンをクリックした瞬間にSQL Serverにデータ複写完了。
データ量が少ないので参考にならないかもしれないが、実感として超高速。

注意点としては、フィールドの数、順番(データ型)が一致してMappingできること。

型はSQLiteのREAL → Decimal、Integer → bit は問題なかった。
Stringの桁あふれはダメみたい。

Imports System.Data.SQLite
Imports System.Data.SqlClient
Imports env = System.Environment

'SQLite側 
 Dim dbPass = env.GetFolderPath(env.SpecialFolder.MyDocuments) & "\Pharmacy.db"
 Using conn As New SQLiteConnection("Data Source= " & dbPass)
     conn.Open()
     Dim commandSourceData As SQLiteCommand = New SQLiteCommand(
         "select * from Naifuku ORDER BY ID", conn)
     Dim adapter As New SQLiteDataAdapter(commandSourceData)
     Dim sourcedata As New DataTable
     adapter.Fill(sourcedata)
     conn.Close()
'SQLServer側
    Dim connectionString = "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=PDrug;Integrated Security=True"
    Using bcp As New SqlBulkCopy(connectionString)
          bcp.DestinationTableName = "Naifuku"
          bcp.BatchSize = 1000
          Try
             bcp.WriteToServer(sourcedata)
          Catch ex As Exception
             MessageBox.Show(ex.Message)
          Finally
             bcp.Close()
          End Try
    End Using
End Using