WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

SqlDataSource と楽観的同時実行制御

by WebSurfer 2010年8月5日 12:28

VS2005 (Visual Studio 2005) で作る SqlDataSource の楽観的同時実行制御用クエリは、NULL に対応できないという問題があります。

すでに VS2010 がリリースされている 2010 年 8 月現在、2 世代前の VS2005 を使っている方はそれほど多くないと思いますが、念のため書いておきます。

VS2005 の SqlDataSource 作成ウィザードで、楽観的同時実行制御オプションを有効にしてクエリを自動生成した際、UPDATE, DELETE クエリが NULL に対応できていません。

例えば、memo というフィールドが NULL 許容の場合、以下のようになるべきところ、

WHERE (([memo] = @original_memo) OR ([memo] IS NULL AND @original_memo IS NULL)) ...

VS2005 では以下のようになってしまいます。

WHERE [memo] = @original_memo ...

SQL Server では、= や != などの比較演算子では、引数のいずれかまたは両方が NULL の場合、UNKNOWN が返されます。

従って、DB のフィールドに NULL があると、WHERE 句の条件が成立せず、クエリが実行されない(更新/削除に失敗する)という問題があります。

この問題に対応するには、手作業で、上記のように IS NULL を使って、クエリを書き直してやる必要があります。

VS2008 ではこのあたりは改善されています。VS2010 は未確認です(まさか元に戻っているようなことはないと思いますが)。

なお、型付 DataSet + TableAbapter を、Visual Studio のウィザードを利用して作る場合は、VS2005 でも上記のような問題はありません。

Tags: , ,

ASP.NET

SqlParameter の Size 指定

by WebSurfer 2010年7月29日 12:26

SqlParameter を SqlParameterCollection に追加する際、SqlParameterCollection.Add メソッドを使って以下のように設定することがよくあると思います。

command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");

この時、3 つめの引数の SqlParameter.Size プロパティの値はどのようにすべきでしょうか? 例えば、フィールドの定義が nchar(5) だったら、上記のように 5 にすべきでしょうか? SqlDbType.Int だったら 4 にすべきでしょうか?

個人的には、特に必要がない限り 0 に統一しておくのがよいと思います。理由は以下のとおりです。

  • 固定長データ型では、Size の値は無視される。
  • 可変長データ型では、Size はサーバーに送信するデータの最大量を示す。ただし、0 の場合は制限しない。

「0 の場合は制限しない」というところが要注意です。MSDN ライブラリにはそのことは書いてありませんが、検証して確認しました。また、自動生成される TableAdapter のコードの中では、可変長データ型のデータも含めてすべて 0 が使われていますので、間違いないと思います。

わざわざ調べて意味のない(どのみち無視される)情報を書いたり、場合によっては不適切な値を書いたり、必要がある場合と見分けがつかなくなったり・・・というのは、どう考えても面白くないですよね?

通常 0 を使うと決めておけば、0 以外の数字が入っている時はそれなりの意味がある(設定する必要があるので数字が入っている)ということがすぐ分かります。

ただし、固定長データ型で情報として利用するとか、可変長データ型でサーバーに送信する文字数を切り詰めるなど、値を指定することに意味があるケースもあるようです。

詳しくは、MSDN ライブラリの SqlParameter.Size プロパティ を参照してください。(リンク先は .NET 3.0 のものです。.NET 4.0 は若干書いてあることが違います。仕様が変わったのかどうかは不明(未調査)です。)

Tags: ,

ADO.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar