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 は若干書いてあることが違います。仕様が変わったのかどうかは不明(未調査)です。)