Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么LINQ查询不返回任何元素?_C#_Sql_Sql Server_Linq - Fatal编程技术网

C# 为什么LINQ查询不返回任何元素?

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

我有以下代码和数据库,我不理解这个问题。每当我尝试运行该程序时,它总是引发以下异常: 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()
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]中键入
?密码
,然后按
输入