自SQL 2008升级以来,SqlDataReader.HasRows返回false

我有一个连接到SQL数据库的ASP.NET 2.0网站。 我已经将SQL服务器从2000升级到2008,从那以后,一个页面拒绝工作。

我解决了问题是,即使数据集不为空,对SqlDataReader.HasRows的调用也返回false并且删除检查允许循环通过reader.Read()来访问预期的数据。

_connectionString = WebConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString; SqlConnection connection = new SqlConnection(_connectionString); SqlCommand command = new SqlCommand(searchtype, connection); SqlParameter _parSeachTerm = new SqlParameter("@searchterm", SqlDbType.VarChar, 255); _parSeachTerm.Value = searchterm; command.Parameters.Add(_parSeachTerm); command.CommandType = CommandType.StoredProcedure; try { connection.Open(); SqlDataReader reader = command.ExecuteReader(); if (reader.HasRows) //this always returns false!? { while (reader.Read()) {... 

有人知道发生了什么吗? HasRows返回正确值的其他页面上有类似的代码块。

编辑 – 只是为了澄清,存储过程会返回我已经确认的结果,因为如果我删除HasRows检查,循环运行正常。 仅将连接字符串中的SQL Server名称更改为在SQL 2000上运行的相同数据库会使问题消失。 我已经检查过NOCOUNT是关闭的,那么还有什么能让HasRows在不是这样的情况下返回false?

EDIT2-这是SP

 CREATE PROCEDURE StaffEnquirySurnameSearch @searchterm varchar(255) AS SELECT AD.Name, AD.Company, AD.telephoneNumber, AD.manager, CVS.Position, CVS.CompanyArea, CVS.Location, CVS.Title, AD.guid AS guid, AD.firstname, AD.surname FROM ADCVS AD LEFT OUTER JOIN CVS ON AD.Guid=CVS.Guid WHERE AD.SurName LIKE @searchterm ORDER BY AD.Surname, AD.Firstname GO 

提前谢谢了。

如果直接调用存储过程,SSMS中是否有效? 我首先要确保它确实如此。

HasRows需要一个可滚动的游标。

您带回的行是否包含任何大image/BLOB数据?

正如其他人建议的那样,我认为发布Stored Procedure可能会对此事有所启发……

首先,检查程序为@tvanfosson说。 其次,在代码片段中检查HasRows()实际上是不必要的。

您是不是偶然使用了RAISEERROR? 我们发现一些问题使用与上面相同的模式(检查HasRows,然后是reader.Read())并发现如果RAISEERROR与某个错误代码一起使用(我认为超过16)那么HasRows将返回false 并且我们会有捕获exception的问题。

它是您的连接字符串,存储过程或sql驱动程序中的错误。 大多数人都在猜测存储过程。 所以告诉我们代码。 当你在它时,向我们展示连接字符串和searchtype变量内容。

我再次猜测。
您是否有机会打开多个数据加载器?

添加MARS_Connection = yes; 或者MultipleActiveResultSets =连接字符串为true,如果有帮助的话。
此外,您不建议使用连接和datareader

写一个更简单的方法就可以了

using (connection cnn = new Connection(...) { using (SqlDataReader rdr = .... { //some code which deals with datareader } }
using (connection cnn = new Connection(...) { using (SqlDataReader rdr = .... { //some code which deals with datareader } } 

一旦操作完成,这将关闭连接和datareader。

我认为你已经倒退了NOCOUNT。 我相信NOCOUNT需要继续努力。

在存储过程中,在AS之后和任何代码之前添加SET NOCOUNT ON。 否则返回两个结果集。 一个有计数,一个有实际数据。 您只希望结果集包含实际数据。