Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取存储过程C的值_C#_Sql Server 2005_Stored Procedures - Fatal编程技术网

C# 获取存储过程C的值

C# 获取存储过程C的值,c#,sql-server-2005,stored-procedures,C#,Sql Server 2005,Stored Procedures,我尝试过各种方法,但都没有成功。使用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", txtD

我尝试过各种方法,但都没有成功。使用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));
我可以在数据库上运行它很好..输入两个日期。。适合我的需要

但每当我在页面中实际运行它时。。总是得到

System.NullReferenceException:对象引用未设置为 对象的实例。 源错误:返回cmd.ExecuteScalar.ToString


感谢您的帮助。基本上,我的想法是,我只想让延长的天数等于存储过程返回的任何值。

您需要将@day参数的属性设置为.Output


此外,您还必须从@day中获取值。属性

无法查看调用SQL的实际代码,这很难确定,但我非常确定您应该为此调用ExecuteOnQuery-您实际上没有选择任何返回值,因此在代码尝试检索标量值时出现空引用异常

如果您的存储过程中有一个部分,沿着从baz=@quux的条中选择Top1Foo;那么ExecuteScalar或与之相当的软件将是合适的。但是,您将该值作为输出参数返回,因此它是非查询

注意:关于需要设置参数方向,其他答案都是正确的,但这就是为什么会出现NullReferenceException

_params3.Direction = System.Data.ParameterDirection.Output;
执行程序

extendedDays = Convert.ToInt32(_params3.Value);

应该这样做

更改存储过程以选择值,而不是使用参数。然后您可以继续使用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

另一件事要考虑的是,如果你只是从一个应用程序调用这个,那么存储的进程是没有用的。您不需要SQL Server来进行此计算,而且在代码中进行此计算更简单。

您可以在此处添加更多的C代码吗。。我能马上看出一些事情是错误的。。还有,您使用的是哪种版本的VS。。。?列表_params3=新列表;当您应该使用SQLCommand对象和SQLConnection对象时,为什么要这样做?..DAL.ExecuteStoreProcedureScalar是什么?你能发布代码吗?而不是发布DAL.executeStoredProcedureScalar的代码。我要说的是,至少要删除该方法,并可能删除整个DAL类定义,然后切换到正确的方式。+1:标量调用意味着获取第一条记录的第一个字段,这不是存储过程正在执行的操作。它正在返回一个输出参数。在这种情况下,您应该执行ExecuteOnQuery并简单地读取参数。好的,只需将代码添加到:newSqlParameter@days,extendedDays或创建一个具有正确方向的名为p3的参数,然后将其添加到列表中。这是个小错误,没必要投否决票
SqlParameter daysParameter = new SqlParameter("@days", extendedDays);
    daysParameter .Direction = ParameterDirection.Output;
    _params3.Parameters.Add(daysParameter );
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