为什么IDataReader会丢失一行数据?

5

我遇到了这个问题。我有一个存储过程,执行后返回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

1
请展示给我们存储过程。 - Fischermaen
3个回答

11

您的第一个dr.Read正在前进到第一行。DataTable.Load正在读取其余行,但不包括第一行。

请使用HasRows进行存在性测试,并在DataTable.Load之前不要使用Read

编辑:

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


谢谢,伙计,我想念基础知识。 - joshua
1
不幸的是,IDataReader 没有 HasRows,所以我想你只能创建 DataTable 并检查结果是否有行。 - C.Evenhuis
1
是的,我也做了同样的事情。但是假设读取器无法获取数据,在检查Datatable时会出现DR为空的错误,但为什么不知道。 - joshua
1
@Madhav:你必须使用他们提供给你的内容进行工作,而且你不能先测试DR... - gbn

0

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


0

joshua,我在使用企业库超过两次时也遇到了这个问题,即使我使用相同的代码编写,但两次都发现我的存储过程存在问题,查询中必须有错误的选择或其他数据库服务器无法检测到的问题,我解决了它,并且我的IDataReader选择了所有行,并且使用了与“gbn”建议的相同方式 using (IDataReader dr = oDb.ExecuteReader(p_oDbCommand)) {

                if (dr != null)
                {

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

            }
            return dt;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接