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
相关产品推荐
相关产品推荐

