У меня есть система, которая поддерживает несколько продуктов. Каждый продукт имеет собственную базу данных с одинаковой точной схемой.
Когда я передаю строку подключения в качестве параметра моему конструктору контекста данных, он всегда использует базу данных по умолчанию, указанную в строке подключения, или базу данных по умолчанию пользователя, подключающегося, если я не предоставляю исходный каталог в строке подключения .
Я бы хотел, чтобы система использовала базу данных без изменения строки подключения и передачи имени базы данных в качестве параметра.
Вот пример кода, который я использую:
class Program
{
static void Main(string[] args)
{
var d = new Data("Data Source=(LOCAL);Initial Catalog=Database1;Integrated Security=true;");
var d1 = new Data("Data Source=(LOCAL);Initial Catalog=Database2;Integrated Security=true;");
Console.ReadLine();
}
}
internal class Data
{
public Data(string connection)
{
using (var ctx = new DataClassDataContext(connection))
{
var query = from c in ctx.MyTable select c;
try
{
Console.WriteLine(query.Count());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Если этот код будет выполнен, то первый результат будет извлекаться из базы данных 1, а второй результат извлекается из базы данных 2. Я хотел бы иметь возможность извлекать из базы данных, которая не указана в строке подключения. Причина этого в том, что база данных может измениться в зависимости от конкретного сценария, но строка подключения останется прежней.
Вот пример того, что я использую, чтобы «подделать» его, но я не думаю, что это лучшее решение для этого:
class oConnection
{
public string Server { get; set; }
public string Database { get; set; }
public bool IntegratedSecurity { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
class Program
{
static void Main(string[] args)
{
var d = new Data(new oConnection
{
Database = "Database1",
Server = "(Local)",
IntegratedSecurity = true
});
var d1 = new Data(new oConnection
{
Database = "Database2",
Server = "(Local)",
IntegratedSecurity = true
});
Console.ReadLine();
}
}
internal class Data
{
private static string BuildConnection(oConnection connection)
{
var sb = new StringBuilder();
sb.Append("Data Source=" + connection.Server + ";Initial Catalog=" + connection.Database + ";");
if(connection.IntegratedSecurity)
{
sb.Append("Integrated Security=true;");
}
else
{
sb.Append("user id=" + connection.UserName + ";password=" + connection.Password);
}
return sb.ToString();
}
public Data(oConnection connection)
{
using (var ctx = new DataClassDataContext(BuildConnection(connection)))
{
var query = from c in ctx.MyTable select c;
try
{
Console.WriteLine(query.Count());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Еще одно примечание: цель этого в действительности состоит в том, чтобы поддерживать отсутствие нескольких разных строк подключения при выполнении запросов, которые будут охватывать несколько баз данных. Например: если я хочу запросить записи учетной записи из базы данных, а затем запросить какие-либо данные поиска из другой базы данных, мне потребуется создать новую строку подключения для контекста.
Любая помощь будет оценена.
Спасибо