SQL 2008升级后,SqlDataReader.HasRows返回false

本文关键字:HasRows 返回 false SqlDataReader 2008升 SQL | 更新日期: 2023-09-27 17:48:54

我有一个连接到SQL数据库的ASP.NET 2.0网站。我已经从2000年升级到2008年,从那以后,有一个页面无法工作。

我已经解决了问题,对SqlDataReader.HasRows的调用返回false,即使数据集不是空的,并且删除检查允许循环通过读取器。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返回正确值的其他页面上也有类似的代码块。

EDIT-只是澄清一下,存储过程确实返回了我已经确认的结果,因为如果我删除HasRows检查,循环运行良好。只需将连接字符串中SQL服务器的名称更改为在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

非常感谢。

SQL 2008升级后,SqlDataReader.HasRows返回false

如果直接在中调用存储过程,比如在SSMS中,存储过程是否工作?我会从确保它做到这一点开始。

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

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

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

首先,按照@tvanfosson所说的检查过程。其次,在代码片段中实际上没有必要检查HasRows()。

您不是偶然使用RAISEERROR吗?我们使用与上面相同的模式发现了一些问题(检查HasRows,然后是reader.Read()),并发现如果RAISEERROR与某个错误代码一起使用(我相信是16以上),那么HasRows将返回false,并且我们将在捕获异常时遇到问题。

它要么是连接字符串,要么是存储过程,要么是sql驱动程序中的错误。大多数人都在猜测存储过程。给我们看看代码。当您使用它时,向我们展示连接字符串和searchtype变量的内容。

我又在猜测了
你有没有打开多个数据读取器?

添加MARS_Connection=是;或者MultipleActiveResultSets=true,如果这有帮助的话
此外,您对connection&数据读取器不是推荐的操作方式

一种更简单的写入方式可以是


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

一旦操作完成,这将关闭连接和数据读取器。

我想你已经把NOCOUNT倒过来了。我相信NOCOUNT需要打开才能工作。

在存储过程中添加设置NOCOUNT在AS之后和任何代码之前。否则,它将返回两个结果集。一个带有计数,一个带有实际数据。您只需要具有实际数据的结果集。