在单个事务中发送多个SQL命令

我有一个很大的INSERT INTO ...字符串列表。 目前我运行它们:

 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); foreach (var commandString in sqlCommandList) { SqlCommand command = new SqlCommand(commandString, connection); command.ExecuteNonQuery(); } } 

我看到每个ExecuteNonQuery()也执行提交。

  1. 有没有办法在单个事务中插入所有行(最后提交)?
  2. 我想要一个单一事务的原因是让我的“插入”过程更快。 单笔交易是否也会更快?

如果你在一个线程中执行多个查询,建议使用SQL事务,你可以像这样:

  SqlTransaction trans; try { SqlConnection connection = new SqlConnection(connectionString); connection.Open(); trans = connection.BeginTransaction(); foreach (var commandString in sqlCommandList) { SqlCommand command = new SqlCommand(commandString, connection,trans); command.ExecuteNonQuery(); } trans.Commit(); } catch (Exception ex) //error occurred { trans.Rollback(); //Handel error } 

您可能只使用一个事务和命令就可以获得一些性能,如下所示:

 using (SqlConnection connection = new SqlConnection(connectionString)) { try { connection.Open(); using (SqlTransaction trans = connection.BeginTransaction()) { using (SqlCommand command = new SqlCommand("", connection,trans)) { command.CommandType = System.Data.CommandType.Text; foreach (var commandString in sqlCommandList) { command.CommandText = commandString; command.ExecuteNonQuery(); } } trans.Commit(); } } catch (Exception ex) //error occurred { //Handel error } } 

稍晚,但是如果要将所有值插入到同一个表中,请将SQL插入代码“插入tablex(f1,f2,f3,…)值(@ F1,@ F2,@ F3 .. )”。 创建命令并添加参数@ F1 …,然后在命令上设置Prepare标志。 现在,当您遍历要插入的值列表时,可以将它们设置为适当的参数,然后执行ExecuteNonQuery。 SQL将预解析命令字符串一次,然后每次使用新参数。 这有点快。

最后,您可以通过附加’;’在单个命令中执行多个SQL语句 如果你必须执行整个字符串,请到每个语句。 您可以将许多这些命令组合在一起,并向SQL Server发出一个请求来执行它们。

您可以为每个使用Parallel

  using (SqlConnection connection = new SqlConnection(connectionString)) { List sqlCommandList = new List(); connection.Open(); Parallel.ForEach(sqlCommandList, commandString => { SqlCommand command = new SqlCommand(commandString, connection); command.ExecuteNonQuery(); }); }