0

在创建DAL连接到Sql Server和的共同点的旅程中Oracle。在一些实现之后,我以是否OdbcConnection可以用于连接两者而感到困惑Database,为什么需要像SqlConnection和这样的特定实现OracleConnection

  1. 建议的实施方式是哪一种?
  2. 请告知具体实施的利弊

接口

public interface IDatabaseFactory  
{
   DbConnection GetConnection();

   DbCommand CreateCommand();

   IDbParameter CreateParameter();
}

实现

public class SqlFactory : IDatabaseFactory  
{
   public DbConnection GetConnection(){ return new SqlConnection();}

   public DbCommand CreateCommand(){ return new SqlCommand();}

   public IDbParameter CreateParameter(){ return new SqlParameter();}
}

public class SqlFactory : IDatabaseFactory  
{
   public DbConnection GetConnection(){ return new OracleConnection();}

   public DbCommand CreateCommand(){ return new OracleCommand();}

   public IDbParameter CreateParameter(){ return new OracleParameter();}
}
4

2 回答 2

2

ODBC 连接是连接数据库的非常通用的提供程序。对于几乎每个数据库,您都会找到一个 ODBC 驱动程序,即使对于简单的 CSV 文件也是如此。

作为缺点 ODBC 有几个限制(Hambone 在他的回答中列出了一些),并且在许多情况下,性能比原生驱动程序差,因为 ODBC 在原生驱动程序之上添加了一个额外的层。也许在您的应用程序中,这种性能下降无关紧要。

于 2015-11-30T19:12:36.527 回答
1

使用 ODBC 的优点:

  1. 在您的 .NET 解决方案中不依赖第三方的 Oracle 驱动程序
  2. 在您的工厂中编写(和维护)的代码更少,因为它们都使用相同的类(System.Data.Odbc)

ODBC 的缺点/注意事项:

  1. 如果您在多台机器上运行此程序,则必须设置相同的 ODBC 连接,而如果您使用托管 ODP.net,则可以在代码中显式定义连接属性
  2. 过去,某些用于 Oracle 的 ODBC 驱动程序在有效的 Oracle 语法方面存在问题,例如with子句
  3. 如果您倾向于使用工厂“幕后”数据库的高级或低级 DBMS 特定功能,例如 OCI 的批量插入/更新(非常棒),ODBC 不会让您访问这些
  4. 可能与 ODBC 和某些参数类型存在一些数据类型混淆。我想不出任何想法,但如果你遇到一些,我不会感到震惊
  5. 如果您使用该RETURNING子句,则实现中可能存在一些差异(我从未在 SQL Server 中做过,所以这是部分推测)

其他注意事项:

  1. 我很确定即使使用 ODBC,您也必须管理不同系统处理参数的方式。例如,Oracle:PARAM在属性中使用并省略了冒号ParameterName,而 SQL Server 使用 a并在属性@PARAM中包含 at 符号ParameterName
  2. 我会Transaction在您使用时添加一个属性
于 2015-11-30T18:58:11.790 回答