我有一个支持多种产品的系统。每个产品都有自己的数据库,具有完全相同的架构。
当我将连接字符串作为参数传递给数据上下文构造函数时,它始终使用连接字符串中列出的默认数据库,或者如果我不在连接字符串中提供初始目录,则使用连接用户的默认数据库.
我希望能够让系统利用数据库,而无需更改连接字符串并通过将数据库名称作为参数传递。
这是我正在使用的代码示例:
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);
}
}
}
}
另一个注意事项:这样做的目标实际上是能够在运行跨多个数据库的查询时支持不使用多个不同的连接字符串。例如:如果我想从一个数据库查询帐户记录,然后从另一个数据库查询某种查找数据,我必须为上下文创建一个新的连接字符串。
如有任何帮助,我们将不胜感激。 谢谢
最佳答案
使用接收 System.Data.IDbConnection 连接的构造函数。您可以使用相同的连接字符串,并在将其传递给构造函数之前调用 connection.ChangeDatabase("mydb") 。或者,您可以在分部类上添加一个新的构造函数,这样调用就不必处理这个问题。
关于c# - LINQ数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/666998/