三层架构连接SQL Server 2016时表单输入异常求助
问题分析与解决方案
问题根源
注册模块的异常是因为SQL语句拼接时未给字符串类型字段添加单引号,导致数据库无法识别字符串值,将其误判为标识符或数字类型,引发语法错误。直连时应该使用了参数化查询或正确处理了字符串引号,因此未出现问题。
错误代码核心问题
当前Sign_Up方法直接用string.Format拼接SQL语句,字符串类型字段(如FName、LName、sex等varchar类型)没有被单引号包裹,执行时SQL Server会将这些值当作对象名而非字符串,从而触发报错。
正确解决方案:使用参数化查询
替换字符串拼接为参数化查询,既能解决当前语法错误,还能避免SQL注入风险,适配三层架构规范。修改后的业务层代码如下:
public void Sign_Up() { base.Link(); string Query = "INSERT INTO Table_User (FName, LName, EMail, Mobile, Adres, sex, Pass) VALUES (@FName, @LName, @EMail, @Mobile, @Adres, @sex, @Pass)"; // 根据base类实际连接对象调整,这里假设base.Connection是已打开的SqlConnection SqlCommand cmd = new SqlCommand(Query, base.Connection); cmd.Parameters.AddWithValue("@FName", FName); cmd.Parameters.AddWithValue("@LName", LName); cmd.Parameters.AddWithValue("@EMail", EMail); cmd.Parameters.AddWithValue("@Mobile", Mobile); // 若Mobile为整数类型,确保变量类型匹配 cmd.Parameters.AddWithValue("@Adres", Adres); cmd.Parameters.AddWithValue("@sex", sex); cmd.Parameters.AddWithValue("@Pass", Pass); cmd.ExecuteNonQuery(); base.UnLink(); }
补充说明
- 如果你的
base.CommandDataText方法支持传入参数集合,可直接将参数传入,无需手动创建SqlCommand,核心是绝对避免直接拼接字符串到SQL语句中。 - 确保参数类型与数据库字段类型匹配:比如
Mobile如果是整数类型,要保证传入的Mobile变量为int类型,避免类型转换错误。 - 单选按钮的字符串值(如
sex的"男"/"女"或"Male"/"Female")通过参数传递后,会被正确识别为字符串,解决单选按钮导致的开发停滞问题。
内容的提问来源于stack exchange,提问作者Yaser
相关产品推荐
相关产品推荐

