验证用户信息时Sql数据库报错:无效列名问题求助
问题原因
你遇到的错误是因为混合使用了字符串插值和参数化查询,字符串插值时没给字符串类型的managerSurname加单引号,导致SQL把Bobbo识别成列名而非查询值。另外你虽然添加了参数,但查询语句里根本没用到这些参数,等于白加了。
修复后的代码
// 将SqlConnection放入using块,确保资源自动释放 using (SqlConnection connection = new SqlConnection(ConnectionString)) { connection.Open(); int ManagerID = int.Parse(tbx_MngNumber.Text); string managerSurname = tbxMangSurname.Text; string ManagerPhoneNumber = tbxNumber.Text; // 用参数占位符替代直接字符串插值 string query = "SELECT ManagerFirstName FROM ManagerTable WHERE ManagerID=@ManagerID AND ManagerSurname=@ManagerSurname AND ManagerPhoneNumber=@ManagerPhoneNumber"; using (SqlCommand cmd = new SqlCommand(query, connection)) { cmd.Parameters.AddWithValue("@ManagerID", ManagerID); cmd.Parameters.AddWithValue("@ManagerSurname", managerSurname); cmd.Parameters.AddWithValue("@ManagerPhoneNumber", ManagerPhoneNumber); // 将SqlDataReader也放入using块,自动释放资源 using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { MessageBox.Show("manager"); } else { MessageBox.Show("no"); } } } }
关键说明
- 全程使用参数化查询,既避免字符串拼接带来的SQL注入风险,也解决了字符串值的语法错误问题
- 把
SqlConnection、SqlDataReader都放入using块,确保数据库资源自动释放,避免内存泄漏 - 参数名要和查询语句里的占位符完全对应,保证SQL能正确匹配参数值
内容的提问来源于stack exchange,提问作者Oliver Hewson
相关产品推荐
相关产品推荐

