2013-06-04 21 views
2

我有一个应用程序,允许我的用户对他们选择的数据库运行查询。数据库可以是SQL服务器或Oracle。此方法接受来自另一个类的两个参数,第一个参数是用户选择的数据库的连接字符串,第二个参数是数据库类型。该部分工作正常。我想要做的是削减我需要编写的代码,而不是一遍又一遍地输入查询和连接。所以,我想要做这样的事情。显然这不会工作,但我对大多数解决方案开放。动态选择SQL Server或Oracle数据库

public void createTable(string connectstring, string rdbms) 
{ 
    if (rdbms == "oracle") 
    { 
     con = new OracleConnection(connectionString); 
     con.Open(); 
     OracleCommand query = con.CreateCommand(); 
    } 
    else if (rdbms == "SQL Server") 
    { 
     con = new SqlConnection(connectionString); 
     con.Open(); 
     SqlCommand query = con.CreateCommand(); 
    } 
    else 
    { 
     // broke 
    } 

    query.CommandText = "CREATE TABLE " + RndName + 
     " (Col0 Varchar(10),Col1 Varchar(10), Col2 Varchar(10))"; 
    query.ExecuteNonQuery(); 

    con.Close(); 
    executeInsertTransactions(connectstring); 
} 
+0

'* Connection' *应该*实施['IDbConnection'](http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.aspx)同样地,' * Command' *应该实现[''IDbCommand'](http://msdn.microsoft.com/en-us/library/system.data.idbcommand.aspx)。 (然而,仍然有许多数据库特定性,但对于使用接口的*简单*情况应该可以。) – user2246674

回答

2

这个问题通常通过接口来解决。有可能是这些常见的接口:

IConnection IDataProvider IRepository

实现使用MySql数据库,如类的MySqlConnection接口:IConnection。对于Oracle,添加类MsOracleConnection:IConnection。

理想情况下,您应该将所有功能抽象为通用接口。您将不得不为每个想要支持的数据库/存储引擎提供实现。在运行时,您将使用IoC容器和DI原理来设置当前的实现。所有孩子的依赖性将使用

2

作为参数传递给构造函数(或属性或方法)接口,您可以通过利用该框架的DbProviderFactory使用获得的Db*类创造更多的抽象代码。

0
Dim con As System.Data.IDbConnection 
Dim cmd As System.Data.IDbCommand       
         Select Case ConDBType 
          Case TypeDatabase.SqlServer 
           con = New OleDbConnection(CN.ConnectionString) 
           cmd = New OleDbCommand 
          Case TypeDatabase.MySql 
           con = New MySqlConnection(CNMySql.ConnectionString) 
           cmd = New MySqlCommand 
          Case TypeDatabase.Access 
           Call InitNameing() 
           ConDBAccess.DataSource = PreparToRootNameing() & "\T" & NAME_SYSTEMDB 
           con = New OleDbConnection(CN.ConnectionString) 
           cmd = New OleDbCommand 
         End Select 
         cmd.Connection = con 
         con.Open() 
         cmd.CommandText = SQLUpdate 
         cmd.ExecuteNonQuery()