首页 > 解决方案 > C# ExecuteReaderAsync 零星问题

问题描述

我有一个获取用户列表的方法。有一个需要用户名或 null 的存储过程。它根据参数返回一个或多个用户。它在大多数情况下都可以正常工作,但我注意到有时即使我传递了相同的确切参数,它也不会返回任何结果。我在 Execute Reader Async 中设置了一个断点,并在它之后的行中设置了一个断点。当问题发生时,它会到达第一个断点,但不会到达第二个断点。它不会引发异常或阻止我再次拨打电话。我可以打下一个电话,它会按预期返回结果。对于可能导致此问题的原因,我将不胜感激?

 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;
        }

标签: ado.netsql-server-2017

解决方案


推荐阅读