2011-12-06 30 views
5

Tôi đang đối mặt với vấn đề này. Tôi có một thủ tục lưu trữ mà trả về 6 hàng khi tôi thực hiện nó.Tại sao IDataReader mất liên tiếp?

Nhưng khi tôi truy xuất các hàng trong ứng dụng của mình bằng cách sử dụng ExecuteReader, nó chỉ trả về 5 hàng. Tại sao nó mất một hàng ??

thủ tục lưu trữ của tôi bao gồm 5 báo cáo công đoàn mà có được lấp đầy từ một bảng duy nhất:

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 là đối tượng cơ sở dữ liệu của tôi. Và cmdSqlCommand được sử dụng để gọi thủ tục được lưu trữ.

UserID là tham số được truyền

lưu trữ mã thủ tục là:

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

Xin chỉ cho bạn mã. –

+1

Vui lòng chỉ cho chúng tôi quy trình được lưu trữ. – Fischermaen

Trả lời

12

Your first dr.Read đang tiến vào hàng đầu tiên. Các DataTable.Load đang đọc các hàng còn lại nhưng không phải là dòng đầu tiên

Sử dụng HasRows để kiểm tra sự tồn tại và không sử dụng Read trước DataTable.Load

Edit:

Chỉ cần nạp DataTable mà không cần thử nghiệm đầu tiên : sau đó kiểm tra trên DataTable. Không có HasRows trong giao diện IDataReader.

+0

Cảm ơn Pal tôi đã bỏ lỡ cơ bản – joshua

+1

Thật không may, 'IDataReader' không có' HasRows', vì vậy tôi đoán bạn có thể chỉ cần tạo 'DataTable' và kiểm tra xem kết quả có các hàng thay thế không. –

+0

@ C.Evenhuis: ah có, sẽ cập nhật – gbn

0

IDataReader là trình đọc chuyển tiếp, có nghĩa là khi bạn đọc một hàng, hàng đó sẽ bị xóa khỏi trình đọc và bạn không thể lấy nó từ trình đọc nữa.

+0

Đó là hành vi cơ bản của người đọc – joshua

0

joshua tôi cũng gặp vấn đề này khi sử dụng thư viện doanh nghiệp hơn hai lần ngay cả khi tôi sử dụng cùng mã được viết nhưng cả hai lần tôi tìm thấy sự cố trong quy trình lưu trữ của mình phải có bất kỳ lựa chọn sai nào trong truy vấn hoặc bất kỳ suy nghĩ nào khác máy chủ không phát hiện và tôi giải quyết nó và IDataReader tôi chọn tất cả các hàng và cũng có thể sử dụng cùng một cách như đề nghị của 'GBN' sử dụng (IDataReader dr = oDb.ExecuteReader (p_oDbCommand)) {

   if (dr != null) 
       { 

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

      } 
      return dt; 
Các vấn đề liên quan