为什么IDataReader会丢失一行?

时间:2011-12-06 07:38:09

标签: c# asp.net sql enterprise-library

我正面临这个问题。我有一个存储过程,当我执行它时会返回6行。

但是当我使用ExecuteReader检索应用中的行时,它只返回5行。 为什么会失去一排?

我的存储过程由5个union语句组成,这些语句从单个表中填充:

 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 个答案:

答案 0 :(得分:12)

您的第一个dr.Read正在前进到第一行。 DataTable.Load正在读取剩余的行而不是第一行

使用HasRows测试是否存在,不要在Read之前使用DataTable.Load

编辑:

只需加载DataTable而不先测试:然后在DataTable上进行测试。 IDataReader界面中没有HasRows。

答案 1 :(得分:0)

IDataReader是一个前向阅读器,这意味着当您读取一行时,该行将从阅读器中删除,您无法再从阅读器中获取该行。

答案 2 :(得分:0)

joshua我也有这个问题,而使用企业库两次以上,即使我使用相同的代码写下来,但我发现我的存储过程中的问题,在查询中必须有任何错误的选择或任何其他想法的数据库服务器没有检测到我解决它 我的IDataReader选择所有行,并使用与'gbn'建议相同的方式   使用(IDataReader dr = oDb.ExecuteReader(p_oDbCommand))                 {

                if (dr != null)
                {

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

            }
            return dt;