正在获取一个值存储过程C#
本文关键字:一个 存储过程 获取 | 更新日期: 2023-09-27 18:23:52
我尝试了各种方法,但没有成功。使用Microsoft Visual Studio和SQL Server 2005这是c代码和sql代码
List<SqlParameter> _params3 = new List<SqlParameter>();
_params3.Add(new SqlParameter("@startdate", txtDateFrom.Text));
_params3.Add(new SqlParameter("@enddate", txtDateTo.Text));
_params3.Add(new SqlParameter("@days", extendedDays));
extendedDays = Convert.ToInt32(DAL.executeStoredProcedureScalar(
"Time_Difference_Calc", _params3));
SQL代码:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[Time_Difference_Calc]
-- Add the parameters for the stored procedure here
@startdate datetime,
@enddate datetime,
@days int output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
set @days = (Select RawDays
- NumWeeks * 2
+ CASE WHEN StartWD = 1 THEN 1 ELSE 0 END
- CASE WHEN EndWD = 7 THEN 1 ELSE 0 END
+ 1
AS Result
FROM
(SELECT Datepart(dw,@startdate) as StartWD,
Datepart(dw,@enddate) as EndWD,
DateDiff(d,@startdate,@enddate) as RawDays,
DateDiff(wk,@startdate,@enddate) as NumWeeks
) A)
--SET @ReturnValue = @days
RETURN @days
END
我可以在数据库上运行它。。放两个约会…很适合我的需要。。
但每当我在页面上运行它时。。总是得到
System.NullReferenceException:对象引用未设置为对象的实例。"
源错误:返回cmd。ExecuteScalar().ToString();
感谢您的帮助。基本上,我的想法是,我只想获得与存储过程返回的天数相等的延长天数。
您需要将@day参数的Direction
属性设置为ParameterDirection
.Output
此外,您还必须从@day SqlParamater
中获取值。Value
属性
由于无法看到调用SQL的实际代码,很难确定,但我非常确定您应该为此调用ExecuteNonQuery-您实际上没有选择任何返回值,因此当您的代码试图检索标量值时会出现空引用异常。
如果您的存储过程中有一个类似SELECT TOP 1 foo FROM bar WHERE baz = @quux;
的部分,那么ExecuteScalar(或它的等效部分)将是合适的。但是,您将该值作为输出参数返回,因此它不是查询。
注意:关于需要设置参数方向,其他答案是正确的,但这就是为什么您会得到NullReferenceException。
更改存储过程以选择值,而不是使用参数。然后您可以继续使用ExecuteScalar
。
存储的过程如下所示:
ALTER PROCEDURE [dbo].[Time_Difference_Calc]
-- Add the parameters for the stored procedure here
@startdate datetime,
@enddate datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Select RawDays
- NumWeeks * 2
+ CASE WHEN StartWD = 1 THEN 1 ELSE 0 END
- CASE WHEN EndWD = 7 THEN 1 ELSE 0 END
+ 1
AS Result
FROM
(SELECT Datepart(dw,@startdate) as StartWD,
Datepart(dw,@enddate) as EndWD,
DateDiff(d,@startdate,@enddate) as RawDays,
DateDiff(wk,@startdate,@enddate) as NumWeeks
) A
END
另一件需要考虑的事情是,如果你只是从应用程序中调用它,那么存储的proc就有点无用了。您不需要SQL Server来进行此计算,而且它在代码中更简单。
_params3.Direction = System.Data.ParameterDirection.Output;
执行程序
extendedDays = Convert.ToInt32(_params3.Value);
SqlParameter daysParameter = new SqlParameter("@days", extendedDays);
daysParameter .Direction = ParameterDirection.Output;
_params3.Parameters.Add(daysParameter );
应该完成