SqlDataAdapter.Fill 运行 SQL 命令两次

Posted

技术标签:

【中文标题】SqlDataAdapter.Fill 运行 SQL 命令两次【英文标题】:SqlDataAdapter.Fill running SQL command twice 【发布时间】:2021-11-29 17:25:54 【问题描述】:

我试图从 ASP.NET 在我的 SQL 数据库中插入一个新行,但它插入了两次而不是一次。

我无法找到下面代码的哪一行导致了这种情况。

这是我的代码:

 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 )";
            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();
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                sda.Fill(dt);

                int i = cmd.ExecuteNonQuery();
                con.Close();

            

        

【问题讨论】:

删除 SqlDataAdapter (Fill) 周围的代码。 SqlDataAdapter 在调用 Fill 时执行构造函数中传递的查询。执行 INSERT/UPDATE/DELETE 查询的正确方法是通过 ExecuteNonQuery 还有best not use AddWithValue。 谢谢你们的建议! 【参考方案1】:

DataAdapter.Fill 用于用DataAdapterSelectCommand结果 填充DataSet

由于您不想执行任何 SELECT 查询,请删除有关填写 DataTable 的代码,因为它不会返回任何数据,它执行您的 INSERT , UPDATEDELETE cmd 中的 SQL 命令传递给 new SqlDataAdapter(cmd);

您实际上是在写入数据两次,一次是在您填写 dt 时,一次是在您执行查询时:

sda.Fill(dt);
...
int i = cmd.ExecuteNonQuery();

这应该可以按预期工作,也不需要DataSet

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 )";
    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();
    


【讨论】:

是的,它有效。感谢您提供信息。

以上是关于SqlDataAdapter.Fill 运行 SQL 命令两次的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataAdapter.Fill 方法慢

SqlDataAdapter.Fill 方法不会给出任何错误,但也不会返回任何数据以用于长时间运行的查询 ado.net core SQL Server

使用 sqldataadapter.fill 刷新数据 - 看不到新数据

SqlDataAdapter.Fill 命令使 SQL CPU 达到峰值

SqlDataAdapter.Fill - 异步方法

SqlDataAdapter.Fill() 溢出异常