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

三层架构连接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:15:11