テーブル値パラメータのnull値をC#のストアドプロシージャに送信する方法は?
4 に答える
このように使用します
command.Parameters.AddWithValue("@param", DBNull.Value);
これは、同じトピックに関する適切なリンク
です C#.net コードから SQL ストアド プロシージャに null 変数を渡す方法
リンクをたどる
ことができます。
sqlDbType を知らずに SqlParameter で DBNull.Value を使用しますか?
ただし、DBNull.Value の使用には少し問題があります。IOという名前のストアプロシージャに少しあるとしましょう。
ストアプロシージャで
CREATE PROCEDURE [dbo].[stp_Check]
@IO BIT
次に、コードに次のようにパラメーターを追加します。
object parameter = new SqlParameter("IO", true); //using false is the same.
そして、ストアプロシージャを呼び出します
_repositary.DataContext.Database.SqlQuery<CallDetail>("exec stp_Check @IO", parameter)();
ここで _repository は、コンテキストを持つ私の DataRepository クラスです。これには、sp が実行されることがわかっていれば十分です。
SQL Server プロファイラーを使用して呼び出しをキャッチできます。それは次のように生成されます。
declare @p24 int
set @p24=7
exec sp_executesql N'exec stp_Check @IO', --parameter passed
N'@IO bit', -- parameter with the type passed
@IO=1 --parameter value used when executing the sp
select @p24
問題はこれです。次のように DBNull.Value でパラメータを作成すると、次のようになります。
object parameter = new SqlParameter("IO", (object)DBNull.Value);
あなたが見つけることができるのは、SQLサーバープロファイラーからです
declare @p24 int
set @p24=7
exec sp_executesql N'exec stp_Check @IO', --parameter passed
N'@IO nvarchar(4000)', -- the passes type is not boolean
@IO=NULL --parameter value is NULL
select @p24
これが機能することは事実ですが、これは意図したものではありません。私は好む
using System.Data.SqlTypes;
次のように null を渡すことができます。
object parameter = new SqlParameter("IO", System.Data.SqlTypes.SqlBoolean.Null );
それではリクエストはこんな感じです。
declare @p24 int
set @p24=7
exec sp_executesql N'exec stp_Check @IO', --parameter passed
N'@IO bit', -- the passes type is boolean
@IO=NULL --parameter value is NULL
select @p24
int、bigint、datetime など、すべての sqltypes に null 値があります。乾杯。:)
DBNull.Value
渡すために使用しNULL
ます。
null をデフォルトのパラメーター値として追加し、null にしたい場合は値を送信しないでください。
元:
create procedure sp_name(@param1 varhcra(10), @param2 varchar(10)=null)
C#
command.Parameters.AddWithValue("@param1", "value1");
//dont pass any value for param2, it is considered null