2009年5月28日木曜日

[.NET]].NET Frameworkリファレンスソースダウンロード?

GDD Blog: [.NET].NET Frameworkソース公開(VS2008)では、VSよりソースを参照する方法を書きましたが、リファレンスソースとしてダウンロードすることができることを最近知りました。
インストーラ形式で提供されているようです(100MB近くありまあす)。

ぱっとみ、System.Windows.Controls.TextBox.csなど基本的なコントロールのソースはそろっているみたいです。カスタムコントロールなど作るときに参考になりそうですね。

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
--------------------------------------

2009年5月23日土曜日

[他]T-SQLでSQLのミリ秒単位で時間を計測する

パフォーマンスチューニングをする場合、基本的に少し直しては計測するという繰り返しになります。
SQLの場合、実行計画を元に修正案を検討し、プロファイルツールなどで時間を計測します。

SQLServer2005以降の場合、SQLServer Management Studioというツールがあり、このツールにてSQLを実行することができます。SQLを実行するとステータスバー右下に実行時間が出ます。

しかし、T-SQL(ストアド)の特定の区間のスプリットを出したい場合や正確な時間を計測したい場合には向きません。
そこで、T-SQLを使ってミリ秒単位の時間を出力する例を備忘録としてメモ。

SET NOCOUNT on

DECLARE @START_TIME datetime
SET @START_TIME = GETDATE()

--時間のかかるSQL

PRINT 'TIME=' + CONVERT(VARCHARGETDATE()-@START_TIME,114

2009年5月20日水曜日

[SQL]T-SQLで大量のダミーデータを作る(SQLServer)

先日、SQLServeで大量のダミーデータを登録する必要があり、泣く泣くツールを作ろうと考えましたが、T-SQLでもできるかも?と思いやってみたらソレらしくできました。コードはこんな感じ。

DECLARE @CNT int
DECLARE @CNT_MAX int
SET @CNT = 0
SET @CNT_MAX = 100000

WHILE @CNT < @CNT_MAX 
BEGIN
  INSERT INTO tblTEST(text1text2)
  VALUES(
    'T1-' + CONVERT(VARCHAR@CNT),
    'T2-' + CONVERT(VARCHAR@CNT)
  )
  SET @CNT = @CNT + 1
END
PRINT 'INERT END CNT=' + CONVERT(VARCHAR@CNT)

2009年5月18日月曜日

[他]Windows Updateでの.NET Frameworkのインストール

先日、w2kマシンの再セットアップ後、Windows Update中にマシンが再起動してしまいました。
どうも、.NET Framework系のセットアップ中だったらしく、その後、何度Windows Updateを実施しても、エラーが発生し、正常終了しなくなってしまいました。

で、Windows Updateの結果画面に表示された「エラー コード: 0x66A」というメッセージを頼りに検索してみると、「Automated cleanup tool to remove the .NET Framework 1.0, 1.1, 2.0, 3.0 and 3.5」というツールが存在することがわかりました。

.NET Frameworkのバージョンを指定して削除することができるようなのですが、この際なので、全削除してインストール。うまくいきました。

2009年5月17日日曜日

[他]PowerShell関係のツール

先日、Excelを開いてアレして・・・みたいな繰り返し作業がありましたので、VBScriptでスクリプトで自動化を考えました。しかしVBScriptでは型情報が定義できないので、WSHにチャレンジしようとおもい調査しました。調査の中でPowerShellという選択肢があることに気づきました。ということで、PowerShellについて調査してみました。

VBS/WSHともにしらないだけかもしれませんが、開発支援系のツールが無いので、意外と面倒だったんですが、PowerShellではPowerShell Analizerというツールがあることがわかりました。
このツール無償なんですが、VS.NETのようなインテリセンス機能が搭載されているため、なんとなく開発している感が出ます。

C#に近いとはいえ、PowerShellの文法に慣れるのにはちょっと時間がかかりそうです。というかコマンドレットを覚えないと。。。

2009年5月8日金曜日

[SQL]INFORMATION_SCHEMA

SQLServerでは、sysobjectというシステムに関する情報が入ったテーブルがあります。
以前、ここからテーブルの一覧を取って、各テーブルの件数を取得するスクリプトを作りました。

で、その後、各テーブルの主キー名とフィールド名を取得するために調査するために調査していると、INFORMATION_SCHEMA.xxx というテーブルがあることがわかりました。
このテーブルはほとんどのDBMSに実装されているらしく、存在を知っておいて損は無いと思います。コレは、SQLServerの資料ですが、どのDBMSでもある程度参考になると思います。

ちなみに主キーを調べるのに、INFORMATION_SCHEMA.TABLE_CONSTRAINTSを使いました。

2009年5月2日土曜日

[他]MSProjectのViewerが。。。

最近かかわっているプロジェクトではMSProjectを使用してプロジェクトを管理しています。
しかし、管理者のみソフトをインストールしており、他のメンバーまでライセンスが行き届きません。そのため開発メンバーは見ることができません。

で、VisioやExcelのようにViewerがあるだろうと思って探していましたが、コレが見つかりません。おそらく無いと思われます(2009.4時点)。
PDFにしておいてありますが、1週間前の情報をおかれても。。。というのがあります。でいろいろ調べて変わりに見つけたのがOpenProjです。

見た目はほとんどMSProjectで、印刷もできます。しかし、印刷は思うようなページレイアウトにすることができませんでした。
やる方法はあると思いますので、発見したらその辺まとめたいと思います。