【问题标题】:Getting a value stored procedure C#获取值存储过程 C#
【发布时间】:2012-02-08 17:17:38
【问题描述】:

我尝试了多种方法,但都没有运气。使用 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

我可以在数据库上运行它就好了..将 2 个日期放入.. 可以满足我的需要..

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

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

感谢任何帮助。几乎我的想法是我只想获得与存储过程返回的时间相等的延长天数。

【问题讨论】:

  • 你能把更多的C#代码放在这里吗..我可以立即看到一些错误的东西..还有你使用的是什么版本的VS...? List _params3 = new List();当您应该使用 SQLCommand 对象和 SQLConnection 对象时,为什么要这样做??
  • 什么是 DAL.executeStoredProcedureScalar?你能把那个代码贴出来吗?
  • 而不是发布 DAL.executeStoredProcedureScalar 的代码。我会说至少删除该方法,并可能删除整个 DAL 类定义并切换到以正确的方式做事。

标签: c# sql-server-2005 stored-procedures


【解决方案1】:

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

此外,您必须从@day SqlParamater.Value 属性中获取值

【讨论】:

    【解决方案2】:

    无法看到调用 SQL 的实际代码,很难确定,但我很确定您应该为此调用 ExecuteNonQuery - 您实际上并没有选择任何返回值,因此 null当您的代码尝试检索标量值时引用异常。

    如果您的存储过程中有一个类似于SELECT TOP 1 foo FROM bar WHERE baz = @quux; 的部分,那么 ExecuteScalar(或您的等价物)将是合适的。但是,您将值作为输出参数返回,因此它不是查询。

    注意:关于需要设置参数方向的其他答案是正确的,但这就是您收到 NullReferenceException 的原因。

    【讨论】:

    • +1:标量调用意味着“获取第一条记录的第一个字段”,这不是存储过程所做的。它返回一个输出参数。在这种情况下,您应该执行 ExecuteNonQuery 并简单地读取参数。
    【解决方案3】:

    更改您的存储过程以选择值而不是使用参数。然后你可以继续使用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 来做这个计算,在代码中做起来更简单。

    【讨论】:

      【解决方案4】:
      _params3.Direction = System.Data.ParameterDirection.Output;
      

      执行过程

      extendedDays = Convert.ToInt32(_params3.Value);
      

      【讨论】:

      • 好的,只需将代码添加到:new SqlParameter("@days", extendedDays) 或创建一个名为 p3 的参数,方向正确,然后将其添加到列表中。这是一个小错字,无需投票
      【解决方案5】:
      SqlParameter daysParameter = new SqlParameter("@days", extendedDays);
          daysParameter .Direction = ParameterDirection.Output;
          _params3.Parameters.Add(daysParameter );
      

      应该做的伎俩

      【讨论】:

        猜你喜欢
        • 2017-01-18
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 2011-04-26
        • 2021-07-23
        • 1970-01-01
        相关资源
        最近更新 更多