C#DB Wrapper支持多个数据库

1 c# mysql wrapper

我目前正在创建一个支持MySQL和MSSQL数据库的C#应用​​程序.我遇到的问题是我的包装器.我的代码适用于MySQL,但我在修改它以支持多个数据库时遇到问题.

如果你看一下我的代码的精简版本,你会看到我有一个DBMySQL类型的dbConn对象,如果我只想要MySQL支持,这很好.我需要修改DBMySQL是通用的,这样我就可以运行dbConn = new DBMySQL(...)和dbConn = DBMSSQL(...)然后我可以简单地调用dbConn.SomeMethod()并让它在相应的数据库上运行.我希望尽可能保持相同的设置,因为我在DBMySQL和DBMSSQL类中有其他东西用于批量插入数据库和特定的错误检查.

我在想/尝试声明像对象dbConn之类的东西,然后操纵它,但这并不是那么顺利.然后我尝试使用enum类的对象类型,但我也遇到了问题.我知道有很多第三方库可以完成所有这些,但我更喜欢使用自己的代码.

有没有人有任何建议我如何修改我的DBWrapper来解决这个问题?

//WRAPPER CLASS THAT CALLS DBMySQL, ISSUE IS I NOW NEED TO SUPPORT 
//DBMSSQL as well, not just DBMySQL
class DBWrapper
{
    DBMySQL dbConn;

    public DBWrapper(...,string type)
    {
        if(type.Equals("MySQL")
        {
            dbConn = new DBMySQL(...);
        }
        //NEED TO REWORK TO SUPPORT THIS BELOW!!
        else if(type.Equals("MSSQL")
        {
            //NEED TO MODIFY TO SUPPORT MSSQL
            //ISSUE IS DbConn is of type DBMySQL
            //SO I CANNOT GO
            // DbConn = new DBMSSQL(...);
            // any ideas?
        }   
    }

    public void setQuery(string myquery)
    {
            dbConn.setQuery(myquery);
    }
}

class DBMySQL
{
    public string dbinfo;
    string query;

    public DBMySQL(...)
    {
        dbinfo = ...;

    }

    public void setQuery(...)
    {
        query = myquery;
    }
}

//NEED TO RE-WORK WRAPPER TO SUPPORT THIS
class DBMSSQL
{
    public string dbinfo;
    string query;

    public DBMSSQL(...)
    {
        dbinfo = ...;

    }

    public void setQuery(...)
    {
        query = myquery;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这一点上,我会感激任何帮助,所以如果你正在查看这篇文章并有一个想法,请告诉我,因为我已经花了一整天的时间.

Nik*_*vić 6

您需要的是创建界面,该界面将描述您希望数据访问类执行的操作.

例如,你的样本

public interface IDBAccess
{
     void setQuery(...);
}

public class DBMySQL : IDBAccess
{
    public string dbinfo;
    string query;

    public DBMySQL(...)
    {
        dbinfo = ...;

    }

    public void setQuery(...)
    {
        query = myquery;
    }
}

public class DBMSSQL : IDBAccess
{
    public string dbinfo;
    string query;

    public DBMSSQL(...)
    {
        dbinfo = ...;

    }

    public void setQuery(...)
    {
        query = myquery;
    }
}
Run Code Online (Sandbox Code Playgroud)

此时您将能够执行此操作:

IDBAccess dbConn;
dbConn = new DBMySQL();
dbConn = new DBMSSQL();
Run Code Online (Sandbox Code Playgroud)

考虑到您对此不熟悉,建议您查看NHibernateCastle ActiveRecordCastle Windsor可能没有用.但是为了将来要记住它们.