2009年7月28日火曜日

[.NET]ADO.NETで複数の実行結果を取得する

ADO.NETでは、一回のクエリーにて、複数のSQLを送り込むことができます。
たとえば、「Select * form TBL1;Select * form TBL2」というSQLを実行すると同時に2のクエリーを実行してくれます。これはSELECTだけではなく他のUPDATEやDELETEも実行できます。SQLServerでいえば、T-SQLの実行相当を行うことができます。

複数のSQLを実行した場合、複数の結果を取得するためにどのようにすればよいかというと、SqlDataReader.NextResultを使います。
詳しい説明は、DataReader によるデータの取得が参考になると思います。

で、コードはこんな感じ。

private void button1_Click(object senderRoutedEventArgs e

    using (SqlConnection con = new SqlConnection("接続文字列")) 
    using (SqlCommand cmd = new SqlCommand("適当なT-SQL"con)) 
    { 
        con.Open(); 
        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            do
            {
                //実行したSQLに対する処理
            } while (dr.NextResult());
        }
    } 

2009年7月23日木曜日

[.NET]クエリアナライザのようにエコーバック?する

SQLServerのクエリアナライザやSQL Server Management Studioのようにprint文で実行した結果ってどうやって取得するんだろうというのが気になったので調べてみました。
調べてみると、SqlConnection.InfoMessageというイベントで処理できることがわかりました。で実装してみました。コードはこんな感じ。
private void button1_Click(object senderRoutedEventArgs e)
{
    using (SqlConnection con = new SqlConnection("接続文字列"))
    using (SqlCommand cmd = new SqlCommand("print 'aaa'"con))
    {
        con.InfoMessage += new SqlInfoMessageEventHandler(con_InfoMessage);
        con.Open();
        using (SqlDataReader dr = cmd.ExecuteReader()){
        }
    }
}


void con_InfoMessage(object senderSqlInfoMessageEventArgs e)
{
    System.Diagnostics.Debug.WriteLine(e.Message);
}

2009年7月17日金曜日

[.NET]WPFアプリケーションのレイアウト

先日初めてWPFアプリケーションを作ってみました。
とりあえずいつものようにコントロールをレイアウト。。。しようと思ったんですが、Docっぽいプロパティがない!。で調べてみると、DockPanelを使ってレイアウトするららしい。というのがわかりました。

でやってみました。例を載せようと思いましたが、上のリンクに書いてあるので省略。

2009年7月15日水曜日

[.NET]constとstatic readonly

constとstatic readonly。どちらも定数定義などに利用できます。
何かが違うはず。ということで、パフォーマンスの比較をやってみました。
コードがアレなので、違いが出なかっただけかもしれませんが。ほとんど誤差レベルしか差が出ませんでした。
ちなみに、static readonlyをstaticにしましたが、あまり変化が無く、誤差レベルでした。
そういう意味で(どういう意味だ?)staticで定義しておけばアセンブリが分かれてもリビルドが不要なため、staticのほうがいいといえるのかも知れません。

static readonly string STATIC_READONLY_STR = "aaaa";
const string CONST_STR = "aaaa";

//    -----------------------------------

for (int cnt = 0cnt < maxcnt++)
{
    if (CONST_STR == "aaaa")
    {
        dummy++;
    }
    else
    {
        dummy--;
    }
}

//-----------------------------------

for (int cnt = 0cnt < maxcnt++)
{
    if (STATIC_READONLY_STR == "aaaa")
    {
        dummy++;
    }
    else
    {
        dummy--;
    }
}

2009年7月12日日曜日

[.NET]月末日を取得する

月末日は、31,30,28の場合があります。さらにうるう年の場合を考慮する必要があります。普通に考えるとメンドクサイ処理を組む必要がありイラっとくるのですが、それを簡単に算出する方法を教えてもらいましたので紹介します。コードはこんな感じ。

int yyyy = 2008;
int mm = 12;

//指定月を日付型に
DateTime dt = new DateTime(yyyymm1);
//+1ヶ月
dt = dt.AddMonths(1);
//-1日
dt = dt.AddDays(-1);

System.Diagnostics.Debug.WriteLine(string.Format("結果={0:yyyy/MM/dd}"dt));


指定月の翌月1日の前日が月末日。。。まぁいわれてみればそのまんまなんですが。。。

2009年7月8日水曜日

[SQL]行値構成子

先日、SQLでとある要件を満たすUPDATE文を作る機会がありました。
いろいろ調べてみると、UPDATEのWhere句に行値構成子を使うとよさそうということがわかりました。
コードはこんな感じ。

Select * From TBL Where (a,b)=(Select ...)


しかしSQLServerのSMSで試してみると、構文エラーが発生しうまくいきませんでした。
あきらめて、相関副問い合わせ(EXISTS)で何とかその場をしのぎました。

で、その後SQLServerでは行値構成子が使えないということがわかりました。SQL92で規定されているのに。。。

2009年7月6日月曜日

[SQL]テーブルのキーおよび制約の確認(SQLServer )

先日、各テーブルのキーおよび制約について調べる作業をしていました。
既存の資料との突合せであったため、テーブルと資料を確認しながら作業をしていました。
SQLServerなので、1つづつSQL Server Management Studioで見ていけばわかるのですが、だんだん面倒になってきました。
また、ツールなどのインストールに制限があったため、キーおよびキー項目の制約を調査するSQLを作ってみました。コードはこんな感じ。

DECLARE @TABLE_NAME varchar(128);
SET @TABLE_NAME = 'tblTEST3';

SELECT
     ST.name as TABLE_NAME
    ,SI.name as INDEX_NAME
    ,SC.name as COLMN_NAME
    ,SI.type_desc as INDEX_TYPE
    ,CASE SI.is_unique WHEN 1 THEN 'UNIQ' ELSE '' END as UNIQ
    ,CASE SC.is_nullable WHEN 1 THEN '' ELSE 'NON NULL' END as NON_NULL
    --,SI.is_unique
    --,SC.is_nullable
    --,SC.*
    --,SIC.*
FROM SYS.TABLES ST
    INNER JOIN SYS.INDEXES SI on ST.object_idSI.object_id
    INNER JOIN SYS.INDEX_COLUMNS SIC on SI.object_idSIC.object_id AND SI.index_idSIC.index_id
    INNER JOIN SYS.COLUMNS SC ON SC.object_idSI.object_id AND SC.column_id=SIC.column_id
WHERE ST.name = @TABLE_NAME