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
非常感谢。
如果直接在中调用存储过程,比如在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之后和任何代码之前。否则,它将返回两个结果集。一个带有计数,一个带有实际数据。您只需要具有实际数据的结果集。