C#ExecuteReaderAsync偶发性问题

问题描述

我有一种获取用户列表的方法。有一个存储过程,应该是用户名或null。它根据该参数返回一个或多个用户。它在大多数情况下都能正常工作,但是我注意到有时即使我传递相同的确切参数也不会返回任何结果。我在“执行读取器异步”中放置了一个断点,并紧接其后的行。发生问题时,它会到达第一个断点,但不会到达第二个断点。它不会引发异常,也不会阻止我打电话。我可以拨打下一个电话,它将按预期返回结果。对于可能导致此问题的一些建议,我将不胜感激。

 public async Task<List<User>> GetUsers(string username,int accountType = 1)
    {
        List<User> users = null;
      
        parameters = new List<sqlParameter>{
                    new sqlParameter{
                    DbType = DbType.String,ParameterName = "@userName",Value = username.NotEmpty() ? username : (object) dbnull.Value
                 },new sqlParameter{
                    DbType = DbType.Int32,ParameterName = "@accountType",Value = accountType
                 }
            };

        try
            {
                using (sqlConnection con = new sqlConnection(conStr))
                {
                    await con.OpenAsync();
                    using (sqlCommand cmd = new sqlCommand("spGetUsers",con))
                    {
                        cmd.Parameters.AddRange(parameters.ToArray());
                        cmd.CommandType = CommandType.StoredProcedure;
                        sqlDataReader dr = await cmd.ExecuteReaderAsync()
                        if (dr.HasRecord())
                        {
                            while (await dr.ReadAsync())
                            {
                                User user = new User();
                                user.FirstName = dr["firstName"].ToString();
                                user.LastName = dr["lastName"].ToString();
                                user.DateRegister = Convert.ToDateTime(dr["DateRegister"].ToString());
                                user.Active = Convert.ToBoolean(dr["Active"].ToString());
                                if(users == null)
                                {
                                    users = new List<User>();
                                }
                                users.Add(user);
                            }
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                Util.LogError(ex.ToString());
                users = null;
            }
        return users;

    }

更新

是,正在记录错误。另外,我在catch语句中添加一个断点,以防引发错误

以下是用于创建该存储过程的查询

IF EXISTS (SELECT 1 FROM SYS.objects WHERE object_id = OBJECT_ID('spGetUsers') AND TYPE IN (N'PC',N'P'))
DROP PROCEDURE spGetUsers
GO
CREATE PROCEDURE spGetUsers
 @userName nvarchar(50),@accountType int = 1
AS
BEGIN
 SELECT U.firstName,U.lastName,U.DateRegister,A.Active
 FROM [User] U
 inner join UserAccount UA
 on U.Id = UA.userid
 inner join Account A
 on A.Id = UA.accountId
 WHERE U.Id > 0
 AND UA.Id > 0
 AND A.Id > 0
 AND UA.AccountType IN (@accountType )
 and (A.UserName in (@userName) or @userName IS NULL)
END

用于检查sql DataReader是否具有记录的扩展方法

   public static bool HasRecord(this System.Data.sqlClient.sqlDataReader dr)
        {
            if (dr != null && dr.HasRows)
            {
                return true;
            }

            return false;
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)