【发布时间】:2014-03-20 13:49:00
【问题描述】:
有人要求我将网站应用程序从一台服务器迁移到另一台服务器。 代码是以前的开发者写的。
他使用以下内容创建了一个存储过程: [参数]
@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 原因]:
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 数据库副本上设置了我的 PC 上的代码和网站...它返回正确的值 8200。然后我将 web.config 更改为指向新网站 sql server...6500 行!!!
我备份了现场 sql 数据库并在我的 PC 上本地恢复了相同的数据库并对其进行了测试...... 8200 行!!!
旧站点有 Sql server 2005,我的 PC 有开发人员 SQL 2012,而实时服务器有 SQL 2012。
然后我在新站点 Sql Server 上运行 sql profiler,提取脚本并在同一个 sql 数据库 8200 条记录上运行脚本!!!
我在过去的 1-2 天里一直在研究这个问题,但仍然不知道为什么实时 Sql Server 通过 sqldatareader 返回 6500 行。
任何建议将不胜感激。
【问题讨论】:
-
很抱歉,没有实际数据几乎不可能回答这个问题。
-
CS/CI(区分大小写)设置是否相同? ansi-null 默认值是否相同?
-
OK 希望有人会说这是 SqlDataReader 中的一些东西,我错过了一些东西。我检查了数据,似乎没有问题。
-
开始删除 where 子句,看看你最终能不能得到数据,然后再次添加它们,你就会发现哪里出错了
-
你为什么使用
CONVERT(VARCHAR(8),rsdm.DateCreated,108) BETWEEN @StartTime AND @EndTime?通过字符串投射日期绝不是一个好主意;那里的意图是什么? (注意这有两种强制转换——一种是隐式的,一种是显式的——不好)
标签: c# sql-server tsql sqldatareader