【问题标题】:Why does the LINQ query return no element?为什么 LINQ 查询不返回任何元素?
【发布时间】:2018-05-05 11:55:26
【问题描述】:

我有以下代码和数据库,但我不明白这个问题。每当我尝试运行程序时,它总是抛出这个异常: System.Core.dll 中出现“System.InvalidOperationException”类型的未处理异常

在我的用户数据库中有一行用户名:majorcsanad 和密码:722308,当我尝试使用此名称/密码登录时,它说它包含零元素。

我的代码如下:

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 如果多个元素满足某个条件,则抛出。
  • 是的,我查过了,那一栏也是独一无二的。我用 firsOrdefault 尝试了同样的错误
  • 您将密码存储为纯文本 - 一个很大的“禁忌”,因为它使您系统的用户容易被盗取密码。即使作为学习练习的一部分,这也不应该被接受,更不用说生产项目了。
  • FirstOrDefault()。由于查询未找到任何数据,您可能会遇到错误。确保 context.Users 不为空。您可能没有连接到数据库。
  • if (textBoxPassword.Text == password) 行放一个断点,看看password 变量保存了什么:1) 在弹出窗口中(悬停在变量上)或 2) 在Immediate Window [Debug -> Windows -> 立即] 输入?password 并按Enter

标签: c# sql sql-server linq


【解决方案1】:

您收到 System.InvalidOperationException 是因为您使用的是 .Single() linq 查询。

当未找到任何元素或找到多个与您的搜索匹配的元素时,就会发生这种情况。因此,您要么拥有多个具有相同用户名的用户,要么没有具有该用户名的用户。

搜索用户名时还需要考虑大小写。确保搜索忽略大小写或搜索将用户名的大小写更改为数据库中用户名的大小写。

也可以修改代码为SingleOrDefault(),如果没有找到不会抛出异常,但如果找到多个,仍然会抛出System.InvalidOperationException。在你的情况下,我更喜欢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;
            }
        }
    }
}

现在,为了帮忙,我当场把它刮掉了,我犯了错误,所以......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多