C# 为什么LINQ查询不返回任何元素?
我有以下代码和数据库,我不理解这个问题。每当我尝试运行该程序时,它总是引发以下异常: System.Core.dll中发生类型为“System.InvalidOperationException”的未处理异常 在我的用户数据库中,有一行的用户名是:majorcsanad,密码是:722308,当我试图用这个名称/密码登录时,它说它包含零元素 我的代码如下:C# 为什么LINQ查询不返回任何元素?,c#,sql,sql-server,linq,C#,Sql,Sql Server,Linq,我有以下代码和数据库,我不理解这个问题。每当我尝试运行该程序时,它总是引发以下异常: System.Core.dll中发生类型为“System.InvalidOperationException”的未处理异常 在我的用户数据库中,有一行的用户名是:majorcsanad,密码是:722308,当我试图用这个名称/密码登录时,它说它包含零元素 我的代码如下: public partial class Login : Form { szofttech2Entities context = n
public partial class Login : Form
{
szofttech2Entities context = new szofttech2Entities();
public Login()
{
InitializeComponent();
}
private void buttonEnter_Click(object sender, EventArgs e)
{
var password = (from u in context.Users
where u.UserName == textBoxUserName.Text
select u.Password).Single();
if (textBoxPassword.Text == password)
{
Order order = new Order();
order.Show();
this.Hide();
}
else
{
labelWrongUserPassword.Visible = true;
}
}
}
由于使用的是
.Single()
linq查询,因此您将获得System.InvalidOperationException
当未找到任何元素或找到多个与搜索匹配的元素时,就会发生这种情况。因此,您要么有多个用户使用相同的用户名,要么没有用户使用该用户名
在查找用户名时还需要考虑案例。确保搜索忽略大小写,或者搜索更改数据库中用户名大小写的大小写
您还可以将代码修改为读取SingleOrDefault()
,如果未找到异常,则不会引发异常,但如果找到多个异常,则仍会引发System.invalidoOperationException
。在你的情况下,我更喜欢Single()
,因为它告诉你两者。我相信错误就在我自己的角色案例中,但这要由你来解决
下面是一个我如何编写上述代码的示例。。。你会明白的
public partial class Login : Form
{
szofttech2Entities context = new szofttech2Entities();
public Login()
{
InitializeComponent();
}
private void buttonEnter_Click(object sender, EventArgs e)
{
var password = string.Empty;
try
{
password = (from u in context.Users
where u.UserName == textBoxUserName.Text
select u.Password).Single();
}
catch (InvalidOperationException)
{
MessageBox.Show($"None or more than one user found matching {textBoxUserName.Text}");
}
if (!string.IsNullOrEmpty(password))
{
if (textBoxPassword.Text == password)
{
Order order = new Order();
order.Show();
this.Hide();
}
else
{
labelWrongUserPassword.Visible = true;
}
}
}
}
现在,我当场把它擦掉只是为了帮助,我犯了一些错误,所以…您得到的是
System.InvalidOperationException
,因为您使用的是.Single()
linq查询
当未找到任何元素或找到多个与搜索匹配的元素时,就会发生这种情况。因此,您要么有多个用户使用相同的用户名,要么没有用户使用该用户名
在查找用户名时还需要考虑案例。确保搜索忽略大小写,或者搜索更改数据库中用户名大小写的大小写
您还可以将代码修改为读取SingleOrDefault()
,如果未找到异常,则不会引发异常,但如果找到多个异常,则仍会引发System.invalidoOperationException
。在你的情况下,我更喜欢Single()
,因为它告诉你两者。我相信错误就在我自己的角色案例中,但这要由你来解决
下面是一个我如何编写上述代码的示例。。。你会明白的
public partial class Login : Form
{
szofttech2Entities context = new szofttech2Entities();
public Login()
{
InitializeComponent();
}
private void buttonEnter_Click(object sender, EventArgs e)
{
var password = string.Empty;
try
{
password = (from u in context.Users
where u.UserName == textBoxUserName.Text
select u.Password).Single();
}
catch (InvalidOperationException)
{
MessageBox.Show($"None or more than one user found matching {textBoxUserName.Text}");
}
if (!string.IsNullOrEmpty(password))
{
if (textBoxPassword.Text == password)
{
Order order = new Order();
order.Show();
this.Hide();
}
else
{
labelWrongUserPassword.Visible = true;
}
}
}
}
现在,我当场把它划破只是为了帮忙,我犯了错误,所以…真的只有一个这样的用户吗
.Single
在多个元素满足条件时抛出。是的,我检查了它,而且该列是唯一的。我尝试使用firsOrdefault,错误与您将密码存储为纯文本相同-一个很大的“否”,因为这会使系统用户容易获取密码。即使是作为学习练习的一部分,这也不应该被接受,更不用说生产项目了。FirstOrDefault()。由于查询未找到任何数据,您可能会遇到错误。确保context.Users不为null。您可能没有连接到数据库。请在第行if(textBoxPassword.Text==password)
上放置一个断点,然后查看密码
变量的作用:1)在弹出窗口中(悬停在变量上)或2)在即时窗口中
[Debug->Windows->Immediate]输入?密码
,然后按Enter
。真的只有一个这样的用户吗.Single
在多个元素满足条件时抛出。是的,我检查了它,而且该列是唯一的。我尝试使用firsOrdefault,错误与您将密码存储为纯文本相同-一个很大的“否”,因为这会使系统用户容易获取密码。即使是作为学习练习的一部分,这也不应该被接受,更不用说生产项目了。FirstOrDefault()。由于查询未找到任何数据,您可能会遇到错误。确保context.Users不为null。您可能没有连接到数据库。请在第行中放置一个断点,如果(textBoxPassword.Text==password)
并查看密码
变量的作用:1)在弹出窗口(悬停在变量上)或2)在即时窗口
[Debug->Windows->Immediate]中键入?密码
,然后按输入
。