Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

CSVをテーブルへ取り込む方法(SQLServerのみ)

多分一番早い方法なのであろう。
(自信なし)
.NET 2.0で導入されたSqlBulkCopyをつかってみる。
SQLServer限定の機能だけど)
中途半端なサンプルしかなかったので簡単に書いてみた。
サンプルコード

        public static void DoConnect()
        {
            //接続文字列の構成
            string connectionString = @"Driver={Microsoft Text Driver (*.txt; *.csv)}; DBQ=C:\Temp";
            string dbStr = @"Data Source=XXXXX;Initial Catalog=XXXX;Persist Security Info=True;User ID=XXXX;Password=XXXX;";

            using (OdbcConnection conn = new OdbcConnection(connectionString))
            {
                try
                {
                    //データベース接続のOpen
                    conn.Open();
                    //CSVを読む
                    OdbcCommand command = new OdbcCommand("SELECT * FROM test.csv",conn);
                    OdbcDataReader reader =  command.ExecuteReader();
                    //データ型をキチンとするならSchemaを使う事!
                    //DataTable t = reader.GetSchemaTable();
                    
                    //入れ込む先のDBへ接続
                    using (SqlConnection scon = new SqlConnection(dbStr))
                    {
                        //接続
                        scon.Open();
                        SqlBulkCopy copy = new SqlBulkCopy(scon);
                        copy.DestinationTableName = "Test";
                        //そのままダイレクトに入れ込むべし
                        copy.WriteToServer(reader);
     
                    }
                }
                finally
                {
                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
            }
        }

内部でbulk insertをやってるようなイメージかな。
OdbcConnectionを使えばExcelとかもガンガン使えちゃいます。
一応SqlBulkCopyもMappingを持っているので項目を入れ替えたりもできます。
つーか.NETのサンプルってメモリを意識していないコード多くない?
そんな人と一緒に仕事したくねえー。

しかしやっと.NETにも少し慣れてきた感が出てきた。
C# 2.0の機能はけっこー使うようになってきた。
(Generic、Nullableとか使用頻度が高くなってきた)

うくく。