0

我被要求创建一个供内部使用的软件,这将使我们能够及时了解支持请求等。

主要功能之一是该软件可从远程 MySQL 数据库运行,但如果没有 Internet 连接,则应从本地 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)) {

我还尝试了以下代码,该代码有效,但是在 using 语句中使用时,我无法访问该命令的方法函数,而且它给了我一个错误!

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;
}
}
4

3 回答 3

2

我建议创建一个始终连接到 SqlCe 的基类(并添加特定于数据库的方法,例如

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

在 mysql 管理器类中覆盖相同的方法。如果 mysql 管理器类执行失败,它将调用将连接到 sqlce 的基类。为这两个类创建一个抽象类或基类以供将来扩展(命名为 MyDBManager)。

于 2012-06-12T11:55:30.700 回答
1

理想情况下,您应该只传递查询并且它应该返回结果。

决定连接哪个数据库应该是方法的责任。

它应该只返回结果,调用者应该不知道这种复杂性。

public IEnumerable run(string query){}
于 2012-06-12T11:50:03.273 回答
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 的抽象数据库管理器模式和实践

于 2012-06-12T12:13:54.887 回答