2013-06-04 6 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). (Тем не менее, существует определенная спецификация DB, но для * простого * случая с использованием интерфейсов, так как это должно быть в порядке.) – 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()