C# 如果OdbcConnection可以在这些地方使用,则需要SqlConnection和OracleConnection

C# 如果OdbcConnection可以在这些地方使用,则需要SqlConnection和OracleConnection,c#,oracle,sqlconnection,dbconnection,C#,Oracle,Sqlconnection,Dbconnection,在创建通用DAL以连接到sqlserver和Oracle的过程中。在一些实现之后,如果OdbcConnection可以同时用于连接数据库,为什么需要像SqlConnection和OracleConnection这样的特定实现,我最后感到困惑 建议的实施方式是什么 请告知具体实施的利弊 接口 public interface IDatabaseFactory { DbConnection GetConnection(); DbCommand CreateCommand();

在创建通用
DAL
以连接到
sqlserver
Oracle
的过程中。在一些实现之后,如果
OdbcConnection
可以同时用于连接
数据库
,为什么需要像
SqlConnection
OracleConnection
这样的特定实现,我最后感到困惑

  • 建议的实施方式是什么
  • 请告知具体实施的利弊
  • 接口

    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();}
    }
    
    实施

    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();}
    }
    
    使用ODBC的优点:

  • 在.NET解决方案中不依赖于Oracle的第三方驱动程序
  • 在工厂中编写(和维护)的代码更少,因为它们都使用相同的类(System.Data.Odbc)
  • ODBC的缺点/注意事项:

  • 如果在多台计算机上运行此程序,则ODBC连接的设置必须相同,而如果使用托管ODP.net,则可以在代码中显式定义连接属性
  • 过去,Oracle的某些ODBC驱动程序在有效的Oracle语法方面存在问题,例如
    with
    子句
  • 如果您倾向于在工厂的“幕后”使用数据库的高级或低级DBMS特定功能,例如OCI的批量插入/更新(这很了不起),ODBC将不允许您访问这些功能
  • ODBC和某些参数类型可能存在一些数据类型混淆。我脑子里想不出任何东西,但如果你遇到一些,我也不会感到震惊
  • 如果您使用
    RETURNING
    子句,那么实现中可能会有一些差异(我从来没有在SQL Server中这样做过,所以这只是推测的一部分)
  • 其他考虑:

  • 我很确定,即使使用ODBC,您也必须管理不同系统处理参数的方式。例如,Oracle使用
    :PARAM
    并在
    ParameterName
    属性中省略冒号,而SQL Server使用
    @PARAM
    并在
    ParameterName
    属性中包含at符号
  • 我会在您处理
    事务时为它添加一个属性
  • 使用ODBC的优点:

  • 在.NET解决方案中不依赖于Oracle的第三方驱动程序
  • 在工厂中编写(和维护)的代码更少,因为它们都使用相同的类(System.Data.Odbc)
  • ODBC的缺点/注意事项:

  • 如果在多台计算机上运行此程序,则ODBC连接的设置必须相同,而如果使用托管ODP.net,则可以在代码中显式定义连接属性
  • 过去,Oracle的某些ODBC驱动程序在有效的Oracle语法方面存在问题,例如
    with
    子句
  • 如果您倾向于在工厂的“幕后”使用数据库的高级或低级DBMS特定功能,例如OCI的批量插入/更新(这很了不起),ODBC将不允许您访问这些功能
  • ODBC和某些参数类型可能存在一些数据类型混淆。我脑子里想不出任何东西,但如果你遇到一些,我也不会感到震惊
  • 如果您使用
    RETURNING
    子句,那么实现中可能会有一些差异(我从来没有在SQL Server中这样做过,所以这只是推测的一部分)
  • 其他考虑:

  • 我很确定,即使使用ODBC,您也必须管理不同系统处理参数的方式。例如,Oracle使用
    :PARAM
    并在
    ParameterName
    属性中省略冒号,而SQL Server使用
    @PARAM
    并在
    ParameterName
    属性中包含at符号
  • 我会在您处理
    事务时为它添加一个属性

  • ODBC连接是连接到数据库的非常通用的提供程序。几乎每个数据库都有ODBC驱动程序,即使是简单的CSV文件


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

    ODBC连接是连接到数据库的非常通用的提供程序。几乎每个数据库都有ODBC驱动程序,即使是简单的CSV文件


    作为缺点,ODBC有几个限制(Hambone在他的回答中列出了一些限制),并且在许多情况下,性能比本机驱动程序差,因为ODBC在本机驱动程序之上添加了一个附加层。可能在您的应用程序中,这种性能下降并不相关。

    两种实现都是相同的。猜错了。@nvartak,是的。。。tks…两种实现都是相同的。猜错了。@nvartak,是的。。。tks…ODBC for Oracle要求安装Oracle即时客户端。因此,“在您的.NET解决方案中不依赖于Oracle的第三方驱动程序”是不正确的(至少对于Oracle的ODBC驱动程序而言是如此。对于Microsoft的ODBC驱动程序,我不知道)。依赖项上的有效点,但实际上我指的是.NET应用程序中的依赖项(引用)。在客户方面,我同意。另外,我认为ODBC确实支持命名参数,但我承认我可能弄错了。我很少使用ODBC,因为我列出的许多原因据我所知,ODBC中的参数总是与
    一起使用,无论您连接到哪个RDBMS(参见示例)。仅对存储过程的调用支持命名参数,但在其他SQL语句中不支持命名参数。ODBC for Oracle要求安装Oracle Instant Client。因此,“您的.NET解决方案中不依赖于Oracle的第三方驱动程序”是不正确的(至少对于Orac的ODBC驱动程序是如此)