C# MySQL登录用户信息传递至另一窗体的实现问题
解决用户信息跨窗体显示问题
我来帮你梳理下代码里的问题,你的核心需求是把登录成功的用户信息展示到Form4里,但目前代码有几个关键错误导致功能失效,咱们一步步修正:
问题分析
- SQL语句语法错误+注入风险:Form4里的查询语句写得不对,
SELECT firstname = '" + tbFN.Text + "'这不是正确的字段查询方式,而且直接拼接用户名会引发SQL注入,还把控件tbUser当成了字符串使用(应该取它的Text属性)。 - 数据读取后未赋值:你填充了DataTable但没把里面的数据放到对应的TextBox里,等于白查了。
- 重复查询数据库:登录时已经读取了用户的accountType,其实可以顺便把firstname、lastname这些信息一起读出来,直接传递给Form4,不用再查一次库,既高效又避免二次查询的错误。
- 数据库连接管理不规范:原代码里的连接没有用
using管理,容易导致连接泄漏。
修正后的代码
登录窗体(包含button2_Click的窗体)
private void button2_Click(object sender, EventArgs e) { int userCount = 0; string accountType = string.Empty; // 提前声明需要传递的用户信息 string firstName = string.Empty; string lastName = string.Empty; string cellNo = string.Empty; // 用using自动管理连接资源,不用手动Close using (MySqlConnection con = new MySqlConnection("server=localhost;user id=root;database=account;persistsecurityinfo=True;PASSWORD=test123;SslMode=none")) { con.Open(); // 只查询需要的字段,不要用* string query = "SELECT accountType, firstname, lastname, cellno FROM accountinfo WHERE username = @user AND pass = @password"; using (MySqlCommand comm = new MySqlCommand(query, con)) { // 始终用参数化查询,杜绝注入和语法错误 comm.Parameters.AddWithValue("@user", textBox1.Text); comm.Parameters.AddWithValue("@password", textBox2.Text); using (MySqlDataReader myReader = comm.ExecuteReader()) { // 读取查询结果,只需要一次Read(因为用户名密码唯一) if (myReader.Read()) { userCount = 1; accountType = myReader["accountType"].ToString(); // 把需要的用户信息存下来 firstName = myReader["firstname"].ToString(); lastName = myReader["lastname"].ToString(); cellNo = myReader["cellno"].ToString(); } } } } if (userCount == 0) { MessageBox.Show("Wrong username or password!"); } else if (accountType == "admin") { MessageBox.Show("Welcome admin"); this.Hide(); textBox1.Clear(); textBox2.Clear(); Form3 frm3 = new Form3(); frm3.Show(); } else { MessageBox.Show("Welcome"); this.Hide(); using (var frm4 = new Form4()) { // 直接把已读取的信息传递给Form4,不用再查库 frm4.FirstName = firstName; frm4.LastName = lastName; frm4.CellNo = cellNo; frm4.ShowDialog(); } // 可选:关闭Form4后回到登录窗体 this.Show(); } }
Form4代码
public partial class Form4 : Form { public string FirstName { get; set; } public string LastName { get; set; } public string CellNo { get; set; } public Form4() { InitializeComponent(); } private void Form4_Load(object sender, EventArgs e) { // 直接把传递过来的信息赋值给对应的TextBox // 假设你有tbFN(显示firstname)、tbLN(显示lastname)、tbCell(显示cellno)这三个控件 tbFN.Text = FirstName; tbLN.Text = LastName; tbCell.Text = CellNo; // 如果你坚持要通过用户名查询(不推荐,因为登录时已经拿到数据了),可以用下面修正后的查询代码: /* try { using (MySqlConnection MyConn2 = new MySqlConnection("server=localhost;user id=root;database=account;persistsecurityinfo=True;PASSWORD=test123;SslMode=none")) { MyConn2.Open(); string Query = "SELECT firstname, lastname, cellno FROM accountinfo WHERE username = @username"; using (MySqlCommand MyCommand2 = new MySqlCommand(Query, MyConn2)) { // 参数化查询,避免注入 MyCommand2.Parameters.AddWithValue("@username", tbUser.Text); // 确保tbUser是用来显示用户名的TextBox,且已赋值 using (MySqlDataReader reader = MyCommand2.ExecuteReader()) { if (reader.Read()) { tbFN.Text = reader["firstname"].ToString(); tbLN.Text = reader["lastname"].ToString(); tbCell.Text = reader["cellno"].ToString(); } } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } */ } }
关键修改说明
- 避免重复查询:登录时一次性获取所有需要的用户信息,直接传递给Form4,减少数据库交互,提升效率。
- 参数化查询:全程使用参数化方式拼接SQL,彻底杜绝SQL注入风险,同时避免字符串拼接导致的语法错误。
- 资源自动管理:用
using语句管理数据库连接、命令和DataReader,确保资源自动释放,防止连接泄漏问题。 - 修正语法错误:Form4中原查询的字段选择语法错误,以及控件属性引用错误都已修正。
内容的提问来源于stack exchange,提问作者Magilou
相关产品推荐
相关产品推荐

