C# 自SQL 2008升级后,SqlDataReader.HasRows返回false
我有一个连接到SQL数据库的ASP.NET2.0网站。我将SQL server从2000年升级到2008年,从那以后,有一个页面无法工作 我发现问题在于,即使数据集不是空的,对SqlDataReader.HasRows的调用仍返回false,删除该检查将允许通过reader.Read()循环访问预期的数据C# 自SQL 2008升级后,SqlDataReader.HasRows返回false,c#,asp.net,sql,sql-server-2008,C#,Asp.net,Sql,Sql Server 2008,我有一个连接到SQL数据库的ASP.NET2.0网站。我将SQL server从2000年升级到2008年,从那以后,有一个页面无法工作 我发现问题在于,即使数据集不是空的,对SqlDataReader.HasRows的调用仍返回false,删除该检查将允许通过reader.Read()循环访问预期的数据 _connectionString = WebConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString;
_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呢
编辑2-这是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中调用它,存储过程是否工作?首先,我要确保它是正确的。首先,按照@tvanfosson所说的检查程序。
其次,在代码段中实际上不需要检查HasRows() 你不是偶然使用RAISEERROR的吗?我们发现使用与上面相同的模式时出现了一些问题(检查HasRows,然后是reader.Read()),并发现如果RAISEERROR与某个错误代码一起使用(我相信是16以上),那么HasRows将返回false,并且我们将无法捕获异常。这可能是您的连接字符串,即存储过程,或者sql驱动程序中的错误。 大多数人都在猜测存储过程。 让我们看看代码。
操作时,向我们显示连接字符串和searchtype变量内容。
HasRows
需要一个可滚动的光标
您要返回的行是否包含任何大的图像/BLOB
数据
正如其他人所建议的,我认为发布
存储过程可能会对这件事有所帮助。我又在猜测。
您是否碰巧打开了多个数据读取器
添加MARS_连接=是;或MultipleActiveResultSets=连接字符串的true(如果有帮助)。
此外,您不建议使用connection&datareader进行操作
一种更简单的编写方法是
using (connection cnn = new Connection(...)
{
using (SqlDataReader rdr = ....
{
//some code which deals with datareader
}
}
操作完成后,此操作将关闭连接和数据读取器。我认为您没有倒数。
我相信这一切都不需要计算
在存储过程中添加
不计较
在AS之后和任何代码之前。
否则,它将返回两个结果集。
一个是计数,一个是实际数据。
您只需要具有实际数据的结果集。拿出Profiler,看看幕后发生了什么。这可能是迁移的一个问题。探查器将在发送查询时向您显示查询,以便您可以测试它们以确保它们正常工作。此存储过程中是否有打印语句?(猜测)不,这只是一个简单的选择,只有一个连接。谢谢,添加MARS会提供系统。ArgumentException:关键字不受支持:“MARS\u connection”。清理资源是在最后一个区块完成的。我认为你是对的。如果海报将NOCOUNT信息放在问题中而不是评论中,会很有帮助。。。