gpt4 book ai didi

c# - 获取包含表的数据库列表的有效方法

转载 作者:行者123 更新时间:2023-11-30 21:13:04 25 4
gpt4 key购买 nike

我需要用附加数据库的列表填充两个下拉框,这些数据库包含一个专门命名的表的服务器。我目前的方法是这样的。

List<string> dbType1 = new List<string>();
List<string> dbType2 = new List<string>();
using (var conn = new SqlConnection("Data Source=(local);Integrated Security=true"))
using (var cmd = new SqlCommand())
{
conn.Open();
cmd.Connection = conn;

cmd.CommandText = "select name from sys.databases";
using (var innerConn = new SqlConnection("Data Source=(local);Integrated Security=true"))
using (var innerCmd = new SqlCommand())
using (var rdr = cmd.ExecuteReader())
{
innerConn.Open();
innerCmd.Connection = innerConn;

while (rdr.Read())
{
string table = rdr.GetString(0);
innerCmd.CommandText = String.Format("select name from [{0}]..sys.tables where name in 'EF_LAB_FIELDS_DYNA' 'AUTOXPAY_PAYMENTS'", table);

object result = innerCmd.ExecuteScalar();

if(result != null)
{
if ((string)result == "EF_LAB_FIELDS_DYNA")
dbType1.Add(table);
else
dbType2.Add(table);
}
}

}

}

cb.Items.AddRange(dbType1.ToArray());
cb2.Items.AddRange(dbType2.ToArray());

这可行,但是在具有 205 个附加数据库的服务器上运行需要 44.6 秒。

任何人都可以给我任何关于如何加快此操作的建议吗?我愿意使用 SMO 等其他技术,进行更多的客户端处理,或将其作为某种形式的复杂查询在服务器上运行。只要我根据两个表名得到两个列表就可以满足我的需求。


由于 total 的建议,这是将我的运行时间缩短到不到一秒的更新版本。

ConcurrentBag<string> dbType1 = new ConcurrentBag<string>();
ConcurrentBag<string> dbType2 = new ConcurrentBag<string>();
List<string> databases = new List<string>();
using (var conn = new SqlConnection("Data Source=(local);Integrated Security=true"))
using (var cmd = new SqlCommand())
{
conn.Open();
cmd.Connection = conn;

cmd.CommandText = "select name from sys.databases";

using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
databases.Add(rdr.GetString(0));
}

Parallel.ForEach(databases, () =>
{
var innerConn = new SqlConnection("Data Source=(local);Integrated Security=true");
var innerCmd = new SqlCommand("", innerConn);
innerConn.Open();
return innerCmd;
},
(database, loopState, localCommand) =>
{
localCommand.CommandText = String.Format("select name from [{0}].sys.tables where name in ('EF_LAB_FIELDS_DYNA', 'AUTOXPAY_PAYMENTS')", database);

object result = localCommand.ExecuteScalar();

if (result != null)
{
if ((string)result == "EF_LAB_FIELDS_DYNA")
dbType1.Add(database);
else
dbType2.Add(database);
}

return localCommand;
},
(localCommand) =>
{
var temp = localCommand.Connection;
localCommand.Dispose();
temp.Dispose();
});
}

}

最佳答案

我会在单独的线程中运行每一个,然后在您继续之前加入它们。当然,您需要使用线程安全结构来执行此操作,但这将使您可以同时发送所有请求,因此您不必等待每个请求都转到下一个请求。

如果您有 200 个左右的数据库,您可能希望使用线程池而不是每个线程一个线程,但话又说回来,200 个线程并没有那么多......实验和配置文件,但这是我会采用的一般方法.

关于c# - 获取包含表的数据库列表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071828/

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