将 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 中,我有一个要求输入姓名的文本框和一个要求输入密码的密码框。在它们下方,有一个显示“登录”的按钮。
问题是我如何将表格中Name
和Pasword
的内容与文本框和密码框中的输入进行比较?
如果输入的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您不需要在内存中检索整个表。只需在带有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 表中的值与文本框中的条目进行比较的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据框中的一行的值与另一个数据框中的多行进行比较(包括计算)