2011-05-04 32 views
2

我有一個SQL存儲過程,我需要能夠通過一個NULL作爲值的參數之一,在查詢中使用這樣的:EF如何確定可空參數?

create procedure sp 
    @param1 varchar(30) 
as 
select * from table where field = isnull(@param1, field) 

所以,我需要一些如何告知EF使@param1可以爲空。我該怎麼做呢?

謝謝!

萬一有幫助,我與英法在使用的過程是:

  1. 創建SP
  2. 更新模型(EDMX)
  3. 添加新功能的進口
  4. 生成新的複雜類型點擊按鈕
  5. 在單獨的模板文件上運行自定義工具(生成POCO)
+0

如何將NULL傳遞給varchar(30),除非它是可選參數? – 2011-05-13 07:58:34

+0

@Akash exec sp NULL – 2011-05-13 13:05:23

+0

它是否給出了在運行時期望非空參數的錯誤? – 2011-05-13 17:22:50

回答

2

作爲變通,你可以聲明兩個獨立的存儲過程:

-- use this for non-null parameters 
create procedure sp 
    @param1 varchar(30) 
as 
select * from table where field = @param1 

-- use this for null 
create procedure sp_null 
as 
select * from table 

,然後你可以寫在C#所期望的抽象:

public ... GetSp(string param1) 
{ 
    if (param1 == null) 
     return ....sp_null(); 
    else 
     return ....sp(param1); 
} 
+0

我實際上可以添加一個額外的位參數,並且在同一個sp中有兩個代碼路徑,可能比兩個單獨的路徑更乾淨... – 2011-05-04 22:35:46

+0

是的,也可以這樣做。 – Timwi 2011-05-04 22:40:21

1

使用DBNull.Value,我用我的一個存儲過程完成了這個操作。要打電話給你的程序,我的代碼將如下所示:

List<ObjectParameter> objectParameterList = new List<ObjectParameter>(); 
if (string.IsNullOrEmpty(param1)) 
{ 
    object nullValue = DBNull.Value; 
    objectParameterList.Add(new ObjectParameter("param1", nullValue)); 
} 
else 
{ 
    objectParameterList.Add(new ObjectParameter("param1", param1)); 
} 

context.ExecuteFunction("MyEFModel.sp", objectParameterList.ToArray()); 

希望這會有所幫助。

0

將存儲過程中的默認值設置爲NULL。

create procedure sp 
    @param1 varchar(30) =NULL 
as 
select * from table where field = isnull(@param1, field) 
+0

不起作用。 -1甚至在猜測之前沒有嘗試過。 – 2011-05-12 19:10:34

+1

@ subt13,有人試圖幫助你,你沒有付錢給任何人來幫助你,所以請試着說謝謝你的幫助,沒有人會停止工作,並嘗試你的解決方案,因爲這是你的工作!不是芝諾的。這是一個芝諾會告訴你解決方案的地方。 – 2011-05-13 07:49:39

+0

@Akash感謝您的評論,謝謝。 – 2011-05-13 15:06:42