C# で大量のデータをDatasetでインサートしようとすると遅くて使えないと思いSSISで処理を書いていた。
今更だがSqlBulkCopyを知ることができた。
下記コードはOracleからSQLServerへデータをインポートするサンプルであらかじめSQL Server Management Studioのインポート機能を使いOracleからテーブル情報のみ取得してSQL Serverにテーブルを作成してある。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;
using Oracle.DataAccess.Client;
using SampleBulkCopy.Properties;
namespace SampleBulkCopy
{
class Program
{
static void ExecuteCopy(string tableName)
{
using (var connSrc = new
OracleConnection(Settings.Default.OracleConnectionString))
using (var connDest = new
SqlConnection(Settings.Default.SqlConnectionString))
{
connSrc.Open();
connDest.Open();
var sql = string.Format("SELECT * FROM {0} ", tableName);
var cmd = new OracleCommand(sql, connSrc);
using (var rd = cmd.ExecuteReader())
{
using (var bulk = new SqlBulkCopy(connDest))
{
bulk.BulkCopyTimeout = 10000;
bulk.DestinationTableName =
string.Format("dbo.{0}", tableName);
bulk.WriteToServer(rd);
}
}
}
}
static void Main(string[] args)
{
ExecuteCopy("TABLE");
}
}
}
DataRaderを渡すだけでInsert 出来るのは良い。
Oracleからテーブル情報を取得するさい、Date型がそのままDate型になるので、テーブル定義するさいDateをDateTimeに変換すると良い。