2008-10-13 53 views
4

我有一個連接到SQL數據庫的ASP.NET 2.0網站。我已經將SQL服務器從2000年升級到2008年,從那時起,一個頁面拒絕工作。自SQL 2008升級以來,SqlDataReader.HasRows返回false

我已經解決了這個問題,即使數據集不是空的,對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 

提前非常感謝。

+0

滾出Profiler,看看幕後發生了什麼。可能是遷移問題。事件探查器會向您顯示發送的查詢,以便您可以測試它們以確保它們正常工作。 – Will 2008-10-13 12:26:48

+0

在這個存儲過程中是否有打印語句? (猜測) – shahkalpesh 2008-10-13 14:56:36

+0

nope,它只是一個簡單的選擇與一個聯接 – ballpointpe0n 2008-10-13 15:02:20

回答

1

存儲過程是否可以在SSMS中直接調用它?我首先確定它的確如此。

0

首先,檢查程序爲@tvanfosson說。其次,HasRows()的檢查在代碼片段中實際上是不必要的。

0

您是不是偶然使用RAISEERROR?我們發現使用與上面相同的模式(檢查HasRows,然後reader.Read())發現一些問題,如果RAISEERROR與某個錯誤代碼一起使用(我認爲高於16),那麼HasRows將返回假我們會遇到捕捉異常的問題。

0

它是你的連接字符串,存儲過程或SQL驅動程序中的錯誤。 大多數人都在猜測存儲過程。 讓我們看看代碼。 當你在它的時候,向我們展示連接字符串和searchtype變量的內容。

1

HasRows需要可滾動的遊標。

您要帶回的行是否包含任何大的image/BLOB數據?

由於別人的建議,我想張貼Stored Procedure可能會引發對此事的一些輕......

0

我再次猜測。
您是否有多個數據採集器可以隨時打開?

添加MARS_Connection = yes;或者MultipleActiveResultSets = true的連接字符串,如果有幫助。
此外,您的連接& DataReader的使用情況是不做事

寫一個簡單的方法的推薦方式,它可能是

 

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

一旦操作完成後,將會關閉連接和DataReader 。

0

我認爲你有NOCOUNT倒退。 我相信NOCOUNT需要繼續工作。

在您的存儲過程中添加 SET NOCOUNT ON 之後的AS和之前的任何代碼。 否則它返回兩個結果集。 一個與計數和一個與實際數據。 您只需要將結果集與實際數據一起使用。