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
相关产品推荐
相关产品推荐

