public class UserLoginInfo
{
public UserRole Role;
public string Username;
public static UserLoginInfo FetchUser(string username, string password)
{
using (var connection = Utils.Database.GetConnection())
using (var command = new SqlCommand("SELECT [Username], [Password], [Role] FROM [Users] WHERE [Username] = @username", connection))
{
command.Parameters.AddWithValue("@username", username);
using (var reader = command.ExecuteReader())
{
if (reader == null || !reader.Read() || !Utils.Hash.CheckPassword(username, password, (byte[])reader["Password"]))
throw new Exception("Wrong username or password.");
return new UserLoginInfo { Username = (string)reader["Username"], Role = (UserRole)reader["Role"] };
}
}
}
}
当我输入断点并调试时,错误来自此行
return
new UserLoginInfo
{
Username = (string)reader["Username"],
Role = (UserRole)reader["Role"]
};
我不明白为什么会收到此错误。请帮帮我!
编辑:如何将(字符串)阅读器[“Role”]转换为UserRole ??
public enum UserRole
{
Admin,
Maintance,
User
}
答案 0 :(得分:8)
Role = (UserRole)reader["Role"]
据推测,UserRole
是您定义的类型,因此SqlDataReader
不知道如何将从数据库获取的数据转换为此类型。数据库中此列的类型是什么?
编辑:至于你可以做的更新问题:
var role = (string)reader["Role"];
UserRole role = (UserRole)Enum.Parse( typeof(UserRole), role );
您可能希望添加一些额外的错误检查,例如检查role
是否为空。此外,在解析枚举之前,您可以使用Enum.IsDefined检查解析是否有效。
答案 1 :(得分:2)
(UserRole)reader["Role"]
应为(string)reader["Role"]
。 SQL服务器中没有UserRole
类型。
答案 2 :(得分:1)
代码可能失败了:
Role = (UserRole)reader["Role"];
因为你试图将object
投射到UserRole
并且演员阵容不存在。
看起来你正在尝试将 reader["Role"]
转换为UserRole
对象,我猜这是失败的。
您需要指定(或实现)有效的强制转换,或者实现UserRole.Parse(string value)
之类的内容来将字符串解析为有效的UserRole
对象。
答案 3 :(得分:1)
如果您在数据库中存储的内容是string
,但您希望将其转换为enum
类型,则应使用Enum.Parse()
method。
例如:
UserRole userRole = (UserRole) Enum.Parse(typeof(UserRole), (string) reader["Role"]);
答案 4 :(得分:0)
这意味着你要么不能投射(string)reader["Username"]
(不太可能),要么投射(UserRole)reader["Role"]
(更有可能)。什么是UserRole
- 您可以通过从db结果中进行转换来创建它吗?你不需要像new UserRole(reader["Role"])
这样的东西吗?
答案 5 :(得分:0)
可能(UserRole)Enum.Parse(typeof(UserRole), (string) reader["Role"])
是最受欢迎的答案,而且,令我惊讶的是,它的确有效! (令人惊讶的是,Enum.Parse方法正确地将整数的字符串表示转换为其对应的枚举值,考虑到数据库中的枚举值存储为整数)。但这就是我经常做的事情,要点到这一点:
UserRole role = (UserRole)Convert.ToInt32(reader["Role"]);
这应该更有效率,但在现实生活中没有明显的效果。