我想为图书馆制作一个简单的软件。我刚刚开始在C#中掌握OOP的概念,我的一位教授告诉我,在您的代码中使用存储库类是很好的做法,这样客户端代码就不会直接交互与处理数据库的类。所以我试图在Windows窗体中使登录/注册表单工作,但我遇到了一些问题。
public User GetByUsernameAndPassword(string username, string password)
{
using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
{
using (StreamReader sr = new StreamReader(fs))
{
while (!sr.EndOfStream)
{
User item = new User();
item.FirstName = sr.ReadLine();
item.LastName = sr.ReadLine();
item.Username = sr.ReadLine();
item.Password = sr.ReadLine();
if (item.Username == username && item.Password == password)
{
return item;
}
}
return null;
}
}
}
我的观点是,我想看看当我注册一个新用户时,如果已经有另一个用户具有相同的用户名,如果有,我想要一个消息框显示说同一个用户名不能使用两次。我怎样才能做到这一点?如果返回的结果为null,如何在结果从类User返回对象时登录用户,如何显示消息框?
非常感谢。
答案 0 :(得分:1)
在开始考虑寻找重复的用户名之前,我建议您为“数据库”定义一个结构。此时,这看起来是一个简单的文本文件,但我看不到任何存储多个用户的规定。
如果您的应用程序用户数量较少,则文本文件可能没问题,但为其定义格式很重要(例如,每行1个用户,属性以逗号分隔为基本概念)。如果是这种情况,我建议在启动时将整个文件读入RAM并将其存储在IEnumerable类型中。
如果您的应用程序将拥有大量用户数(并且我怀疑在给定上下文的情况下,它不会),您可能需要考虑一个正确的数据库解决方案(可能是基于SQL的),因为您很快就会发现文本文件此时效率低下。
一旦你对它进行了排序,检测重复就变得容易了。例如,如果您有一个User对象列表,则可以:
private List<User> users;
internal bool DoesUsernameExist(string username)
{
return (this.users.Where(x => x.Username == username).Count() > 0);
}
还有一点需要注意;以纯文本形式存储密码可能不是一个好主意。您可能希望使用行业标准的散列算法来查看密码散列以保护它们:https://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1(v=vs.110).aspx。