0

提前感谢任何人的帮助。这是让我发疯的谜团:(。

如果我直接在 SQL Server 2008R2 上运行以下存储过程,它会返回所需的行。但是如果我通过 ASP.net(3.5) 调用它,它会从 SP 中的最后一个 Select 语句返回空数据。

关于临时表@_CalendarDate,是否涉及任何范围界定?

存储过程:

USE[DB]

GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [WC].[spsGetDayCyclePeriod]
(
    @Param_StartDate datetime,
    @NumberOfDayRange int,
    @Campus_Type varchar(2)
)
AS

DECLARE @DateRangeStart datetime
DECLARE @DateRangeEnd datetime
DECLARE @_CalendarDate TABLE (CollegeDate datetime)

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SET DATEFIRST 1

SELECT @DateRangeStart=max(CalendarDate) FROM [X].dbo.CalendarEvents 
    WHERE CalendarDate <= @Param_StartDate and left(CalendarType,1)= @Campus_Type 
    and  (CalendarType <> @Campus_Type+'_H' and  CalendarType<>'H'
    and convert(INT, right(CalendarType, len(CalendarType)-3))>0)

    SELECT @DateRangeEnd=min(CalendarDate) FROM [X].dbo.CalendarEvents 
    WHERE CalendarDate >= dateadd(day, @NumberOfDayRange-1, @Param_StartDate) 
    and left(CalendarType,1)= @Campus_Type and  (CalendarType <> @Campus_Type+'_H'
    and  CalendarType<>'H' and convert(INT, right(CalendarType, len(CalendarType)-3))=0)


    --Get all Dates within range
    ;WITH CollegeDate AS
    (
        SELECT @DateRangeStart AS DateValue
        union all
        SELECT dateadd(day, 1, DateValue)
        FROM    CollegeDate   
        WHERE   dateadd(day, 1, DateValue) <= @DateRangeEnd
    )
    INSERT INTO @_CalendarDate (CollegeDate)
    SELECT DateValue FROM CollegeDate OPTION (MAXRECURSION 0)



SELECT  * from @_CalendarDate

END

ASP.NET 代码:

DataTable dayCycle = new DataTable();
            var dateTimestr = startDate.ToString("yyyy-MM-dd HH:mm:ss");
            using (SqlCommand sqlCommand = new SqlCommand("WC.spsGetDayCyclePeriod", new SqlConnection(Connection)))
            {
                sqlCommand.CommandType = CommandType.StoredProcedure;
                var range = endDate.Subtract(startDate).Days;
                sqlCommand.Parameters.Add(new SqlParameter("@Param_StartDate", dateTimestr));
                sqlCommand.Parameters.Add(new SqlParameter("@NumberOfDayRange", range));
                sqlCommand.Parameters.Add(new SqlParameter("@Campus_Type", campus));
                //dayCycle = SqlHelper.GetDataTableUsingSqlCommand(sqlCommand);

                try
                {
                    SqlDataAdapter _dap = new SqlDataAdapter(sqlCommand);

                    _dap.Fill(dayCycle);
                }
                catch (Exception ex)
                { throw new Exception(ex.ToString()); }

                return dayCycle; 
4

2 回答 2

0

将 @Param_StartDate 作为日期时间对象而不是字符串传递。

于 2013-07-09T14:19:13.563 回答
0

感谢大家的帮助。

自己解决了问题!希望它将来也能帮助其他人。这是答案:

在上面的 ASP.net 代码中:

sqlCommand.Parameters.Add(new SqlParameter("@Campus_Type", campus));

Campus是一个枚举类型,当我使用枚举类型调用上述方法时,我实际上传递的是 int 值而不是字符串。所以这就是我改变的。这很令人困惑,因为当我调试我的代码时,我在 @campus 顶部使用光标,它基本上调用了 toString,所以我看到了正确的值(这是错误的),传递的实际值是枚举数。

sqlCommand.Parameters.Add(new SqlParameter("@Campus_Type", campus.ToString()));

而上述改变解决了这个问题。

我从中学到的是始终...始终确认您打算传递给 SP 的参数是 SP 正在接收的,因此在对存储过程执行任何操作之前,请通过运行以下命令来取回您传递的参数...

Select @Your_Param1, @Your_Param2

然后在代码方面检查您是否收到了您所期望的。

于 2013-07-09T22:32:26.640 回答