ado.net - 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;
}
解决方案
推荐阅读
- json - Angular - 将json文件分配给类的问题
- botframework - Microsoft BotBuilder Azure OAuth 身份验证 ConnectionSettingName 值
- javascript - 为数据库构建 Web 界面
- python - AttributeError:“dict”对象没有属性“is_active”(PyMongo 和 Flask)
- web - 每个浏览器的 XMLHttpRequest 实现是否不同?
- python - 将字符串内的字符串数组转换为python列表
- c++ - 臃肿的目标文件会带来什么成本?
- javascript - 在不可见 asp.net 时阻止加载 iframe
- c# - Xamarin.iOS 上的声学回声消除 (AEC)
- javascript - 滚动后,粘性页脚不会停留在底部