C# 声明不同的数据库类型
C# Declare different database-types
我们目前有四个不同的服务器。在每台服务器上都有一个数据库 table。它们的名称都相同,table 的列也完全相同。
我想根据参数选择数据库。
我的第一个想法是创建一些 if 语句并在其中声明它。
事实证明这将是一个范围问题:
If-Else 语句
string db = "db1"; // some input to say which database I want
if (db == "db1") {
Database1 database = new Database1();
} else if (db == "db2") {
Database2 database = new Database2();
} else if (db == "db3") {
Database3 database = new Database3();
} else if (db == "db4") {
Database4 database = new Database4();
}
// This will be a scope problem. Variables that are declared within a scope will be lost once you get out.
接下来我尝试使用带开关的枚举。不幸的是,一旦你声明了 "database" 之后你就不能再改变类型了
枚举和切换
public enum dataBases{
None,
db1,
db2,
db3,
db4
}
dataBases dbases
switch (dbases) {
case dataBases.db1:
Database1 database = new Database1();
break;
case dataBases.db2:
Database2 database = new Database2();
break;
case dataBases.db3:
Database3 database = new Database3();
break;
case dataBases.db4:
Database4 database = new Database4();
break;
}
我尝试的最后一件事是创建一个空变量,但是如果后面没有 if/else-story,这会立即失败:
空变量
var database = null;
database = new Database1();
我使用 C#/MVC 工作了几个月,所以我不知道这一切的来龙去脉。希望你能帮助我。
注意:我在 Whosebug 中搜索了很多术语,不幸的是我没有 suitable 结果。
非常感谢!
希望我明白你的问题,所以这是一种解决方法:
创建接口:
public interface IDatabase
{
//methods/properties here
}
创建您的 类:
public class Database1 : IDatabase { }
public class Database2 : IDatabase { }
public class Database3 : IDatabase { }
根据您的 enum
创建一个 return 和 IDatabase
的方法
public static IDatabase GetDatabase(dataBases db)
{
IDatabase d = null;
switch(db)
{
case databases.db1:
d = new Database1();
case databases.db2:
d = new Database2();
//add new cases for each enum value
default:
break;
}
return d;
}
因此,如果您为 db
传递了合适的参数值,那么您将从该方法返回正确的对象,然后您可以在代码的其他地方使用该对象。
我的解决方案是我们在此处讨论的完全不同的方法。
因为所有的表/数据库都是相同的,所以不需要再次从所有其他数据库创建额外的模型。
一个模型就够了,只需要在创建DbContext时更改连接字符串即可。
我通过在 DbContext 中添加一个参数来做到这一点,如下所示:
在"Context.cs"-文件
public partial class ConnDatabase : DbContext {
public ConnDatabase(string db)
: base(db) {
}
}
正在声明数据库
"db" 是 Web.config 文件中连接字符串的名称。你需要在这里传递它:
ConnDatabase database = new ConnDatabase(db);
例如:
ConnDatabase database = new ConnDatabase(database1); // Connect to database 1
ConnDatabase database = new ConnDatabase(database2); // Connect to database 2
ConnDatabase database = new ConnDatabase(database3); // Connect to database 3
ConnDatabase database = new ConnDatabase(database4); // Connect to database 4
这样您就不必为每个(相同的)数据库创建多个模型。这样做的另一个好处是您可以简单地添加更多数据库而无需对代码进行大的更改。
感谢大家这几天的帮助和支持!
我们目前有四个不同的服务器。在每台服务器上都有一个数据库 table。它们的名称都相同,table 的列也完全相同。
我想根据参数选择数据库。
我的第一个想法是创建一些 if 语句并在其中声明它。 事实证明这将是一个范围问题:
If-Else 语句
string db = "db1"; // some input to say which database I want
if (db == "db1") {
Database1 database = new Database1();
} else if (db == "db2") {
Database2 database = new Database2();
} else if (db == "db3") {
Database3 database = new Database3();
} else if (db == "db4") {
Database4 database = new Database4();
}
// This will be a scope problem. Variables that are declared within a scope will be lost once you get out.
接下来我尝试使用带开关的枚举。不幸的是,一旦你声明了 "database" 之后你就不能再改变类型了
枚举和切换
public enum dataBases{
None,
db1,
db2,
db3,
db4
}
dataBases dbases
switch (dbases) {
case dataBases.db1:
Database1 database = new Database1();
break;
case dataBases.db2:
Database2 database = new Database2();
break;
case dataBases.db3:
Database3 database = new Database3();
break;
case dataBases.db4:
Database4 database = new Database4();
break;
}
我尝试的最后一件事是创建一个空变量,但是如果后面没有 if/else-story,这会立即失败:
空变量
var database = null;
database = new Database1();
我使用 C#/MVC 工作了几个月,所以我不知道这一切的来龙去脉。希望你能帮助我。
注意:我在 Whosebug 中搜索了很多术语,不幸的是我没有 suitable 结果。
非常感谢!
希望我明白你的问题,所以这是一种解决方法:
创建接口:
public interface IDatabase
{
//methods/properties here
}
创建您的 类:
public class Database1 : IDatabase { }
public class Database2 : IDatabase { }
public class Database3 : IDatabase { }
根据您的 enum
IDatabase
的方法
public static IDatabase GetDatabase(dataBases db)
{
IDatabase d = null;
switch(db)
{
case databases.db1:
d = new Database1();
case databases.db2:
d = new Database2();
//add new cases for each enum value
default:
break;
}
return d;
}
因此,如果您为 db
传递了合适的参数值,那么您将从该方法返回正确的对象,然后您可以在代码的其他地方使用该对象。
我的解决方案是我们在此处讨论的完全不同的方法。
因为所有的表/数据库都是相同的,所以不需要再次从所有其他数据库创建额外的模型。 一个模型就够了,只需要在创建DbContext时更改连接字符串即可。
我通过在 DbContext 中添加一个参数来做到这一点,如下所示:
在"Context.cs"-文件
public partial class ConnDatabase : DbContext {
public ConnDatabase(string db)
: base(db) {
}
}
正在声明数据库
"db" 是 Web.config 文件中连接字符串的名称。你需要在这里传递它:
ConnDatabase database = new ConnDatabase(db);
例如:
ConnDatabase database = new ConnDatabase(database1); // Connect to database 1
ConnDatabase database = new ConnDatabase(database2); // Connect to database 2
ConnDatabase database = new ConnDatabase(database3); // Connect to database 3
ConnDatabase database = new ConnDatabase(database4); // Connect to database 4
这样您就不必为每个(相同的)数据库创建多个模型。这样做的另一个好处是您可以简单地添加更多数据库而无需对代码进行大的更改。
感谢大家这几天的帮助和支持!