2014-10-22 105 views
1

我在編程方面沒有太多的經驗,所以我不知道我的錯是什麼。 我正在爲一個網站進行動態搜索,您可以在其中搜索不同的值。InvalidCastException - 將空值傳遞給存儲過程

這是我的程序:

ALTER PROCEDURE [dbo].[Support_for_Search] 
@ID int, 
@Benutzername nvarchar(100), 
@DatumEingang date, 
@Eskalation date, 
@Prio tinyint, 
@namePrefix nvarchar(100) 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT S.[ID] 
    ,S.[Problembeschreibung] 
    ,S.[Wunschtermin] 
    ,S.[Projektkostenstelle] 
    ,S.[Status] 
    ,S.[BearbeiterID] 
    ,S.[DatumEingang] 
    ,S.[DatumAbschluss] 
    ,S.[Priorität] 
    ,S.[Eskalation] 
    ,S.[Nutzerreaktion] 
    ,S.[AntragstellerID] 
    ,S.[Pcname] 
    ,S.[Benutzername] 
    ,S.[Bemerkungen] 
    ,B.Vorname + ' ' + B.Nachname AS AntragstellerName 
    ,BA.Vorname + ' ' + BA.Nachname AS BearbeiterName 
FROM [dbiSupportsystem].[dbo].[Support] S 
Left JOIN dbo.Benutzer B ON B.BenutzerNr = S.AntragstellerID 
Left JOIN dbo.Benutzer BA ON BA.BenutzerNr = S.BearbeiterID 
Where (@ID IS NULL OR ID = @ID) 
AND 
(@Benutzername IS NULL OR Benutzername LIKE '%' + @Benutzername + '%') 
AND 
(@DatumEingang IS NULL OR DatumEingang = @DatumEingang) 
AND 
(@Eskalation IS NULL OR Eskalation = @Eskalation) 
AND 
(@Prio IS NULL OR Priorität = @Prio) 
AND 
(@namePrefix IS NULL OR B.Nachname LIKE '%' + @namePrefix + '%') 
END 

用戶可以搜索什麼都不要,所以它應該可以通過空值。當我在sql管理工作室中測試過程時,即使只傳遞空值,它也能正常工作。

結果將綁定到GridView。 這是我所能背後:

using (DataClassesDataContext context = new DataClassesDataContext()) 
     { 
      SearchDG.DataSource = context.Support_for_Search(null, null,null, null,null, null); 
      SearchDG.DataBind(); 
     } 

我傳遞了空值僅用於調試,但我得到的DataBind一個InvalidCastException。

有些幫助會很大。

我希望你明白一切,我的英語不是那麼好。

賈斯汀

編輯:

我測試過的另一種方式:

Int32? supportnummer; 
     int parseSupportnummer; 

     bool supportnummerIsInt = Int32.TryParse(txtSnummer.Text, out parseSupportnummer); 
     if (supportnummerIsInt) 
     { supportnummer = parseSupportnummer; } 
     else 
     { supportnummer = null; } 

DateTime? datumEingang; 
DateTime parseEingang; 

     bool eingangIsDate = DateTime.TryParse(txtDatumEingang.Value, out parseEingang); 
     if (eingangIsDate) 
      { datumEingang = parseEingang; } 
     else 
      { datumEingang = null; }   

我做了爲我想通過每一個參數可空變量。 我檢查文本框是否爲空。如果是,那麼我將null賦值給變量。

在結束我打電話的步驟,使用這些參數:

SearchDG.DataSource = context.Support_for_Search(supportnummer, benutzername, datumEingang, datumEskalation, prio, userNachname); 

但我已經得到了同樣的InvalidCastException的。

我沒有提到它,該帖子不會太複雜。

+0

是否datumEskalation&PRIO也可爲空? – Dash 2014-10-22 11:39:20

+0

是的,他們是,userNachname和benutzername也是。 – nitsuj1001 2014-10-22 12:10:21

+0

C#代碼中存儲過程的簽名是什麼? – 2014-10-22 21:18:36

回答

0

InvalidCastException在應用顯式強制轉換時發生。但是類型不在類型層次結構的相同路徑中。演員陣容不成功。

在您的代碼中,您將所有內容作爲null傳遞。但是int,tinyintdate不能爲空。這就是爲什麼它拋出異常

另外,你可以使你的變量爲空在C#代碼通過添加一個?像這樣: int? variableName

檢出this鏈接有關如何使變量爲空的更多詳細信息。

+0

感謝您的回答。我以前用可空變量試過了,但我仍然得到相同的預期。請看看我的編輯。 – nitsuj1001 2014-10-22 10:25:42

0

嘗試通過DBNull.Value,而不是空

SearchDG.DataSource = context.Support_for_Search(DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value); 
+0

建議嘗試的東西不符合資格作爲答案。這應該是一個評論。 – 2017-05-25 09:23:14

+0

我需要24個更多的聲譽做評論。 – 2017-05-25 09:37:09

+1

所以現在你可以把它變成評論。 – 2017-05-26 20:08:39

相關問題