我正面临这个问题。我有一个存储过程,当我执行它时会返回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
答案 0 :(得分:12)
您的第一个dr.Read
正在前进到第一行。 DataTable.Load正在读取剩余的行而不是第一行
使用HasRows测试是否存在,不要在Read
之前使用DataTable.Load
编辑:
只需加载DataTable而不先测试:然后在DataTable上进行测试。 IDataReader界面中没有HasRows。
答案 1 :(得分:0)
IDataReader是一个前向阅读器,这意味着当您读取一行时,该行将从阅读器中删除,您无法再从阅读器中获取该行。
答案 2 :(得分:0)
if (dr != null)
{
ds.Tables[0].Load(dr);
}
}
return dt;