2012-11-17 63 views
2

如何爲表值參數的空值發送到在C#中的存儲過程?發送空值到存儲過程

+0

的可能重複[如何傳遞一個空變量從C#存儲過程SQL。網絡代碼](http://stackoverflow.com/questions/1207404/how-to-pass-a-null-variable-to-a-sql-stored-procedure-from-c-net-code) – krock

回答

-1

您可以添加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 
+1

** Do不要**爲你自己的存儲過程使用'sp_'前綴!該前綴是**由Microsoft **保留供其自己使用。 –

0

使用DBNull.Value通過NULL

3

有使用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 Profiler呼叫。這將生成如下。

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 Server Profiler可以找出什麼是

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 

真,這將work.But這不是什麼打算。我更喜歡

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 

有所有的SQLType如int,BIGINT,日期時間等,希望這有助於空值。乾杯。 :)