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

C# WPF登录后从SQL获取用户信息并显示至仪表盘的技术问询

完善登录后获取用户信息并显示的实现逻辑

我来帮你补全这段登录按钮的点击事件代码,重点是正确获取用户的姓名、姓氏、出生日期并将这些信息赋值到dashboard.sellerinfo.Text上,同时做好资源管理和异常处理:

private void button_Click(object sender, RoutedEventArgs e)
{
    // 用using语句自动管理连接资源,避免忘记关闭连接引发的问题
    using (DBconnection con1 = new DBconnection())
    {
        try
        {
            con1.connection();
            // 不要用SELECT *,明确指定需要的字段,更高效且避免表结构变动带来的隐患
            string query = "SELECT FirstName, LastName, DateOfBirth FROM Seller WHERE Login=@Login and Password=@Password";
            
            using (SqlCommand Sqlcmd = new SqlCommand(query, con1.con))
            {
                // 补全参数赋值,假设你的登录输入框是txtLogin、密码框是txtPassword
                Sqlcmd.Parameters.AddWithValue("@Login", txtLogin.Text.Trim());
                Sqlcmd.Parameters.AddWithValue("@Password", txtPassword.Text.Trim());
                
                // 执行查询并读取结果
                using (SqlDataReader reader = Sqlcmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        // 读取数据库字段值,注意字段名要和数据库表中完全一致
                        string firstName = reader["FirstName"] != DBNull.Value ? reader["FirstName"].ToString() : "";
                        string lastName = reader["LastName"] != DBNull.Value ? reader["LastName"].ToString() : "";
                        DateTime dob = reader["DateOfBirth"] != DBNull.Value ? (DateTime)reader["DateOfBirth"] : DateTime.MinValue;
                        
                        // 拼接信息并赋值给dashboard的sellerinfo.Text
                        dashboard.sellerinfo.Text = $"姓名:{firstName} {lastName}\n出生日期:{dob != DateTime.MinValue ? dob.ToString("yyyy-MM-dd") : "未填写"}";
                        
                        // 这里可以添加登录成功后的其他逻辑,比如跳转到dashboard页面
                    }
                    else
                    {
                        // 未查询到匹配用户,提示登录失败
                        MessageBox.Show("登录失败,账号或密码错误!");
                    }
                }
            }
        }
        catch (SqlException ex)
        {
            // 捕获数据库相关异常,方便排查问题
            MessageBox.Show($"数据库连接出错:{ex.Message}");
        }
        catch (Exception ex)
        {
            // 捕获其他通用异常
            MessageBox.Show($"登录过程出错:{ex.Message}");
        }
        finally
        {
            // 确保连接最终被关闭,即使发生异常
            if (con1.con != null && con1.con.State == System.Data.ConnectionState.Open)
            {
                con1.con.Close();
            }
        }
    }
}

几个关键优化点说明:

  • 拒绝SELECT *:明确指定需要的字段(FirstName、LastName、DateOfBirth),既提升查询效率,也能避免数据库表结构变动导致的字段索引错误。
  • using语句的使用:自动释放SqlCommand、SqlDataReader和连接资源,无需手动调用Dispose(),减少内存泄漏风险。
  • 参数化查询保留:原代码已经用了参数化,这能有效防止SQL注入攻击,一定要保持这个好习惯。
  • 空值安全处理:添加了DBNull.Value判断,避免数据库字段为空时引发空引用异常。
  • 细分异常捕获:区分SQL异常和通用异常,方便定位问题,同时给用户更友好的提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:19:52