6

我有一个连接到 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 服务器名称更改为在 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

提前谢谢了。

4

7 回答 7

1

如果您直接调用存储过程(例如在 SSMS 中),存储过程是否有效?我会首先确保它确实如此。

于 2008-10-13T11:26:45.287 回答
1

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

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

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

于 2008-10-13T15:19:54.553 回答
0

我认为你有 NOCOUNT 倒退。我相信 NOCOUNT 需要启用才能使其正常工作。

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

于 2008-10-13T22:17:12.510 回答
0

我又在猜测了。
您是否有机会打开多个数据读取器?

添加 MARS_Connection=yes; 或 MultipleActiveResultSets=true 连接字符串,如果有帮助的话。
此外,您不推荐使用连接和数据读取器

一种更简单的编写方法可能是


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

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

于 2008-10-13T16:10:42.203 回答
0

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

于 2008-10-13T11:30:55.623 回答
0

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

于 2008-10-13T15:10:07.240 回答
0

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

于 2008-10-13T15:11:22.043 回答