[英]Stored procedure WHERE clause error (expects parameter)
ALTER PROCEDURE [dbo].[sp_twa_report1]
(@date1 as DATE,
@date2 as DATE,
@Filter1 as INT,
@Kheadoption as NVARCHAR(10),
@Kcodeoption as NVARCHAR(10),
@Ktypeoption as NVARCHAR(10),
@Shiftoption as INT)
AS
BEGIN
SELECT
wageentry.empno, wageentry.kdate, wageentry.kcode,
empmain.paybookno,
kamjaricode.kdesc, kamjarihead.khead, kamjarihead.khdesc,
wageentry.shiftno
INTO
#tmpTbl1
FROM
wageentry, empmain, kamjaricode, kamjarihead
WHERE
wageentry.empno = empmain.empno
AND wageentry.kcode = kamjaricode.kcode
AND kamjaricode.khead = kamjarihead.khead
AND wageentry.kdate >= @date1 AND wageentry.kdate <= @date2
AND (wageentry.shiftno = CASE @Shiftoption
WHEN 1 THEN 1
WHEN 2 THEN 1
WHEN 3 THEN 2
ELSE 5
END
OR wageentry.shiftno = CASE @Shiftoption
WHEN 1 THEN 2
WHEN 2 THEN 1
WHEN 3 THEN 2
ELSE 5
END
OR wageentry.shiftno = CASE @Shiftoption
WHEN 1 THEN 5
WHEN 2 THEN 1
WHEN 3 THEN 2
ELSE 5
END)
AND ((@Kheadoption IS NULL) OR (kamjaricode.khead = @Kheadoption))
AND ((@Kcodeoption IS NULL) OR (kamjaricode.kcode = @Kcodeoption))
AND ((@Ktypeoption IS NULL) OR (kamjaricode.ktype = @Ktypeoption))
-- More code here
End
The above stored procedure works fine from Management Studio, but when I run it from my Winforms app, I get an error:上面的存储过程在 Management Studio 中运行良好,但是当我从 Winforms 应用程序运行它时,出现错误:
Procedure or function 'sp_twa_report1' expects parameter '@Kheadoption', which was not supplied.过程或 function 'sp_twa_report1' 需要未提供的参数 '@Kheadoption'。
The parameters @Kheadoption, @Kcodeoption, @Ktypeoption
are null as default. @Kheadoption, @Kcodeoption, @Ktypeoption
参数默认为 null。 So from my understanding those lines of the query should be ignored.因此,据我了解,应该忽略查询的这些行。 Where am I going wrong?我哪里错了?
My Winforms code is:我的 Winforms 代码是:
commandText = "sp_twa_report1";
SqlCommand command = new SqlCommand(commandText, cs);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@date1", SqlDbType.Date).Value = mySdate;
command.Parameters.Add("@date2", SqlDbType.Date).Value = myEdate;
command.Parameters.Add("@Filter1", SqlDbType.Int).Value = Filter1;
command.Parameters.Add("@Kheadoption",SqlDbType.NVarChar).Value = Kheadoption;
command.Parameters.Add("@Kcodeoption", SqlDbType.NVarChar).Value = Kcodeoption;
command.Parameters.Add("@Ktypeoption", SqlDbType.NVarChar).Value = Ktypeoption;
command.Parameters.Add("@Shiftoption", SqlDbType.Int).Value = myShiftno;
cs.Open();
SqlDataAdapter da = new SqlDataAdapter(command);
da.Fill(dt);
cs.Close();
The parameters @Kheadoption, @Kcodeoption, @Ktypeoption are null as default. @Kheadoption、@Kcodeoption、@Ktypeoption 参数默认为 null。 So from my understanding those lines of the query should be ignored.因此,据我了解,应该忽略查询的这些行。
Consider using DBNull
instead of null
when passing parameters for a stored procedure.为存储过程传递参数时,请考虑使用DBNull
而不是null
。
Per MSDN : When you send a null parameter value to the server, you must specify DBNull, not null
. 根据 MSDN :当您向服务器发送 null 参数值时,您必须指定 DBNull,而不是null
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.