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

C#插入SQL Server时触发System.Data.SqlClient.SqlException报错如何解决

报错原因排查
  • 核心语法错误:user是SQL Server的系统保留关键字,直接作为表名写在SQL语句中会触发语法解析异常,这是本次报错的最主要原因。
  • 连接字符串读取异常:代码中使用的strcon变量没有显式读取web.config中的连接配置,若未提前赋值会导致连接初始化失败。
  • 资源管理缺陷:未使用自动释放机制管理数据库连接对象,异常场景下可能出现连接未正常关闭的问题,也可能引发后续数据库操作异常。
  • 异常处理逻辑缺陷:直接将异常堆栈输出到前端alert语句中,堆栈内的特殊字符会破坏JS语法,导致无法看到完整错误信息,干扰问题排查。
可行修复方案
  1. 修正SQL语句的表名引用,用方括号包裹保留关键字user
  2. 正确读取web.config中的连接字符串,首先在项目引用中添加System.Configuration程序集,再初始化连接字符串变量
  3. 使用using块包裹SqlConnection、SqlCommand对象,无需手动关闭连接,程序会在执行完成或异常时自动释放资源
  4. 优化异常处理逻辑,优先将异常信息输出到调试控制台,如需前端展示要对特殊字符做转义
  5. 额外安全建议:不要明文存储用户密码,建议使用SHA256等哈希算法对密码加密后再存入数据库

修正后完整代码

using System.Configuration; // 需先在项目引用中添加该程序集

protected void Button1_Click(object sender, EventArgs e)
{
     try
     {
           // 读取配置文件中的连接字符串
           string strcon = ConfigurationManager.ConnectionStrings["con"].ConnectionString;
           
           // using自动释放连接资源
           using(SqlConnection conn = new SqlConnection(strcon))
           {
               if(conn.State == ConnectionState.Closed)
               {
                   conn.Open();
               }
               // 表名用方括号包裹避免保留关键字冲突
               string sql = "INSERT INTO [user] (username, password) VALUES (@user, @pass)";
               using(SqlCommand cmd = new SqlCommand(sql, conn))
               {
                   System.Diagnostics.Debug.WriteLine("Textbox 1 Text: " + TextBox1.Text.Trim());
                   System.Diagnostics.Debug.WriteLine("Textbox 2 Text: " + TextBox2.Text.Trim());
                   cmd.Parameters.AddWithValue("@user", TextBox1.Text.Trim());
                   // 实际生产环境请替换为密码哈希加密逻辑
                   cmd.Parameters.AddWithValue("@pass", TextBox2.Text.Trim());

                   cmd.ExecuteNonQuery();
               }
           }

           Response.Write("<script>alert('Sign Up Successful. Redirecting to Login Page ...');</script>");
           Response.Redirect("Login.aspx");
     }
     catch(Exception ex)
     {
           // 输出异常到调试控制台方便排查
           System.Diagnostics.Debug.WriteLine("报错信息:" + ex.Message + ex.StackTrace);
           // 转义特殊字符避免JS报错
           string errorMsg = ex.Message.Replace("'", "\\'");
           Response.Write("<script>alert('操作失败:" + errorMsg +"');</script>");
     }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 22:06:04