【发布时间】:2023-04-05 08:38:01
【问题描述】:
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
上面的存储过程在 Management Studio 中运行良好,但是当我从我的 Winforms 应用程序运行它时,我得到一个错误:
过程或函数“sp_twa_report1”需要参数“@Kheadoption”,但未提供。
参数@Kheadoption, @Kcodeoption, @Ktypeoption 默认为空。因此,据我了解,应该忽略查询的这些行。我哪里错了?
我的 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();
【问题讨论】:
-
你试过用
DBNull代替null吗?看来,这应该是实际空值的sent instead。 -
即使所有参数都有值,你也会得到错误?
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(差不多 30 年前),不鼓励使用它 -
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实冒着在未来某个时候发生名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
... END ((@Ktypeoption IS NULL) OR (kamjaricode.ktype = @Ktypeoption))?好像打错了。
标签: c# sql-server stored-procedures