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

SqlDataAdapter.Fill执行两次SQL命令 导致ASP.NET插入数据重复如何解决

问题原因

你的插入逻辑对同一个INSERT命令执行了2次,导致重复插入:

  • 第一次是调用SqlDataAdapter.Fill(dt)时,适配器会自动执行你绑定的INSERT命令,完成第一次数据插入
  • 第二次是你主动调用cmd.ExecuteNonQuery(),再次执行INSERT命令,完成第二次数据插入

修复方案

插入操作不需要用SqlDataAdapter填充DataTable,直接删除这三行无效代码即可:

SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);

修正后的完整代码

public static void Register(User user)
{
    string query = "insert into TblTutors (username,email,pass,sub,category,city,fullname,img,bio,tutor,way) values (@username,@email,@pass,@mat,@cat,@country,@fullname,Cast(@img As nvarchar(MAX)),@bio,@tutor,@way )";
    // 建议不要使用全局静态SqlConnection,每次操作新建连接,利用using自动释放,避免连接泄漏
    using (SqlConnection con = new SqlConnection("你的数据库连接字符串"))
    using (SqlCommand cmd = new SqlCommand(query, con))
    {
        cmd.Parameters.AddWithValue("@username", user.username);
        cmd.Parameters.AddWithValue("@email", user.email);
        cmd.Parameters.AddWithValue("@tutor", user.tutor);
        cmd.Parameters.AddWithValue("@way", user.way);
        cmd.Parameters.AddWithValue("@mat", user.mat);
        cmd.Parameters.AddWithValue("@cat", user.cat);
        cmd.Parameters.AddWithValue("@country", user.country);
        cmd.Parameters.AddWithValue("@pass", "halima");
        cmd.Parameters.AddWithValue("@fullname", user.fullname);
        cmd.Parameters.AddWithValue("@img", user.img);
        cmd.Parameters.AddWithValue("@bio", user.bio);
        con.Open();
        int i = cmd.ExecuteNonQuery();
        con.Close();
    }
}

额外优化建议

  • 不要使用全局静态的SqlConnection对象,ADO.NET自带连接池机制,每次操作新建连接、用完释放性能更高,也不会出现多线程并发操作连接的异常
  • AddWithValue会自动推断参数类型,容易出现类型不匹配的隐式转换问题,建议使用cmd.Parameters.Add("@参数名", SqlDbType.对应类型).Value = 值的方式明确指定参数类型

内容的提问来源于stack exchange,提问作者Halima Ghannoum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:39:00