2009年6月28日日曜日

[SQL]SQLServer のエラー一覧

先日たまたま見つけたのですが、SQLServer内部にエラー用のメッセージファイルがあります。
以下のようなSQLで内容を見ることがでます。
select * from sys.messages where language_id=1041


まぁ参考資料ってことで。

2009年6月27日土曜日

[SQL]インデックスつきView(SQLServer)

先日、某掲示板に「SQL Server 2005 インデックス付きビューによるパフォーマンスの向上」というのが紹介されていました。

軽く斜め読みした感じ、以下のような特徴があることがわかりました。


  • 集計を事前に計算し、結果をインデックスとして保存することができる

  • 元となるテーブルのキー項目に変化があると、同時にビューのインデックスも更新される

  • テーブルを事前に結合し、結果のデータを保存することができる

  • 結合または集計の組み合わせを保存できる

とのこと。そして、バッチ的にデータを作成する場合は、一度ビューを削除してからインサートし、その後ビューを再構築すればよいとのこと。この場合24×7のシステムには適応できないので、辺はトレードオフだと思いますが。。。


某客先で、パフォーマンスの出ないビューがあったので、適応できそうか調べてみようと思います。

2009年6月22日月曜日

[.NET]ClickOnce以外でアップグレード

.NET Frameworkでは、ClickOnceというアプリケーション配布の形態があります。
便利な機能とは思いますが、私自身使ったことが無いというのと、資料を読む限り、少々大げさでメンドクサそうという感想があります。

で、古い記事ですが、先日偶然「クライアント・アプリケーション自動更新メカニズムの提案」というのを読みました。

.NET Framwork1.0時代の資料のため、おそらくノータッチ・デプロイメントやClickOnceのような機能が確立する前のものだと思います。

もし、ClickOnceのような枠組みを使いたくない場合は、参考になるかも。

2009年6月19日金曜日

[.NET]IPAddress取得

先日MACアドレスの取得をやったので、ついでにIPアドレスの取得をやってみました。
IPv6の情報も取れるんですねぇ。コードはこんな感じ。

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

    //ホスト名取得
    String host = Dns.GetHostName();
    // IPアドレス取得
    IPAddress[] addrs = Dns.GetHostAddresses(host);
    foreach (IPAddress address in addrs)
    {
        //構成情報出力
        System.Diagnostics.Debug.WriteLine(
            String.Format("Family={0} Adddress={1}",
                address.AddressFamily,
                address.ToString()));
    }
}


■実行結果

Family=InterNetworkV6 Adddress=::1
Family=InterNetwork Adddress=192.168.0.2

2009年6月15日月曜日

[.NET]MACアドレスなどNICの物理情報取得

先日、MSDNを眺めていたら、MACアドレスが取れそうなインタフェースがありました。
気になったのでちょっと試してみました。コードはこんな感じ。

private void button1_Click(object senderEventArgs e)
{
    //using System.Net.NetworkInformation;

    //NIC構成情報取得
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

    String template = "name=[{0}] mac=[{1}] stat=[{2}] speed=[{3}mbps]";

    foreach (NetworkInterface adapter in nics)
    {
        //IPネットワーク構成情報取得
        PhysicalAddress address = adapter.GetPhysicalAddress();

        //構成情報取得
        String name = adapter.Name;
        String stat = adapter.OperationalStatus.ToString();
        double speed = adapter.Speed / 1000000;
        String mac = BitConverter.ToString(address.GetAddressBytes());
        //構成情報出力
        System.Diagnostics.Debug.WriteLine(String.Format(templatenamemacstatspeed));
    }
}


■出力結果

name=[Bluetooth ネットワーク接続] mac=[00-1E-xx-xx-xx-xx] stat=[Down] speed=[0mbps]
name=[ワイヤレス ネットワーク接続] mac=[00-1C-xx-xx-xx-xx] stat=[Up] speed=[48mbps]
name=[ローカル エリア接続] mac=[00-15-xx-xx-xx-xx] stat=[Down] speed=[100mbps]

(注)xxの部分にはMACアドレスが入ります

2009年6月11日木曜日

[他]SQLServerのサービスが起動しない。。。

先日SMSでローカルのSQLServerにログインしようとしたところ、SQLServerが見つからない旨のメッセージが表示され、ログインできなくなってしまいました。
で、調べていくとSQLServerのサービスが起動していないことがわかりました。

しかし起動しない理由がわからず、イベントログを見てみると何かしらエラーなのはわかりましたが、MSのサイトへのリンクが記載されているだけで、リンクを押下してもぴんと来るような情報は得られませんでした。

その後、サービスの設定を確認したところ、起動ユーザがビルドインのユーザではなく、ログインユーザのアカウントになっていました。
その少し前にユーザのパスワードを変更する必要があり、それが原因ということがわかりました。

しかしなぜ、インストール時にサービスの起動ユーザがビルドインアカウントにならなかったのか。。。よくわかりませんね。

2009年6月6日土曜日

[.NET]Text系コントロールのイベント発生順序

いつも、どの順でイベントが発生するかを忘れてしまうのですが、MSDN(Control.Validated イベント)にまとまった記載があったので備忘録としてメモ。抜粋は以下のとおり。

■キーボード(Tab)での遷移の場合
  1. Enter
  2. GotFocus
  3. Leave
  4. Validating
  5. Validated
  6. LostFocus

■マウス or Focusメソッド

  1. Enter
  2. GotFocus
  3. LostFocus
  4. Leave
  5. Validating
  6. Validated

・・・微妙にイベントの発生順が違う。。。

2009年6月1日月曜日

[.NET]型付DataSetの入力検証を一時的に保留する

.NET Frameworkで提供されている型付DataSetは便利なクラスです。
簡単なデータ構造を一時保存したい場合や、DBの取得結果をキャッシュしたい場合などに特に便利です。
しかし、フィールドのに制約をつけるとプロパティをセットした瞬間にエラーとなります。それをすべてのフィールドをセットした後にチェックする方式にできないかなぁと思っていたら、DataRow.BeginEditをつかえば実現できるということがわかりました。コードはこんな感じ。

TestDataSet.DataTable1DataTable dt = new TestDataSet.DataTable1DataTable();
TestDataSet.DataTable1Row row = dt.NewDataTable1Row();

//インクリメントタイプのフィールド
row.AutoIncKey = 1;
//桁数指定(Max3桁)
row.LimitData = "abc";
//NotNull
row.NotNullData = "123";

dt.Rows.Add(row);

TestDataSet.DataTable1Row row2 = dt.NewDataTable1Row();
row2.AutoIncKey = 2;
row2.LimitData = "cde";
row2.NotNullData = "456";

dt.Rows.Add(row2);
dt.AcceptChanges();

dt[1].BeginEdit();

//キー重複
dt[1].AutoIncKey = 1;
//桁数オーバー
dt[1].LimitData = "4567";
//NotNull
dt[1].NotNullData = null;

//BeginEditするとEndEditまたはAcceptChangesまでチェックが保留される
dt[1].EndEdit();
dt.AcceptChanges();