2011-12-06 51 views
5

我正面臨這個問題。我有一個存儲過程,當我執行它時返回6行。爲什麼IDataReader會丟失一行?

但是當我用ExecuteReader檢索我的應用程序中的行,它只返回只有5行。 爲什麼它失去了一行?

我的存儲過程包括5點聯合聲明,其都可以從一個單一的桌上擺滿:

dbase.AddInParameter(cmd, "@LoginUser", DbType.String, UserID); 

    try 
    { 
     using (IDataReader dr = dbase.ExecuteReader(cmd)) 
     if (dr.Read()) 
     { 
     dt = new DataTable("DashBoard"); 
     dt.Load(dr); 
     } 
    } 

dbase是我的數據庫對象。而cmd是用來調用存儲過程的SqlCommand

UserID是參數傳遞

存儲過程的代碼是:

ALTER PROCEDURE [dbo].[USP_ViewAdminDashBoard](@LoginUser varchar(75)) 
    -- Add the parameters for the stored procedure here 
AS 
BEGIN 

    SET NOCOUNT ON; 
    SET DATEFORMAT DMY; 
    DECLARE @LastLoginDate as DateTime 

     Select @LastLoginDate = dbo.UDF_GetLastLoginByUser(@LoginUser) 
    Select 'Last Login Date', convert(varchar(12),@LastLoginDate,105) 

    Union 
    Select 'Nos. Records pending for Upload' as Title, convert(varchar(5),COUNT(s.BatchID)) Total from dbo.BREGISTRATIONENTRY s, Dbo.TBL_iBATCH B 
    where B.BatchID = s.BatchID And b.Forwarded = 0 and b.isBatchClosed = 1 
END 
+3

請出示您的碼。 –

+1

請向我們展示存儲過程。 – Fischermaen

回答

12

你的第一dr.Read被推進到第一行。該DataTable.Load正在讀剩餘行而不是第一行

使用HasRows要測試存在和不使用ReadDataTable.Load

編輯前:

只是加載數據表而不先進行測試:然後在DataTable上測試。 IDataReader界面中沒有HasRows。

+0

謝謝Pal我錯過了基本的 – joshua

+1

不幸的是,'IDataReader'沒有'HasRows',所以我想你可以創建'DataTable'並檢查結果是否有行。 –

+0

@ C.Evenhuis:是的,將更新 – gbn

0

IDataReader是一個前向閱讀器,它意味着當您閱讀一行時,該行將從閱讀器中刪除,並且您無法再從閱讀器中獲取它。

+0

這是一個讀者的基本行爲 – joshua

0

joshua我也有這個問題,雖然使用企業庫超過兩次,即使我使用相同的代碼寫下來,但兩次我在我的存儲過程中發現一個問題,必須有任何錯誤的選擇在查詢或任何其他認爲其他分貝服務器不檢測和我解決它,我 IDataReader的選擇所有的行,還可以使用同樣的方式使用「GBN」 建議(IDataReader的DR = oDb.ExecuteReader(p_oDbCommand)){

   if (dr != null) 
       { 

        ds.Tables[0].Load(dr); 
       } 

      } 
      return dt; 
相關問題