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
用于用DataAdapter
的SelectCommand
的结果 填充DataSet
。
由于您不想执行任何 SELECT
查询,请删除有关填写 DataTable
的代码,因为它不会返回任何数据,它将执行您的 INSERT
, UPDATE
和 DELETE
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 方法不会给出任何错误,但也不会返回任何数据以用于长时间运行的查询 ado.net core SQL Server
使用 sqldataadapter.fill 刷新数据 - 看不到新数据