我有一个将mssql-db(源)转换为另一个mssql-db(target)的应用程序。对于源代码中的每个表,我基本上都会得到所有行,并为每一行插入目标。我运行一个简单的查询,它更新source-row以存储插入到target-db的记录的target-table和target-id:
var commandText = $"UPDATE SOURCE_TABLE SET SOURCE_TABLE.TARGET_ID = '{target_id}', SOURCE_TABLE.TARGET_TBL = '{target_table}' WHERE SOURCE_TABLE.ID = '{id}'";
base.Source.ExecuteNonQuery(commandText);
这样运行完全正常,直到我尝试更新特定表的源行。我得到一个SqlException Execution Timeout Expired
。
我检查了变量target_id,target_table和id,它们都填充了有效值。我已禁用所有触发器,而id-field是主键。
当我通过management-studio运行此命令时,没有问题。甚至不需要一秒钟来处理。
我使用了来自management-studio的activity-monitor来监视sql运行的时间。带有红色框的数据库是target-db。 第二个图中的每个峰值(“Wartende Tasks”=“等待任务”)。表示已尝试执行查询一次。
这是命令的执行方式:
public int ExecuteNonQuery(string commandText)
{
using (var connection = this.CreateConnection()) // new SqlConnection(CONNECTION_STRING)
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = commandText;
return command.ExecuteNonQuery();
}
}
}
答案 0 :(得分:1)
您可以尝试在查询之前添加begin事务,然后在查询之后添加提交事务吗?我会尝试在源上插入和目标更新。
答案 1 :(得分:0)
问题是,对源进行更新的进程阻止了对源进行更新的进程。我必须将这些包装到事务中以使用IsolationLevel.ReadUncommitted
。现在它有效。