You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# MySQL登录用户信息传递至另一窗体的实现问题

解决用户信息跨窗体显示问题

我来帮你梳理下代码里的问题,你的核心需求是把登录成功的用户信息展示到Form4里,但目前代码有几个关键错误导致功能失效,咱们一步步修正:

问题分析

  1. SQL语句语法错误+注入风险:Form4里的查询语句写得不对,SELECT firstname = '" + tbFN.Text + "' 这不是正确的字段查询方式,而且直接拼接用户名会引发SQL注入,还把控件tbUser当成了字符串使用(应该取它的Text属性)。
  2. 数据读取后未赋值:你填充了DataTable但没把里面的数据放到对应的TextBox里,等于白查了。
  3. 重复查询数据库:登录时已经读取了用户的accountType,其实可以顺便把firstname、lastname这些信息一起读出来,直接传递给Form4,不用再查一次库,既高效又避免二次查询的错误。
  4. 数据库连接管理不规范:原代码里的连接没有用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:22:29