在单个事务中发送多个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()
也执行提交。
- 有没有办法在单个事务中插入所有行(最后提交)?
- 我想要一个单一事务的原因是让我的“插入”过程更快。 单笔交易是否也会更快?
如果你在一个线程中执行多个查询,建议使用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(); }); }