InvalidCastException - 将空值传递给存储过程

时间:2014-10-22 09:43:52

标签: c# asp.net sql-server linq stored-procedures

我没有那么多的编程经验,所以我不知道我的错是什么。 我正在动态搜索网站,您可以在其中搜索不同的值。

这是我的程序:

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。

我没有提到它,帖子不太复杂。

2 个答案:

答案 0 :(得分:0)

应用显式强制转换时会发生 InvalidCastException 。但是类型不在类型层次结构的相同路径中。演员阵容没有成功。

在您的代码中,您将所有内容都传递为null。但 int tinyint 日期不能为空。这就是它抛出异常的原因

或者,您可以通过添加?来在c#代码中使变量可以为空?像这样: int? variableName

查看this链接,了解有关如何使变量成为可空的更多详细信息。

答案 1 :(得分:0)

尝试传递DBNull.Value而不是null

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