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

本文关键字:存储过程 值传 null InvalidCastException- | 更新日期: 2023-09-27 18:27:22

我没有那么多编程经验,所以我不知道自己的错在哪里。我正在为一个网站进行动态搜索,在那里你可以搜索不同的值。

这是我的程序:

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

用户可以搜索所有内容,也可以不搜索任何内容,因此应该可以传递null值。当我在sql管理工作室中测试该过程时,即使我只传递null值,它也能正常工作。

结果将绑定到GridView。下面是我的手机:

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

我传递null值只是为了调试,但我在DataBind上得到了InvalidCastException。

一些帮助会非常好。

我希望你什么都懂,我的英语不是很好。

Justin

编辑:

我测试了另一种方法:

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的变量。我检查文本框是否为空。如果是,那么我将null赋值给变量。

最后,我用以下参数调用该过程:

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

但我得到了相同的InvalidCastException。

我没有提到这一点,帖子不会变得太复杂。

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

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

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

或者,您可以在c#代码中添加一个?像这样:int? variableName

有关如何使变量可以为null的更多详细信息,请查看此链接。

尝试传递DBNull.Value而不是null

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