3

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

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

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

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

4

4 回答 4

3

首先,编写你的类来包装不同数据库的所有这些调用。可能你会使用数据库提供的数据提供者来连接每一个。

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

并且,您必须发现每个数据库的关键点,例如:相关数据库存储表、表字段、索引、键的信息的位置..

编辑:

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

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

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

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

看:

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

于 2013-08-27T13:03:21.397 回答
2

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

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

于 2013-08-27T12:52:16.940 回答
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;
    }
}
于 2013-08-27T13:06:55.557 回答
1

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

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

因此,如果您有一个客户类(可能是存储库级别的 DTO),具有名为 Name 的属性,那么每个存储库负责从相应的表中读取“名称”字段,然后将其映射到 DTO 名称字段,您应该'每个数据库都没有不同的域级别客户类,这简直是疯了......

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

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

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

于 2014-07-22T09:09:46.037 回答