2011-10-29 57 views
1

我目前正在创建一个支持MySQL和MSSQL数据库的C#应用​​程序。我遇到的问题是用我的包装。我有我的代码为MySQL工作,但我有问题修改它以支持多个数据库。C#DB Wrapper支持多个数据库

如果你看看我的代码的精简版本,你会看到我有一个DBMySQL类型的dbConn对象,如果我只想要MySQL支持,那很好。我需要将DBMySQL修改为通用的,以便我可以运行dbConn = new DBMySQL(...)和dbConn = DBMSSQL(...),然后我可以简单地调用dbConn.SomeMethod()并使其在适当的数据库上工作。我宁愿尽可能保持相同的设置,因为我的DBMySQL和DBMSSQL类中有其他的东西,用于批量插入数据库和进行特定的错误检查。

我在想/试图声明一些类似于Object dbConn的东西,然后操纵它,但那并没有那么好。然后我尝试使用对象类型的枚举类,但是我也遇到了问题。我知道有很多第三方库可以完成所有这些工作,但我更愿意使用自己的代码。

有没有人有任何建议,我可能会修改我的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; 
    } 
} 

在这一点上,我希望得到任何帮助可言,因此,如果您正在查看这篇文章,有一个想法,请让我知道,我已经花了一整天在此。

+0

这个问题可以使用工厂方法设计模式来解决,看看[这里](http://en.wikipedia.org/wiki/Factory_method_pattern) – sll

回答

6

你需要的是创建接口来描述你希望你的数据访问类做什么。

E.g.从您的样品

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

在这一点上,你将能够做到这一点:

IDBAccess dbConn; 
dbConn = new DBMySQL(); 
dbConn = new DBMSSQL(); 

铭记,你是新来这也未必是有用的,建议你看看NHibernateCastle ActiveRecordCastle Windsor。但请记住他们的未来。

+0

谢谢!这正是我需要的。我将更多地关注这些界面事物,非常整洁的想法。 – user1020184

+0

是的,你应该看看面向对象的编程概念。如果我可能会建议看看http://msdn.microsoft.com/en-us/library/ms173156.aspx和http://msdn.microsoft.com/en-us/library/ms173152.aspx –

2

你不应该让一个大的类来处理这两个数据库。您应该为封装器IDBWrapper创建一个通用接口,然后为每个数据库分别执行一次。

之后,您可以创建一些逻辑,为您选择正确的实施。每次需要包装时,您都不想写这样的东西:

IDBWrapper db = (useMySQL ? new MySqlDBWrapper(...) : new MsSqlDBWrapper(...)); 

有几个选项。你可以使用抽象工厂,但真正抽象出数据库包装器创建的任何东西都可以工作。

+0

我是C#的新手,仍然在学习这样的事情的声音外国人,但我会很快搜索谷歌,如果你仍然在附近,有几个很好的链接让我知道。感谢您的建议。 – user1020184

0

我可以从头脑中想到一个快速入门,创建一个具有必要支持的大型课程,并基于用户选择的内容,使用相应的对象和类。此外,您可以为每个数据源创建一个类,然后创建一个着陆类,根据用户选择的内容重新路由到正确的数据源提供者类。不是很漂亮,但可能工作的那个...

2

是否有一个特定的原因,你想在C#中重新实现数据库层?你有没有看过使用说; Entity FrameworkNHibernate或任何其他.NET ORM?这将很好地包装所有数据访问,而不必担心实施细节太多。此外,它们还提供其他优点,例如将表映射到您的类(即它们根据表中的内容以及其他方式填充类),缓存和各种其他功能。或者,如果您确实想创建自己的,那么您必须声明一个接口,让所有数据库连接都从此接口继承,并将连接实例存储在接口类型的属性中。 I.e:

public interface IDatabaseConnection 
{ 
    void setQuery(string myQuery); 
} 

public class DBWrapper 
{ 
    private IDatabaseConnection Connection { get; set; } 

    public DBWrapper(string type) 
    { 
     if(type == "MySql") 
      Connection = new DBMySQL(); 
     else if(type == "MsSql") 
      Connection = new DBMSSQL(); 
    } 
} 

public class DBMySQL : IDatabaseConnection 
{ 
    ... 
} 

public class DBMSSQL : IDatabaseConnection 
{ 
    ... 
} 
+0

我'已经看到了你之前链接的两件事。我宁愿从头开始构建所有东西,这样我就可以学习更多关于设计自己的软件的知识,所以这真的是一种学习体验。您的答案与之前几分钟发布的内容类似,我希望我可以选择这两个答案作为正确答案,但感谢您的帮助。 – user1020184

+0

不用担心 - 最初只是发布基于接口的解决方案,但决定确保您知道ORM,实体框架和NHibernate,以及它们绝对值得阅读并将来使用它们,因为它们提供了许多功能功能和一个非常好的框架。尽管如此,在构建自己的学习体验方面没有任何坏处,尤其是如果您稍后将自己与他们的(他们的)(Entity Framework/NHibernate)进行比较并将其用作学习体验。 –

1

您也可以查看这些数据库中的通用存储库模式和ORM。

+0

我正在研究这个。谢谢,看起来对未来会有帮助。 – user1020184

1

在ADO.NET中,所有的连接类从System.Data.Common.DbConnection继承,所以你想要的东西实际上是建立在到.NET - 所有你需要做的是存储而不是SqlConnection/MySqlConnectionDbConnection的连接,并使用无论如何,在System.Data.Common而不是System.Data.Sql/MySql/

您看到的主要问题是,没有真正的SQL标准 - 除了简单的选择和插入之外,您需要SqlServer和MySql查询的不同语法。要解决这个问题,你需要使用Linq to SQL - 如果你不想依赖库,这是很多工作 - 或者,如果你只想让你的包装做特定操作 - 你可以有一个字典为每个数据库存储这些操作的准备好的查询模板,并在运行时应用这些操作的包装器方法。