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

图书馆APP登录表单问题及同库记录下Form1向Form2传值咨询

关于图书馆应用登录表单与跨窗体传值的解答

一、修复登录脚本的SQL注入风险

嘿,作为编程新手能写出登录功能已经很棒啦!不过你当前的登录代码存在非常严重的SQL注入风险——直接把用户输入拼接到SQL语句里,恶意用户可以构造特殊输入篡改你的SQL逻辑,甚至窃取或破坏数据库数据,得赶紧调整写法。

先看你原代码的问题部分:

SqlCommand cmd = new SqlCommand("select id_user,pwd_user from tb_user where id_user='" + userid.Text + "'and pwd_user='" + userpwd.Text + "'", con);

这是典型的不安全写法,下面是修复后的参数化查询写法,能彻底规避SQL注入:

string userid1 = userid.Text; 
string password1 = userpwd.Text; 

// 使用参数化查询,将用户输入作为参数传递而非直接拼接
SqlCommand cmd = new SqlCommand("select id_user,pwd_user from tb_user where id_user = @UserId and pwd_user = @Password", con);
// 为SQL参数赋值
cmd.Parameters.AddWithValue("@UserId", userid1);
cmd.Parameters.AddWithValue("@Password", password1);

SqlDataAdapter da = new SqlDataAdapter(cmd); 
DataTable dt = new DataTable(); 
da.Fill(dt); 

if (dt.Rows.Count > 0) { 
    MessageBox.Show("登录成功!");
    // 这里可以添加登录成功后的逻辑,比如跳转Form2并传递数据
} else {
    MessageBox.Show("账号或密码错误!");
}

额外提个小建议:实际项目里千万别明文存储密码,应该存储密码的哈希值(比如SHA256、BCrypt这类更安全的哈希算法),验证时把用户输入的密码哈希后再和数据库里的哈希值比对,能大幅提升账号安全性。

二、从Form1传递数据库记录值到Form2

下面给你几种WinForms中常用的跨窗体传值方法,你可以根据需求选择:

方法1:通过Form2的构造函数传值

这是最直观的方式,给Form2定义带参数的构造函数,打开Form2时直接把数据传进去:

// 在Form2中定义带参数的构造函数
public partial class Form2 : Form
{
    private string _userId;
    private string _userName; // 示例:传递用户名字段

    public Form2(string userId, string userName)
    {
        InitializeComponent();
        _userId = userId;
        _userName = userName;
        // 可以直接把值绑定到Form2的控件上
        lblUserId.Text = _userId;
        lblUserName.Text = _userName;
    }
}

// 在Form1登录成功后调用:
if (dt.Rows.Count > 0) { 
    MessageBox.Show("登录成功!");
    // 从DataTable中取出记录值
    string userId = dt.Rows[0]["id_user"].ToString();
    string userName = dt.Rows[0]["user_name"].ToString(); // 替换成你实际的字段名
    // 实例化Form2并传递参数
    Form2 form2 = new Form2(userId, userName);
    form2.Show();
    this.Hide(); // 可选:隐藏Form1
}

方法2:通过Form2的公共属性传值

如果不想修改构造函数,可以给Form2定义公共属性,打开Form2后再赋值:

// 在Form2中定义公共属性
public partial class Form2 : Form
{
    public string UserId { get; set; }
    public string UserName { get; set; }

    public Form2()
    {
        InitializeComponent();
    }

    // 在Form2的加载事件中使用属性值
    private void Form2_Load(object sender, EventArgs e)
    {
        lblUserId.Text = UserId;
        lblUserName.Text = UserName;
    }
}

// 在Form1中调用:
if (dt.Rows.Count > 0) { 
    MessageBox.Show("登录成功!");
    string userId = dt.Rows[0]["id_user"].ToString();
    string userName = dt.Rows[0]["user_name"].ToString();
    
    Form2 form2 = new Form2();
    form2.UserId = userId;
    form2.UserName = userName;
    form2.Show();
}

方法3:使用静态类存储共享数据

如果需要在多个窗体之间共享数据,可以定义一个静态类来保存:

// 定义静态类存储用户信息
public static class UserSession
{
    public static string UserId { get; set; }
    public static string UserName { get; set; }
}

// 在Form1登录成功后赋值:
if (dt.Rows.Count > 0) { 
    MessageBox.Show("登录成功!");
    UserSession.UserId = dt.Rows[0]["id_user"].ToString();
    UserSession.UserName = dt.Rows[0]["user_name"].ToString();
    
    Form2 form2 = new Form2();
    form2.Show();
}

// 在Form2中直接使用静态类的属性:
private void Form2_Load(object sender, EventArgs e)
{
    lblUserId.Text = UserSession.UserId;
    lblUserName.Text = UserSession.UserName;
}

内容的提问来源于stack exchange,提问作者Adonia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:45