24

現在、データベース内のすべてのストアド プロシージャ用の単純な C# ラッパー クラスを作成しようとしています。

C# でいくつかのパラメーターを作成しているときに、プロパティSqlParameter.IsNullableに気付き、これが何のためにあるのか疑問に思いました。私の知る限り、ストアド プロシージャのパラメーターを NOT NULL として宣言することはできないため、NULL は常に任意のパラメーターに渡すことができます。

テストを通じて、IsNullable プロパティを false に設定しても効果がなく、SqlParameter.Value プロパティを null に設定できることがわかりました。

このプロパティの目的を説明できる人はいますか?

ご覧いただきありがとうございます。

報奨金を探している回答者は、次のリンクを確認する必要があります。

NULL をパラメーターとしてストアド プロシージャ SQL Server に制限する方法は?

SQL パラメータ IsNullable

SqlParameter.IsNullable は次の場合にのみ意味があると思います…?

http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/b7a08616-58d1-4cdc-a3e9-9353e292667b

4

2 に答える 2

25

SqlParameterクラスは、抽象基本クラスDbParameterを継承します。

    public abstract bool IsNullable {get; set;}

したがって、プロパティSqlParameterのパブリック実装が必要です。IsNullableこのDbParameterクラスは、に含まれるすべてのデータベースパラメータ実装の基本クラスですSystem.Data

次に、プロシージャまたは関数パラメータをnull許容またはnull不可として明示的に定義することを明示的に許可または拒否する他のDBMSがありSqlParameter.IsNullable、SqlParameterが他の.NETに共通のより一般的な共通データベースパラメータクラスおよびインターフェイスを実装しているためにのみ存在すると想定する必要があります。データベース相互作用クラス。

リフレクターを見ると、クラスは、「InstanceDescriptor」に変換されるときに値を渡す以外は、をSqlParameter使用しません。クラスがIsNullable何に使用されるかについては掘り下げませんでしたが、クラス、特にデータベースに送信されるパラメーターのSQL文字列に変換するメソッドを確認しました。InstanceDescriptorSqlCommandBuildParamListSqlParameterCollection

このBuildParamListメソッドは、をループしSqlParameterCollection、を使用しStringBuilderてパラメータ文字列を作成します。実装のどこにもプロパティまたは値BuildParamListを使用しません。IsNullable実際、への参照SqlParameter.IsNullableはSqlCommandクラスのどこにも表示されません。

SqlParameterオブジェクトを別のクラスに渡す内部/プライベートメソッドで参照を見逃した可能性がありますが、BuildParamListメソッドがそれを使用しない場合は、SQLに送信されるSQL文字列に影響を与えないため問題ありません。サーバ。

実行したテストケースに加えて、クラスの内容を調べることで、プロパティ値SqlCommandを安全に無視できるという結論が裏付けられます。SqlParameter.IsNullable

SQL Server側の面倒を見て、インターネットをすばやく検索して、明示的にnull許容/非null許容のプロシージャまたは関数パラメータを許可するDBMSを見つけることができるかどうかを確認しました。プロシージャに特定の属性を設定してnull値を渡す必要があると思われる、DB2の参照に遭遇したときに停止しました。この機能を備えた最新のRDBMSを私は知りません。また、検索しても他に何も得られませんでした。

于 2012-06-22T00:03:07.687 に答える
3

リンクを確認し、MSDNのいくつかの記事を読んだ後。

SqlParameter.IsNullableプロパティは、インターフェイスを実装IDataParameter.IsNullableし、「Null値はDBNullクラスを使用して処理される」という記事を読みます。

DBNullクラスは、1つのインターフェイスメソッドIConvertible.ToType Infrastructureのみを実装します。現在のDBNullオブジェクトを指定されたタイプに変換します。"また、"DBNull.Valueは、存在しない値をデータベースフィールドに明示的に割り当てるために使用できますが、ほとんどのADO.NETデータプロバイダーは、フィールドに有効な値がない場合、DBNullの値を自動的に割り当てます。 「」

これを読むことは、ほとんどのADO.NETクラスがこのプロパティを自動的に実装し、画像の背後でNULLからDBNullへの型変換を行うことを意味します。私の理解によると、接続やその他のデータベースタスクを作成するためにwriting our own APIeg(System.Data.CustomDatabaseClientではなく)であり、このプロパティを実装していない場合、System.Data.CustomDatabaseClientを使用する人はNull値をDBNullに明示的に変換する必要があります。System.Data.SqlClient

あなたのコメントと訂正を探しています

于 2012-06-21T16:52:36.903 に答える