存储过程和C#SqlDataReader返回比预期更少的行

时间:2014-03-20 13:49:00

标签: c# sql-server tsql sqldatareader

我被要求将网站应用程序从一台服务器迁移到另一台服务器。 该代码由之前的开发人员编写。

他使用以下内容创建了一个存储过程: [参数]

            @SurveyPeriodConfigID int = -1,
            @StartDate DATETIME = NULL,
            @EndDate DATETIME = NULL,
            @StartTime DATETIME = [9:00:00],
            @EndTime DATETIME = [19:00:00],
            @Category INT = -1,
            @SubcategoryID INT = -1,
            @ReportType VARCHAR(50) = null,
            @DepartmentID INT = -1,
            @FloorID INT = -1,
            @RoomID INT = -1,
            @IsLazyLoad BIT = 0,
            @Day INT = -1

和[WHERE caluse]:

            SELECT [fields]
            FROM [tables]
            WHERE 
            (DATEPART(dw, rsdm.DateCreated)) != 7 AND (DATEPART(dw, rsdm.DateCreated)) !=1
                    AND rsdm.DateCreated BETWEEN @StartDate AND @EndDate
                    AND (CONVERT(VARCHAR(8),rsdm.DateCreated,108) BETWEEN @StartTime AND @EndTime)
                    AND (@Category = -1 OR rsdm.CategoryCodeID = @Category)
                    AND (@SubcategoryID = -1 OR rsdm.SubcategoryID = @SubcategoryID)
                    AND (@DepartmentID =-1 OR rsdm.DepartmentID = @DepartmentID)
                    AND (@FloorID =-1 OR rsdm.FloorID = @FloorID)
                    AND (@RoomID =-1 OR rsdm.RoomID = @RoomID)
                    AND (@Day =-1  OR  DATEPART(dw, rsdm.DateCreated) = @Day)

C#代码:

            SqlDataReader sqlDataReader = thisCommand.ExecuteReader(CommandBehavior.CloseConnection);

...调用存储过程并返回SqlDataReader。

到目前为止一切顺利。

现在问题...以前旧网站返回了8200行,但现在新网站返回6500行!!!

我在我的电脑上设置我的电脑上的代码和网站我的sql数据库...它返回正确的值8200.然后我改变了web.config指向新的网站sql server ... 6500行!!! / p>

我备份了实时站点sql数据库,并在我的PC上本地恢复了相同的数据库,并对其进行了测试... 8200行!!!

旧网站有Sql server 2005,我的PC有开发人员SQL 2012,而实时服务器有SQL 2012。

然后我在新站点Sql Server上运行sql profiler,解压缩脚本并在相同的sql数据库8200记录上运行脚本!!!

我花了1-2天的时间在这上面,但仍然不知道为什么直播Sql Server会通过sqldatareader返回6500行。

任何建议都将不胜感激。

4 个答案:

答案 0 :(得分:3)

我会检查不同服务器上的选项是否配置不同,特别是ANSI_NULLS(参见下面的脚本)。请注意,在SSMS中运行脚本时,默认选项可能与使用ADO.NET时生效的默认选项不同(请参阅SSMS工具/选项/查询执行/ SQL Server / ANSI)。这通常可以解释SSMS和ADO.NET之间的行为差​​异。

DECLARE @options INT 
SELECT @options = @@OPTIONS 

PRINT @options
IF ( (1 & @options) = 1 ) PRINT 'DISABLE_DEF_CNST_CHK' 
IF ( (2 & @options) = 2 ) PRINT 'IMPLICIT_TRANSACTIONS' 
IF ( (4 & @options) = 4 ) PRINT 'CURSOR_CLOSE_ON_COMMIT' 
IF ( (8 & @options) = 8 ) PRINT 'ANSI_WARNINGS' 
IF ( (16 & @options) = 16 ) PRINT 'ANSI_PADDING' 
IF ( (32 & @options) = 32 ) PRINT 'ANSI_NULLS' 
IF ( (64 & @options) = 64 ) PRINT 'ARITHABORT' 
IF ( (128 & @options) = 128 ) PRINT 'ARITHIGNORE'
IF ( (256 & @options) = 256 ) PRINT 'QUOTED_IDENTIFIER' 
IF ( (512 & @options) = 512 ) PRINT 'NOCOUNT' 
IF ( (1024 & @options) = 1024 ) PRINT 'ANSI_NULL_DFLT_ON' 
IF ( (2048 & @options) = 2048 ) PRINT 'ANSI_NULL_DFLT_OFF' 
IF ( (4096 & @options) = 4096 ) PRINT 'CONCAT_NULL_YIELDS_NULL' 
IF ( (8192 & @options) = 8192 ) PRINT 'NUMERIC_ROUNDABORT' 
IF ( (16384 & @options) = 16384 ) PRINT 'XACT_ABORT'

答案 1 :(得分:1)

既然你提到SSMS和SqlClient之间的结果不同,我可以想到两个选项

  • 在不同的模式中实际上有两个不同的sprocs,SSMS选择一个而另一个SqlClient(可能是基于身份)
  • (更有可能)SET选项不同,导致不同的行为

要检查后者,请在SSMS和select @@OPTIONS中运行SqlClient,然后进行比较。这里列出了标志:http://www.mssqltips.com/sqlservertip/1415/determining-set-options-for-a-current-session-in-sql-server/

答案 2 :(得分:1)

当您连接到数据库时,始终会有一个与之关联的登录帐户。您使用的应用程序的登录名是否与使用SQL Server Management Studio时使用的登录名不同?日期格式基于登录的默认语言。

请运行以下查询:

Select  syslogins.name, syslogins.language, syslanguages.dateformat
From    sys.syslogins
        Inner Join sys.syslanguages
            On syslogins.language = syslanguages.name

检查dateformat列以查看返回的所有登录信息。如果dateformat不同,那么这可能解释了为什么从应用程序运行到从SSMS运行时得到的结果不同。

如果这确实是导致问题的原因,那么您可以按照此博客中的说明更改登录的默认语言:http://blogs.lessthandot.com/index.php/datamgmt/datadesign/setting-a-standard-dateformat-for-sql-se/

答案 3 :(得分:0)

确定问题出在(DATEPART(dw, rsdm.DateCreated)) != 7 AND (DATEPART(dw, rsdm.DateCreated)) !=1

SqlClient用户将DATEFIRST设置为1,其中我的SSMS为7.所有其他与其他sql server实例相同的用户连接都将DATEFIRST设置为7.(还要感谢@" G Mastros"最终确认问题)。

我所做的只是暂时添加SQL脚本SET DATEFIRST 7;,并将处理用户以后设置1的原因!