C#项目具有不同的数据库,以不同的格式存储相同的数据

时间:2013-08-27 12:47:00

标签: c# .net database

好的,标题很长,但问题出在这里:

我有大约10-12个不同的对象,我必须在我的软件中使用它们。这很容易,我只是创建课程并做任何我想做的事情。但是,所有这些代表数据库行和主要问题的类 - 我的软件必须能够从/向不同的数据库(oracle,mysql,interbase,postgres,firebird)读取/写入这些对象。对象存储在不同的数据库中,甚至存储在不同字段(名称和类型)的不同表中[以及所有这些,因为这些数据库不会在它们之间同步]。

所以我在编写代码以提供所有工作时遇到了麻烦:我们认为它是大约5个数据库* 10个对象= 50个类,以及将来的扩展......

有人能告诉我正确的方法,最佳实践,如何构建这个?

4 个答案:

答案 0 :(得分:3)

首先,编写您的类以包装所有这些调用不同的数据库。 您可能会使用数据库提供的数据提供程序连接到每个数据提供程序。

此驱动程序使用ado.net提供了一系列用于处理数据库的类。 在wrap类上使用此类,以导入/导出数据。通常这个数据提供者 有办法将数据库类型映射到.net clr类型。

而且,您必须发现每个数据库的关键点,例如: 有问题的数据库存储表,表字段,索引,键的信息..

修改

  • 读取数据库中的表,存储他的信息和该表字段的信息(字段名称,类型,长度等)
  • 在这个用来存储这个表信息的类中,创建一个用于存储clr类型的字段(就像我之前说过的,这个数据提供者提供了一种将数据库类型映射到.net clr类型的方法)
  • 好的,现在你有了表格信息,尊重每个数据库的特征。

现在,您可以开始导入/导出操作。

例如,假设您正在从oracle读取并写入sql。

  • 您阅读了该表的表格信息。
  • 从表格中选择数据(选择)并存储在数据表中
  • 现在,您所要做的就是插入到sql表中,当然使用来自oracle的数据。
  • 还记得你为桌子提供的信息吗?您需要尊重每个数据库的类型映射。

请参阅:

http://technet.microsoft.com/en-us/library/ms151817.aspx

答案 1 :(得分:2)

  

对象存储在不同的数据库中,甚至存储在不同字段(名称和类型)的不同表中

如果字段的名称不同,则需要将字段映射到dataaccess级别的对象。无需创建50个类。 10个就够了。当您从数据库中读取数据时,将其映射到类并在应用程序中使用该类。同样,当您要保存数据时,您应该从同一个数据库中读取字段并相应地传递给数据库。

答案 2 :(得分:1)

我会通过以下方式达到您的要求:

首先,我会添加一些dbml(Linq2SQL)文件,每个数据库一个。如果您愿意,可以使用ADO.NET或其他东西。您必须以不同方式调用生成的数据对象......如MySqlDataObject,OracleDataObject,FirebirdDataObject等。

在您的UI中,您只需要一组数据对象。因此,在您的数据层中,您将需要填充来自不同数据库的每个数据对象的方法......例如CopyToMySqlDataObject(ClrDataObject clrDataObject)CopyToOracleDataObject(ClrDataObject clrDataObject)CopyToFirebirdDataObject(ClrDataObject clrDataObject)

最后,我将使用引用所有数据源对象的DataProvider类。此类将托管每个可用的操作,并在每个方法中调用每个数据源。看一下这个例子:

public int UpdateDataObject(ClrDataObject clrDataObject)
{
    using (MySqlDataContext dataContext = new MySqlDataContext())
    {
        MySqlDataObject mySqlDataObject = dataContext.MySqlDataObjects.Where(d => 
d.Id == clrDataObject.Id).FirstOrDefault();
        CopyToMySqlDataObject(clrDataObject, mySqlDataObject);
        dataContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
        return 0;
    }
    ...
    using (OracleDataContext dataContext = new OracleDataContext())
    {
        OracleDataObject oracleDataObject = dataContext.OracleDataObjects.Where(d => 
d.Id == clrDataObject.Id).FirstOrDefault();
        CopyToOracleDataObject(clrDataObject, oracleDataObject);
        dataContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
        return 0;
    }
}

答案 3 :(得分:1)

每个存储库的存储库模式和单一责任,以及可能是调用每个特定存储库类的通用存储库。

每个数据库都有一个存储库类,负责处理该数据库。

因此,如果您有一个客户类(可能是存储库级别的DTO),并且具有名为Name的属性,则每个存储库都负责读取" name"从相应的表中的字段然后将其映射到DTO名称字段,您不应该为每个数据库设置不同的域级别客户类,这只是坚果......

如果您正在使用依赖注入,您可以注入这些存储库,并在不需要时安全地逐个删除它们......

如果您需要事务支持,那么您可以在存储库中添加另一个层并滚动您自己的事务协调器等。

上面的@Sheridan示例的问题是当您添加和删除方法不断变化的数据库时,它不会因修改而关闭...