2009年3月17日火曜日

DataRepeater.ItemTemplate内部でのTabIndex

アンバウンドで使いたいがためにカスタマイズ中w
色々手を入れていると少々気になる挙動が。

デザイン時にコントロールをドロップして、ItemTemplateに追加するんだけどこの時各コントロールのTabIndexは重複できるんだねぇ。今までは重複不可と思っていたんであまり意識しないで順番につけていたんだけど。

EnterキーをTabに変換するようDataRepeater.ProcessDialogKeyメソッドをオーバーライドしてみたんだけど、デザイン時にTabIndex=0としておいたコントロールが、何故だか一番最後にフォーカスを得るようになってしまうんだよね。ItemTemplate内部ではちゃんと0オリジンで設定されているんだけど、実際に表示されているカレントアイテム内部ではTabIndex=0のコントロールのTabIndexが末尾のインデックスに置き換わっていたんだよねぇ。

最初は自分が追加したロジックを疑っていたんだけど、TabIndexなんて調整しないからなー、と試しに試してようやく現象発覚。

デザイン全部直してもらうなんてのも大変なので、とりあえずどこかのタイミングでTabIndex再調整ロジックが動くようにしておけばなんとかなるかな・・・?

多分行ヘッダが追加された時に再割り当てされているんだとは思うんだけど・・・。

2009年3月13日金曜日

Visual Studio 2005 Express 終了

2009-3-31にてついにVisualStudio2005ExpressEditionの提供が終了ということで。

考えてみたら自分が触り始めたのはベータ2のころからだから、かれこれ5年になるんだなぁ。
とりあえずisoイメージだけは何かと使うかも知れないのでダウンロードしておかないと・・・。

つか、会社よ。MSDNサブスクリプション入ってくれw

2009年3月6日金曜日

SqlServer2005 空パスワードアカウントの有効・無効

まぁ深くセキュリティを考えなくていいシステムの場合にはよくあるのがパスワードなしアカウント。 今回そういったシステムのハードウェア移行を行った際に少しあたふたしたので・・・。

ログインアカウントをManagementStudioでスクリプト化して、新サーバの方で実行するとアカウントは無効状態で登録されるんだよね。ManagementStudioの詳細画面でアイコンの右下に赤矢印がついているような感じで、無効を表しているんだよね。

で、そういったアカウントを有効にしようとアカウントのプロパティから「有効」にしてみたところ、

「空パスワードなアカウントを有効にすることはできません」(メッセージうろおぼえw)

と言ってきたんだよ。なので一度適当なパスワードを設定し状態を有効に再設定、その後パスワードを空白にすると今度は処理が通ってしまったわけだ。

・・・なんというか片手落ちだよなぁw

2009年3月4日水曜日

SqlServer2005 SP3でのDBCC CHECKIDENT

今まで開発にはSqlServer2005のSP2を利用していて、IDENTITYが設定されたテーブルのDELETEトリガにSEEDの再設定を行うものを仕込んでいたんだよね。こんな感じに。

DECLARE @MAXIDENT INT;
SELECT @MAXIDENT = MAX(SAMPLEUID) FROM SAMPLE_TABLE;
DBCC CHECKIDENT ('SAMPLE_TABLE', RESEED, @MAXIDENT);

今まではこれで問題なくSEEDの再設定が行えていたんだけど、今回SP3を適用して確認しているときに問題が発生。DBCCの部分でパラメータ不正的なエラーになっていたんだよね。少し詳しく見ていくと次のようなケースで発生していたみたいで。

  • DBCCを行うテーブルにレコードが1行も存在しない時

この場合にはDBCC CHECKIDENTがエラーとなるように動きが変わったんだよなぁ。ただ正直言ってSP3で何が変更されたとか、もともとこの方法がまずいだとかまで調べないでやっていたものだから何とも断定できないけれども。でもSP2環境では問題なく動いていたのは事実。
今回は次のように対応することでSEEDの再設定が行えました。

DECLARE @MAXIDENT INT;
SELECT @MAXIDENT = MAX(SAMPLEUID) FROM SAMPLE_TABLE;
IF @MAXIDENT IS NULL
  SET @MAXIDENT = 0;
DBCC CHECKIDENT ('SAMPLE_TABLE', RESEED, @MAXIDENT);

DBCCする前に、取得したIDENTITY値がNullかどうか判断してNullならば「0」をSEEDに設定すればOK。