SQLConnection未完全成为使用新ConsoleApp的新连接
本文关键字:ConsoleApp 新连接 连接 SQLConnection | 更新日期: 2023-09-27 18:22:37
这个很难在标题中解释。我正在进行的是foreach循环,它为每个目标服务器和数据库设置一个新的连接字符串。然而,当foreach循环出现时,它会按预期设置字符串。然而,SqlConnection仍然会查看第一个字符串。
以下是我用来称之为连接的东西:
foreach (string DatabaseConfig in DataHoldingClass.Server_Database_Config)
{
string[] splitConfig = DatabaseConfig.Split('|');
//set sql connection config
DataHoldingClass.Database = splitConfig[0];
DataHoldingClass.SQLSERVER = splitConfig[1];
//open specific config
SQLProcessorClass.SQLMASTERCONNECTION = SQLProcessorClass.OpenSQLConnection();
//do some work here
SQLProcessorClass.SQLMASTERCONNECTION.Dispose();
}
以下是我用来设置连接的内容:
public static string masterConString = "server="+DataHoldingClass.SQLSERVER+";database ="+DataHoldingClass.Database+";Trusted_Connection=Yes;persist security info=False;connection timeout=500";
public static SqlConnection SQLMASTERCONNECTION { get; set; }
public static SqlConnection OpenSQLConnection()
{
SqlConnection sqlCon = new SqlConnection(masterConString);
sqlCon.Open();
return sqlCon;
}
下面是DataHoldingClass
public static string Database { get; set; }
public static string SQLSERVER { get; set; }
因此,例如,我的字符串DatabaseConfig="Database1|Server1",DataHoldClass.Server_Database_Config中的下一个循环是"Database2|Server2",当第二次循环发生时,即使它在循环的第二个字符串上,它也会继续使用"Database1| Server1"。
有什么想法吗?
哦,我实际上并没有调用Database
函数,尽管stackoverflow用蓝色突出显示了它。
您发布的代码不会调用getter来更改静态字符串masterConString
,因此将使用第一次创建SQLProcessorClass
对象时创建的字符串,并保持设置为该字符串。
您可以简化为:
foreach (string DatabaseConfig in DataHoldingClass.Server_Database_Config)
{
string[] splitConfig = DatabaseConfig.Split('|');
string connectionString = "server=" + splitConfig[1] + ";database =" + splitConfig[0] +
";Trusted_Connection=Yes;persist security info=False;connection timeout=500";
using (SqlConnection cnn = new SqlConnection(connectionString))
{
cnn.Open();
// do work....
}
}
也许可以添加try/catch和一些检查,如splitConfig.Length >= 2
在循环外初始化的静态字符串是您的问题。
使用局部作用域,也许更像这样。
string connectionStringTemplate = "server={0};database={1};Trusted_Connection=Yes;persist security info=False;connection timeout=500";
foreach (string DatabaseConfig in DataHoldingClass.Server_Database_Config) {
// is this string parsing really necessary - why not separate variables?
string[] splitConfig = DatabaseConfig.Split('|');
// 0=database and 1=server, apparently from above
string connectionString = String.Format(connectionStringTemplate, splitConfig[1], splitConfig[0]);
using (SqlConnection cn = new SqlConnection(connectionString)) {
//do some work here
}
}
此外,这个控制台应用程序的全部目的可能是可以避免的。如果您在一台服务器上,请查看sp_msforeachdb
以获得无c的解决方案。RedGate工具可以用于跨多个执行。