2009年3月27日金曜日

[.NET]コントロールとデータのバインド

.NET Frameworkのコントロールには、DataBindingsというプロパティがあります。
コレを使うと、画面⇔データクラスのプロパティといった単純なデータのコピーを自動でやってくれます。
コードはこんな感じ。

Data data = new Data();

//Bindingのコンストラクタは、以下のとおり
//new Binding([コントロールのプロパティ], [対象のインスタンス], [対象のプロパティ])
//txtText:テキストボックス chkDelete/chkUpdate:チェックボックス

// データバインドする画面のコントロール
txtText.DataBindings.Add(new Binding("text"data"Text"));
chkDelete.DataBindings.Add(new Binding("checked"data"Delete"));
chkUpdate.DataBindings.Add(new Binding("checked"data"Update"));


■データクラス
//データクラス
public class Data
{

    private string text;
    public string Text
    {
        get { return text; }
        set { text = value; }
    }

    private bool update = true;
    public bool Update
    {
        get { return update; }
        set { update = value; }
    }

    private bool delete = true;
    public bool Delete
    {
        get { return delete; }
        set { delete = value; }
    }
}

2009年3月19日木曜日

[.NET]INSERT時の自動採番される値を取得する(SQLSERVER)(その4)

GDD Blog: [.NET]INSERT時の自動採番される値を取得する(SQLSERVER)(その2)では、SQL(T-SQL)のレベルで、自動生成されるIDのことを書きましたが、これをADO.NETで実装してみました。コードはこんな感じ。

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

    //INSERT文の後ろにSELECT文をくっつけておく
    string sql = "INSERT INTO tblTEST(text1,text2)"
           + " VALUES (@text1,@text2);"
           + "SELECT @id = IDENT_CURRENT('tblTEST')";


    using(SqlConnection con = new SqlConnection(CON_STR))
    using(SqlCommand cmd = new SqlCommand(sql,con)){

        con.Open();

        //INSERT用のデータをセットする
        cmd.Parameters.Add("@text1"SqlDbType.VarChar10).Value = "text1";
        cmd.Parameters.Add("@text2"SqlDbType.VarChar10).Value = "text2";
        //OUTパラメータをセットする
        cmd.Parameters.Add("@id"SqlDbType.Int).Direction = ParameterDirection.Output;

        //SQL実行
        int result = cmd.ExecuteNonQuery();

        //結果表示
        System.Diagnostics.Debug.WriteLine(String.Format("Result ={0} ID={1}",resultcmd.Parameters["@id"].Value));

        con.Close();
    }
}


■実行結果(すでに10レコード入っている)
Result =1 ID=11


■DBの状態

p_key text1 text2
----------- ---------- ----------
1 NULL NULL
2 text1 text2
3 text1 text2
4 text1 text2
5 text1 text2
6 text1 text2
7 text1 text2
8 text1 text2
9 text1 text2
10 text1 text2

2009年3月15日日曜日

[.NET]丸め(Math.Round)

金額の計算などで、小数点以下を操作することがあります。
.NETではMathというクラスに小数点以下を丸める機能が提供されています。丸めにもいろいろな考え?(という規格)があるようで、四捨五入と最近接偶数丸めという2種類が提供されています。コードはこんなかんじ。

double[] datas = { 10.1510.2510.3510.4510.55 };

foreach (double data in datas)
{
    //偶数丸め
    double data1 = Math.Round(data1MidpointRounding.ToEven);
    //四捨五入
    double data2 = Math.Round(data1MidpointRounding.AwayFromZero);
    System.Diagnostics.Debug.WriteLine(
        string.Format("入力=[{0}]偶数丸め=[{1}] 四捨五入=[{2}]"datadata1data2));
}


実行結果
入力=[10.15]偶数丸め=[10.2四捨五入=[10.2]
入力=[10.25]偶数丸め=[10.2四捨五入=[10.3]
入力=[10.35]偶数丸め=[10.4四捨五入=[10.4]
入力=[10.45]偶数丸め=[10.4四捨五入=[10.5]
入力=[10.55]偶数丸め=[10.6四捨五入=[10.6]



ちなみに.NET Framework 1.1までは偶数丸めのみで、四捨五入が提供されていないようでうす。

2009年3月12日木曜日

[他]SQLServer2008 Express用 SMS (その2)

GDD Blog: [他]SQLServer2008 Express用 SMSでは「Microsoft® SQL Server® 2008 Express with Tools」からインストールする方法を紹介しましたが、今日偶然Microsoft SQL Server 2008 Management Studio Expressが単品でダウンロードできることを知りましたので、備忘録としてメモ。

2009年3月9日月曜日

[.NET]CLR プロファイラ

.NETアプリケーションはJavaVMと同じように、メモリ管理を自動的に行います。
しかし、メモリリークやメモリの利用効率が悪い場合など調査するを知りませんでした。先日某掲示板を見ていると、CLR プロファイラなるツールが紹介されていました。備忘録としてメモ。

2009年3月6日金曜日

[.NET]INSERT時の自動採番される値を取得する(SQLSERVER)(その3)

GDD Blog: [.NET]INSERT時の自動採番される値を取得する(SQLSERVER)(その2)」ではIDENT_CURRENT()にて、テーブル単位で自動生成されるIDを取得する方法を紹介しました。

このIDなんですが、どうもSQLServer側で管理しているらしく、コネクションを飛びこえて取得できることがわかりました。そのため、INSERT後しばらく処理時間が必要なSQLを実行し、IDENT_CURRENT()で値を取得すると、自分がINSERTした時点で振られるIDと別のIDが取れてしまう可能性があります。
そういうわけで、別の接続からINSERTされている可能性を考慮する必要がありすね。マルチスレッド環境でのstaticなメンバー変数と同じようなイメージです。

SQLServer2008 Express Editionで試す限りでは、トランザクションかけていても制御できないようです。

結局のところINSERTの後@@IDENTITYを参照するなどしたほうが無難ということになりますね。

2009年3月4日水曜日

[.NET]C#のInterface

C#やJavaのInterfaceに定義されたインタフェースはすべてPublicになる。と思っていましたが、C#の場合、以下のような方法で制御することが可能です。

//メソッド単位での制御ではありませんが、同DLL内のみに公開
internal interface Hogehoge
{
}


AssemblyInfo.cs
//公開先のアセンブリはInternalのレベルまで参照可能
[assemblyInternalsVisibleTo("公開先のアセンブリ")]

2009年3月2日月曜日

[.NET]ジャグ配列と多次元配列

C#で配列を操作する場合2種類の方法があります。
  1. ジャグ配列( 例 int[1][5])
  2. 多次元配列 (例 int [1,5])


多次元配列はC/C++などでいう配列(まぁそのまんまですね)ですが、ジャグ配列は配列の配列です。こちらは、Javaなど比較的新しい言語でも採用されている方式です。

C#ではこの両方を扱うことができますが、ジャグ配列では要素へのアクセスは常に間接参照となります。
bitmapの操作など、多くの回数の配列操作を行う場合、多次元配列を使うとパフォーマンスがよくなることがあるそうです。