我有一个支持多种产品的系统。每个产品都有自己的数据库,并且有相同的模式。
当我将连接字符串作为参数传递给我的数据上下文构造函数时,它总是使用连接字符串中列出的默认数据库,或者如果我没有在连接字符串中提供初始目录,则使用连接用户的默认数据库。
我希望能够让系统使用一个数据库,而不必更改连接字符串,并将数据库名称作为参数传入。
下面是我使用的代码示例:
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);
}
}
}
}
如果执行此代码,那么第一个结果将从database1中提取,第二个结果将从database2中提取。我希望它能够从连接字符串中没有提供的数据库中提取数据。原因是数据库可能会根据特定的场景进行更改,但连接字符串将保持不变。
下面是一个我用来“伪造”它的例子,但我并不认为这是最好的解决方法:
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);
}
}
}
}
另一个注意事项:这样做的目的是在运行跨多个数据库的查询时,真正能够支持没有多个不同的连接字符串。例如:如果我想从一个数据库查询帐户记录,然后从另一个数据库查询某种查找数据,我必须为上下文创建一个新的连接字符串。
任何帮助都将不胜感激。
谢谢