2009年5月25日月曜日

[.NET]Excelを操作する(OleDb)

GDD Blog: [.NET]CSVデータを操作する(OleDb)では、CSVファイルを扱ってみましたが、今度はExcelファイルをOleDBとして扱ってみました。CSV同様にレコードの削除はできませんでしたが、更新は可能なようです。
コードはこんな感じ。

const string CONNECT_TEMPLATE = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                       @"Data Source={0};" +
                       ";Extended Properties=\"Excel 8.0;HDR=YES;\"";

private void button1_Click(object senderEventArgs e)
{
    //using System.Data.OleDb;
    //using System.IO;

    string fileName = @"c:\temp\test.xls";
    string sql = "";

    //ファイルがあったら消す
    if (File.Exists(fileName))
    {
        File.Delete(fileName);
    }

    //接続文字列
    string conString = string.Format(CONNECT_TEMPLATEfileName);
    //コネクションの作成
    using (OleDbConnection con = new OleDbConnection(conString))
    {
        con.Open();

        //テーブルの作成
        System.Diagnostics.Debug.WriteLine("■テーブルの作成");
        sql = "CREATE TABLE USER_DATA (ID char(255), NAME char(255), AGE int, ADDRESS char(255), UPD date)";
        using (OleDbCommand cmd = new OleDbCommand(sqlcon))
        {
            cmd.ExecuteNonQuery();
        }   

        //情報の登録
        sql = "INSERT INTO USER_DATA(ID,NAME,AGE,ADDRESS,UPD) VALUES (?, ?, ?, ?, ?)";
        System.Diagnostics.Debug.WriteLine("■情報の登録");
        using (OleDbCommand cmd = new OleDbCommand(sqlcon))
        {
            for (int i = 0i < 10i++)
            {
                cmd.Parameters.Clear();

                cmd.Parameters.Add("ID"OleDbType.VarChar).Value = "ID" + i.ToString();
                cmd.Parameters.Add("NAME"OleDbType.VarChar).Value = "なまえ" + i.ToString();
                cmd.Parameters.Add("AGE",OleDbType.Integer).Value = i+10;
                cmd.Parameters.Add("ADDRESS"OleDbType.VarChar).Value = "住所" + i.ToString();
                cmd.Parameters.Add("UPD"OleDbType.Date).Value = DateTime.Now;
                    
                cmd.ExecuteNonQuery();
            }
        }

        //最大値の取得
        sql = "SELECT MAX(AGE) FROM USER_DATA";
        System.Diagnostics.Debug.WriteLine("■最大値の取得");
        using (OleDbCommand cmd = new OleDbCommand(sqlcon))
        {
            //スカラー値を取得します
            object obj = cmd.ExecuteScalar();

            StringBuilder sb = new StringBuilder();
            sb.AppendLine("--------------------------------------");
            sb.Append("実行結果 [").Append(obj).Append("]\r\n");
            sb.AppendLine("--------------------------------------");
            System.Diagnostics.Debug.WriteLine(sb.ToString());

        }


        //参照系SQLの実行
        System.Diagnostics.Debug.WriteLine("■参照系SQLの実行");
        sql = "SELECT * FROM USER_DATA";
        using (OleDbCommand cmd = new OleDbCommand(sqlcon))
        using (OleDbDataReader rd = cmd.ExecuteReader())
        {
            PrintData(rd);
        }


        //「この ISAM では、リンク テーブル内のデータを削除することはできません。」
        //という例外が発生する。Excelでが行削除ができないらしい。
        ////削除SQLの実行
        //sql = "DELETE FROM USER_DATA WHERE AGE = 17";
        //using (OleDbCommand cmd = new OleDbCommand(sql, con))
        //{
        //    //更新処理を実行します
        //    int result = cmd.ExecuteNonQuery();

        //    StringBuilder sb = new StringBuilder();
        //    sb.AppendLine("--------------------------------------");
        //    sb.Append("削除件数 [").Append(result).Append("]\r\n");
        //    sb.AppendLine("--------------------------------------");
        //    System.Diagnostics.Debug.WriteLine(sb.ToString());
        //}

        //更新SQLの実行
        sql = "UPDATE USER_DATA SET ADDRESS='更新したよーん' WHERE AGE > 16";
        System.Diagnostics.Debug.WriteLine("■更新SQLの実行");
        using (OleDbCommand cmd = new OleDbCommand(sqlcon))
        {
            //更新処理を実行します
            int result = cmd.ExecuteNonQuery();

            StringBuilder sb = new StringBuilder();
            sb.AppendLine("--------------------------------------");
            sb.Append("更新件数 [").Append(result).Append("]\r\n");
            sb.AppendLine("--------------------------------------");
            System.Diagnostics.Debug.WriteLine(sb.ToString());
        }

        //SQL実行結果の確認
        System.Diagnostics.Debug.WriteLine("■SQL実行結果の確認");
        sql = "SELECT * FROM USER_DATA WHERE AGE > 15";
        using (OleDbCommand cmd = new OleDbCommand(sqlcon))
        using (OleDbDataReader rd = cmd.ExecuteReader())
        {
            PrintData(rd);
        }
    }

}


private void PrintData(OleDbDataReader rd)
{
    StringBuilder sb = new StringBuilder();
    //カラム名を取得し、カンマ区切りで編集します
    sb.AppendLine("--------------------------------------");
    for (int cnt = 0cnt < rd.FieldCountcnt++)
    {
        sb.Append(rd.GetName(cnt)).Append(",");
    }
    sb.Remove(sb.Length - 11);
    sb.AppendLine("");
    sb.AppendLine("--------------------------------------");

    //データを取得しカンマ区切りで編集します
    for (int row = 0rd.Read(); row++)
    {
        for (int col = 0col < rd.FieldCountcol++)
        {
            sb.Append(rd.GetValue(col)).Append(",");
        }
        sb.Remove(sb.Length - 11);
        sb.AppendLine("");
    }
    sb.AppendLine("--------------------------------------");

    System.Diagnostics.Debug.WriteLine(sb.ToString());

}


■実行結果

■テーブルの作成
■情報の登録
■最大値の取得
--------------------------------------
実行結果 [19]
--------------------------------------

■参照系SQLの実行
--------------------------------------
ID,NAME,AGE,ADDRESS,UPD
--------------------------------------
ID0,なまえ0,10,住所0,2009/04/15 0:07:31
ID1,なまえ1,11,住所1,2009/04/15 0:07:31
ID2,なまえ2,12,住所2,2009/04/15 0:07:31
ID3,なまえ3,13,住所3,2009/04/15 0:07:31
ID4,なまえ4,14,住所4,2009/04/15 0:07:31
ID5,なまえ5,15,住所5,2009/04/15 0:07:31
ID6,なまえ6,16,住所6,2009/04/15 0:07:31
ID7,なまえ7,17,住所7,2009/04/15 0:07:31
ID8,なまえ8,18,住所8,2009/04/15 0:07:31
ID9,なまえ9,19,住所9,2009/04/15 0:07:31
--------------------------------------

■更新SQLの実行
--------------------------------------
更新件数 [3]
--------------------------------------

■SQL実行結果の確認
--------------------------------------
ID,NAME,AGE,ADDRESS,UPD
--------------------------------------
ID6,なまえ6,16,住所6,2009/04/15 0:07:31
ID7,なまえ7,17,更新したよーん,2009/04/15 0:07:31
ID8,なまえ8,18,更新したよーん,2009/04/15 0:07:31
ID9,なまえ9,19,更新したよーん,2009/04/15 0:07:31
--------------------------------------

0 件のコメント: