Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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# 存储过程和SqlDataReader返回的行数少于预期_C#_Sql Server_Tsql_Sqldatareader - Fatal编程技术网

C# 存储过程和SqlDataReader返回的行数少于预期

C# 存储过程和SqlDataReader返回的行数少于预期,c#,sql-server,tsql,sqldatareader,C#,Sql Server,Tsql,Sqldatareader,我被要求将网站应用程序从一台服务器迁移到另一台服务器。 代码是由以前的开发人员编写的 他创建了一个具有以下内容的存储过程: [参数] @SurveyPeriodConfigID int = -1, @StartDate DATETIME = NULL, @EndDate DATETIME = NULL, @StartTime DATETIME = [9:00:00], @End

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

他创建了一个具有以下内容的存储过程: [参数]

            @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
以及[在何处使用]:

            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行

我备份了live site sql数据库,在我的电脑上本地还原了相同的数据库,并对其进行了测试。。。8200行

旧网站有Sql server 2005,我的电脑有开发者Sql 2012,而live server有Sql 2012

然后,我在新站点sql Server上运行sql profiler,提取脚本并在同一个sql数据库8200记录上运行脚本

在过去的1-2天里,我一直在研究这个问题,但仍然不知道为什么live Sql Server会通过sqldatareader返回6500行


如果您有任何建议,我将不胜感激。

我将检查不同服务器上的选项配置是否不同,特别是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'

由于您提到了SSMS和SqlClient之间的结果是不同的,所以我可以想到两个选项

实际上,在不同的模式中有两种不同的存储过程,SSMS可能会根据身份选择一种存储过程,而SqlClient则选择另一种存储过程 设置的选项很可能不同,从而导致不同的行为
要检查后者,请在SSMS和via SqlClient中运行select@@OPTIONS,然后进行比较。此处列出了标志:

连接到数据库时,始终有一个与之关联的登录帐户。您使用的应用程序登录名是否与连接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不同,那么这可能解释了为什么从应用程序运行与从SSM运行时得到的结果不同

如果这确实是问题的原因,那么您可以按照本博客中的说明更改登录的默认语言:

确定问题出在DATEPARTdw,rsdm.DateCreated!=7和DATEPARTdw,rsdm.DateCreated=一,

SqlClient用户的DATEFIRST设置为1,其中我的SSMS为7。到其他sql server实例的所有其他相同用户连接的DATEFIRST设置为7。还感谢@G Mastros对问题的最终确认


我所做的只是添加SQL脚本集DATEFIRST 7;现在,我们将讨论为什么用户在以后安装1

很抱歉,如果没有实际数据,几乎不可能回答这个问题。CS/CI区分大小写设置是否相同?ansi null默认值是一样的吗?好吧,我希望有人会说是SqlDataReader中的某些东西让我遗漏了一些东西。我已经检查了数据,它看起来很好。开始删除where类,看看是否最终获得数据,然后再次添加它们,你就会发现哪里出错了为什么要在@StartTime和@EndTime之间使用CONVERTVARCHAR8,rsdm.DateCreated,108?通过字符串来确定日期从来都不是一个好主意;目的何在?请注意,这会进行两次强制转换—一次隐式,一次显式—不好5496 ANSI\U警告ANSI\U填充ANSI\U NULL ARITHABORT引用的标识符ANSI\U NULL\U DFLT\U CONCAT上的ANSIU NULL\U两个Sql 2012上的结果都为NULLservers@Rob您需要分别从SSM和通过SqlClient运行它,分别针对两台服务器运行—重点是找到不同之处。SSMS不使用与SqlClient相同的默认值事实上,SSMS选项取决于SSMSOK中您自己的用户特定选项。5496 SSMS,5492 SqlClient。现在怎么办?一个和另一个有什么不同?谢谢!!!从syslogins.language=syslanguages.name上的syslogins.syslogins内部连接sys.syslanguages中选择syslogins.name、syslanguages.datefirst。。。帮助!!!