繁体   English   中英

C#声明不同的数据库类型

[英]C# Declare different database-types

当前,我们有四个不同的服务器。 每台服务器上都有一个带有一个表的数据库。 它们的名称都相同,并且表的列也完全相同。

我想从参数中选择一个数据库。

我的第一个方法是创建一些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.

我尝试的下一件事是将Enum与开关配合使用。 不幸的是,一旦您声明了“数据库”,您之后将无法更改类型。

枚举和切换

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;
}

我尝试的最后一件事是创建一个null变量,但是如果没有if / else-story,它会立即失败:

空变量

var database = null;
database = new Database1();

我与C#/ MVC一起工作了几个月,所以我不知道这一切的来龙去脉。 希望你能帮助我。

注意:我在StackOverflow中搜索了很多术语,很不幸,没有适合我的结果。

提前谢谢了!

对我而言,解决方案是我们在此讨论的完全不同的方法。

因为所有表/数据库都相同,所以无需再次从所有其他数据库创建额外的模型。 一个模型就足够了,只需要在创建DbContext时更改连接字符串即可。

我是通过在DbContext中添加一个参数来实现的,如下所示:

在“ Context.cs”文件中

public partial class ConnDatabase : DbContext {
  public ConnDatabase(string db)
    : base(db) {
  }
}

声明数据库

db ”是Web.config -file中连接字符串的名称。 您需要在此处传递它:

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

这样,您不必为每个(相同)数据库创建多个模型。 这样做的另一个好处是,您可以简单地添加更多数据库而无需在代码中进行很大的更改。

我要感谢你们在过去几天中所提供的帮助和支持!

希望我能理解您的要求,因此这是解决问题的一种方法:

创建一个接口:

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传递一个合适的参数值,便会从该方法中获得正确的对象,该方法可在代码中的其他地方使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM