0

меня попросили создать кусок программного обеспечения для внутреннего использования, что позволит нам идти в ногу с запросами поддержки и т.д.класса для управления MySQL и SQL Server базы данных CE

одна из главных особенностей является программное обеспечение работает из удаленной базы данных MySQL, но если нет подключения к Интернету, он должен запускаться из локальной базы данных SQL Server CE.

В идеале программное обеспечение должно передавать только один запрос в класс менеджера баз данных, этот класс будет знать, подключен ли он к mysql, а если не использовать локальную базу данных SQL Server CE.

Я попытался это, но натолкнулся на многие блокпосты. у кого-нибудь есть решение? Моя последняя идея - передать переменную методу, который диктует тип (см. Ниже), но я не уверен, как это сделать.

public MySQLCommand run (string query, "MYSQL", <List>(MySQLParameter) mysqlparams){} 
public SQLCECommand run (string query, "SQLCE", <List>(SQLCEParameter) dbparams){} 

приведенный выше код будет использоваться следующим образом:

using (var sql = dbmanager.run("SELECT * FROM table", "MYSQL", mysqlparams)) { 

Я также попытался следующий код, который работал, но при использовании в использовании заявления я не мог получить доступ к функции метода выполнения команды , плюс это дало мне ошибку!

public Object run(string query, List<Object> dbparams = null){ 
if (isMySQLConnected){ 
    MySqlCommand sql = _MySQLConnection.CreateCommand(); 
    sql.CommandText = query; 
    if (dbparams.Count > 0){ 
     sql.Parameters.AddRange(dbparams.ToArray()); 
    } 
    return sql; 
} else { 
    SqlCeCommand sql = _OfflineConnection.CreateCommand(); 
    sql.CommandText = query; 
    if (dbparams.Count > 0){ 
     sql.Parameters.AddRange(dbparams.ToArray()); 
    } 
    return sql; 
} 
} 

ответ

1

Использование наследования

public abstract class MyDBManager 
{ 
    public abstract bool OpenConnetion(); 
    public abstract DataTable OpenDataTable(); // For select queroes 
    public abstract int ExecuteNonQuery(string qry) // for insert/delete queries 
    public abstract bool CloseConnection(); 
} 

public class MySQLCEManger : MyDBManager 
{ 
    public bool OpenConnection() 
    { 
     // your sqlce connection 
    } 

    public DataTable OpenDataTable(string query) 
    { 
     //Open connection 
     //execute query and return datatable 
     //Close connection 
    } 
} 

public class MySQLManager : MySQLCEManager 
{ 
    public bool OpenConnection() 
    { 
     // your sql cen connection 
    } 

    public DataTable OpenDataTable(string query) 
    { 
     if(!OpenConnection()) //failed to open connection 
      return base.OpenDataTable(); 
     //execute query and return datatable 
     //Close connection 
    } 

    public int ExecuteNonQuery(string query) 
    { 
     if(!OpenConnection()) //failed to open connection 
      return base.ExecuteNonQuery(); 
     //execute query and return rows affected 
     //Close connection 
    } 
} 

Надеюсь, это поможет. Пожалуйста, игнорируйте любые ошибки синтаксиса, которые он имеет. Только для деталей реализации.

Вы также можете посмотреть в модели и практики Microsoft для абстрактного менеджера баз данных

+0

Итак, в этом примере он сначала попытается подключиться SQLCE, а затем mysql?Что, если бы я хотел, чтобы это было наоборот, так что сначала он пытается mysql, и если нет соединения, тогда я могу просто изменить порядок экземпляра SQLIll или мне нужен конкретный тип возврата? – Neo

+0

Нет, создайте объект MySQLManager и всегда используйте объект mySqlManager. mySqlManager сначала пытается подключиться, если его не удалось вызвать метод базового класса. базовый класс (SqlCEManager) выполняет запросы и возвращает результаты. –

+0

Спасибо, что в конце концов понял, что вы имели в виду. Я соглашусь с вами, когда он примет ответ. – Neo

1

В идеале вы должны только передать запрос, и он должен вернуть результаты.

Должен быть обязан способ определить, какая база данных должна быть подключена.

Он должен только возвращать результаты, и вызывающий абонент должен не знать об этой сложности.

public IEnumerable run(string query){} 
+0

Я сделал попытку этого orriginally, но тип возвращаемого значения должен быть установлен на объект для того, чтобы возвращать либо SqlCeCommand или mysqlcommand, это тогда означало, что я не могли использовать команду use или любые функции команды. – Neo

+0

Почему вы хотите, чтобы команда возвращалась, а не фактические результаты? –

+0

результаты извлекаются позже различными способами, получая данные строки с помощью ExecuteReader или nonScaller – Neo

2

То, что я хотел бы предложить создать базовый класс, который всегда подключается к SQLCE (и добавить специальные методы базы данных, как

public virtual DataTable OpenDataTable(string query) 
public virtual int ExecuteNonQuery(string query) 

Ovrride же методов в классе менеджера MySQL. Если менеджер MySQL класс не удалось выполнить он будет вызывать базовый класс, который будет подключаться к sqlce. Для обоих этих классов создайте абстрактный или базовый класс для будущей расширяемости (Name это MyDBManager).

+0

+1 для ExecuteNonQuery –

+0

Можете ли вы предоставить немного больше кода, поскольку я не совсем понимаю. – Neo

+0

@Neo См. Мой последний ответ –

Смежные вопросы