在ExecuteNonQuery上获取受影响的行

Boa*_*rdy 42 .net c# mysql sql executenonquery

我目前正在开发一个C#项目,我正在运行一个插入查询,它也同时进行选择,例如:

INSERT INTO table (SELECT * FROM table WHERE column=date)
Run Code Online (Sandbox Code Playgroud)

有没有办法可以看到在此查询期间插入了多少行?

Joh*_*Woo 87

ExecuteNonQuery - 返回受影响的行数.

SqlCommand comm;
// other codes
int numberOfRecords = comm.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

  • 我这样做,由于某种原因即使在我的表中创建了一个新行,这个方法返回-1.我的sql语句中还应该有什么内容吗? (3认同)
  • SqlCommand.ExecuteNonQuery() 在执行插入/更新/删除时返回 -1 参见 https://blogs.msdn.microsoft.com/spike/2009/01/27/sqlcommand-executenonquery-returns-1-when-doing-insert-更新删除/ (3认同)
  • 这并不总是像人们预期的那样有效.对于UPDATE,返回的行数是*可以*已更改的行数,而不是实际更改的行数.假设您正在进行更新,最多可能会影响50行.但是,对于其中35行,UPDATE不会导致任何数据更改.数据仅在50个可能行中的15行中发生变化.在这种情况下,人们希望"15"将是返回值,而返回的值是50,即总行数. (2认同)
  • @ serv-inc,我认为有一种方法可以通过单行代码获得UPDATE的"15".在运行更新之前,您需要单独执行SELECT count(*)语句*以找出要更新的行数.只要您的表被正确编入索引,就不会增加任何明显的额外开销. (2认同)
  • @ serv-inc:另一个选项是确保可能受影响的行数与实际受影响的行数相同.所以而不是做"UPDATE表SET val1 = 5;" 使用"UPDATE表SET val1 = 5 WHERE val1 <> 5;". (2认同)

M.B*_*ock 14

如果你从a中的问题运行SQL SqlCommand并检查它的返回值,ExecuteNonQuery它应该告诉你有多少记录受到影响.

文档:

返回值
类型:System.Int32
受影响的行数.


小智 5

还要确定一件事 你需要在连接字符串中添加一条语句 例如:

string const "Server=localhost; PORT=3306; Database=db; User id=root; password='';UseAffectedRows=True";
MySqlConnection con = new MySqlConnection(const);
con.Open();
MySqlCommand cmd = new MySqlCommand(con);
cmd.CommandText = "Update db set table = value where Column = value";
int numberOfRecords = cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

确保:

UseAffectedRows=True
Run Code Online (Sandbox Code Playgroud)

所以它将返回受影响行的正确值