gpt4 book ai didi

c# - 在并行循环中使用 SMO 从 .net 中的 SQL Server 数据库编写对象定义脚本

转载 作者:太空狗 更新时间:2023-10-29 21:46:22 27 4
gpt4 key购买 nike

我正在使用 SMO 使用 .Net 代码从 Sql 服务器数据库编写我的对象脚本。但截至目前,我正在经历一个顺序循环。

foreach(var table in TableCollection)
{
var stringCollection=table.Script();
}

它工作正常。但是,当我将同一个循环转换为 Parallel.ForEach 循环时,如下所示:

Parallel.ForEach(TableCollection,table=>
{
var stringCollection=table.Script();
});

它无法编写脚本。是否有人使用相同类型的方法或任何其他方法从 Sql server 并行编写对象脚本?

更新:

到目前为止,我还无法计算出并行循环,但我使用了下面提到的代码:

 server.SetDefaultInitFields(true);                

它在一定程度上提高了性能。

最佳答案

似乎 SMO 并不是以线程安全的方式构建的。当您在 Table 上调用 Script() 时,它会使用来自其 Server 的一些共享状态,因此您不能在两个表上执行它来自同一个 Server。但是您可以通过为每个 Table 创建新的 Server 对象来解决这个问题:

private static TableCollection GetTables()
{
Server server = new Server(…);
Database database = server.Databases[…];
var tables = database.Tables;
return tables;
}



Parallel.For(0, GetTables().Count,
i =>
{
var stringCollection = GetTables()[i].Script();

});

这将使您的查询并行,但我不知道它是否会使它们实际上更快。

编辑:如果您想为每个线程创建一个Server,您可以使用Parallel.For() 的重载,它允许线程局部初始化。像这样的东西:

Parallel.For(0, GetTables().Count,
() => GetTables(),
(i, _, tables) =>
{
var stringCollection = tables[i].Script();

return tables;
},
tables => { });

这样,每个线程都会有自己的 Server 对象,但只有一个。

关于c# - 在并行循环中使用 SMO 从 .net 中的 SQL Server 数据库编写对象定义脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596425/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com