将 SQL 表中的值与文本框中的条目进行比较

Posted

技术标签:

【中文标题】将 SQL 表中的值与文本框中的条目进行比较【英文标题】:Compare a value in a table in SQL to an entry in a textbox 【发布时间】:2021-08-14 16:58:05 【问题描述】:

我在 SQL Server 中有一个表 EmployeeRank1,其中有一列 Name。在Name 列下,有两个预定义的员工姓名。此外,表格中有一列Password,其中包含一个通用密码,即“123456”。

在 WPF 中,我有一个要求输入姓名的文本框和一个要求输入密码的密码框。在它们下方,有一个显示“登录”的按钮。

问题是我如何将表格中NamePasword的内容与文本框和密码框中的输入进行比较?

如果输入的Name 存在且Password 正确,则会打开一个新的WPF 页面。否则,将打印一条消息,说明名称或密码不正确。

这是我到现在为止的:

// check if the input matches and open the new WPF Page
    private void EmployeeRank1Button_Click(object sender, RoutedEventArgs e)
    
        try
        
            // create a query and select everything from the EmployeeRank1 table
            string query = "select * from EmployeeRank1";

            // create a connection to the database and run the query
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(query, sqlConnection);

            // use the sqlDataAdapter
            using(sqlDataAdapter)
            
                // create a new DataTable that allows us
                // to store data from tables within objects
                DataTable employeeRank1Table = new DataTable();

                // fill the sqlDataAdapter with all the
                // information from the query(from the employeeRank1Table)
                sqlDataAdapter.Fill(employeeRank1Table);

                // TODO: compare Name and Password entered in the TextBox and PasswordBox to the data in the table
                if (tbName.Text == *Name in Table* && pbPassword.Password == *Password in Table*)
                
                    EmployeeRank1 employeeRank1 = new EmployeeRank1();
                    employeeRank1.Show();
                
            
        
        catch(Exception exception)
        
            MessageBox.Show(exception.ToString());
          
    

【问题讨论】:

使用这样的东西:DataTable filteredTable = employeeRank1Table.AsEnumerable().Where(x => x.Field("column Name") == 123).CopyToDataTable();跨度> 您应该从不 _ _ _ EVER明文的形式将您的密码存储在数据库表中 - 只需 不要这样做 - 句号。 【参考方案1】:

您不需要在内存中检索整个表。只需在带有Name = @nameparam AND Password = @passparam 的 sql 命令中使用 WHERE 语句,使用 SqlCommand 检索 SqlDataReader,如果阅读器有一行,则宾果游戏,用户存在。

也就是说,请记住,在涉及安全的应用程序中,以明文形式存储密码是一个很大的 NO NO。 See this q/a原因

private void EmployeeRank1Button_Click(object sender, RoutedEventArgs e)

    try
    
        // create a query and select just the record we need 
        string query = "select * from EmployeeRank1 where Name = @name AND Password = @pass";

        // A local sqlconnection in a using statement ensure proper disposal at the end of this code 
        using SqlConnection con = new SqlConnection(connectionstring);
        con.Open();

        // Let's the database do the work to search for the password and name pair
        SqlCommand cmd = new SqlCommand(query, con);
        cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = tbName.Text ;
        cmd.Parameters.Add("@pass", SqlDbType.NVarChar).Value = tbPassword.Text ;
        SqlDataReader reader = cmd.ExecuteReader();

        // If the reader has rows then the user/pass exists in the db table
        if(reader.HasRows)
        
            EmployeeRank1 employeeRank1 = new EmployeeRank1();
            employeeRank1.Show();
        
    
    catch(Exception exception)
    
        MessageBox.Show(exception.ToString());
      

还要注意,我在 using 语句中使用了本地 SqlConnection 而不是全局的。这是使用 Disposable 对象(如连接)的正确方法。如果出现故障,保持全局连接很容易出现资源泄漏和各种问题。

【讨论】:

这行有问题:using SqlConnection con = new SqlConnection(connectionstring); 表示当前上下文中不存在名称“connectionString”。 我设法让它工作,但是当点击按钮时,程序会抛出 NullReferenceException。 不清楚上面代码的哪一行你得到了 NRE。 connectionstring 只是一个占位符,您应该在其中插入包含连接到数据库 IE 的所有信息的实际字符串:“Data Source=?????;Database=?????;持久安全信息=???”见connectionstrings.com 我在这一行得到它string connectionString = ConfigurationManager.ConnectionStrings["CompanyManagementSystem.Properties.Settings.ZaimovDBConnectionString"].ConnectionString;这是否意味着我没有正确连接到数据库? 不,这意味着在您的配置(app.config 文件)中没有具有该名称的连接字符串。在方括号 [....] 之后,您调用属性 ConnectionString,但如果该部分不包含该名称,您将获得 NRE。您可以在配置中添加(针对您的问题)相关的 connectionStrings 部分吗?可能你应该只使用“ZaimovDBConnectionString”

以上是关于将 SQL 表中的值与文本框中的条目进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据框中的一行的值与另一个数据框中的多行进行比较(包括计算)

来自 Textinput 的 Flash as3 比较

PHP - 将文本字段值与数组进行比较?

使用较低的函数将pyspark数据框中单列中的值转换为文本清理中的小写[重复]

MSAccess - 更新文本框中的所有记录

比较从 Windows 窗体中的 TextBox 获得的日期值与 Excel 表中存储的日期值