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传递。但是int、tinyint和date不能为空。这就是它抛出异常的原因
或者,您可以在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);