存储过程执行的结果不一致 - ASP.net代码与直接SP调用

时间:2013-07-09 14:13:01

标签: asp.net stored-procedures sql-server-2008-r2

提前感谢任何人的帮助。这是一个让我疯狂的谜:(。

如果我直接在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; 

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

感谢大家的帮助。

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

在上面的ASP.net代码中:

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

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

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

上述变化解决了这个问题。

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

Select @Your_Param1, @Your_Param2

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