我没有那么多的编程经验,所以我不知道我的错是什么。 我正在动态搜索网站,您可以在其中搜索不同的值。
这是我的程序:
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 :(得分: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);