53

我創建了一個存儲過程,該過程使用表值參數,該表是具有int類型的單個列的表。這個想法是簡單地將一個id列表傳入存儲過程,並允許sp處理數據。但是,在沒有數據通過的情況下,我遇到了問題(當我有數據時,事情正常工作)。我將List轉換爲IEnumerable,並將其綁定到sp的表值參數。我試圖綁定一個空列表,導致錯誤在存儲過程(.net)上將空列表或空值綁定到表值參數

System.ArgumentException:在SqlDataRecord枚舉中沒有記錄。要發送不帶行的表值參數,請改爲爲該值使用空引用。

我然後試圖綁定一個空值(我以爲是什麼上述消息在得到),但只造成了不同的錯誤信息

System.NotSupportedException:爲參數「的DBNull值@MainItemIdList '不被支持。表值參數不能是DBNull。

似乎你不能在sp聲明中聲明表值參數爲空。將空列表綁定到表值參數的正確方法是什麼?

回答

78

訣竅是:根本不傳入參數。表值參數的默認值是一個空表。

這是一個恥辱,異常信息是如此無益。

+8

它永遠不會傷害添加一個新的答案或改進。這些信息仍然相關,其他人會發現它很有用(這是本網站的重點!)。 +1 – 2011-07-19 18:58:04

+0

任何想法如果使用普通舊錶適配器如何做到這一點? TableAdapter模板具有與SP相同簽名的CLR代理函數,並且它期望一個非空值。傳遞null或DbNull.Value會引發錯誤。 – 2011-10-25 14:26:28

+0

Up 1.這正是我需要做的 - 經過測試並且效果很好。 – 2011-10-25 18:17:04

2

我對'沒有傳遞參數'聲明的含義有點困惑。什麼最終爲實體框架ExecuteSqlCommandAsync()工作是這樣的:

new SqlParameter("yourParameterName", SqlDbType.Structured) 
    { 
     Direction = ParameterDirection.Input, 
     TypeName = "yourUdtType", 
     Value = null 
    }; 

這將傳遞參數爲'默認'。

0

當我傳遞一個空的IEnumerable<int>時出現錯誤,但當我通過一個空的List<int>代替時,它正常工作。

相關問題