转:数据库管理对象(SMO)-为什么没有System.Data.DBManagement命名空间?

     最近要为我们的程序增加数据导出的功能,需用连接数据库,再列出数据库中的表。功能并不复杂,实现也没有难度。而且VS本身就自带了这个东东。如图:

     我所奇怪的是,既然微软已经做了这个工作。为什么没有给出现成的类库给我们使用呢?我觉得非常明显的,应该有一个System.Data.DBManagement命名空间,用于开发者开发出自己的数据库管理程序。如果仅仅因为不同的数据库不一样。那么可以分别有System.Data.DBManagement.Sql,System.Data.DBManagement.Oracle等等。按照我的设想大致应该有如下类:


      假如我们要获得某个数据库的所有表,我们就可以写以下代码:

 


        Server myServer=new Server();
        myServer.Name
="localhost"
;
        myServer.TrustConnection
=true
;
        Database db
=new
 Database();
        Database.Server
=
myServer;
        TableCollection tables
=Database.GetTables();

      以上的示例只是简单的意思一下。如果要覆盖所有数据库管理工具的功能,应该是一个比较庞大的类库了。我不知道哪里是不是已经有这样的类库,如果没有,只有自己开发了...

      帖子发表以后,根据很多朋友的指点(多谢下面的各位同学,具体就不点名了)。一共有三个答案。

      1.Sql Server的SDK中的SQL Server Management Objects (SMO)应该就是本案的标准答案。美中不足的是,微软只提供Sql Server的数据库管理对象的类库,不支持其他数据库。

      这是MSDN上SMO(SQL Server2005)的地址http://msdn.microsoft.com/zh-cn/library/ms162169(SQL.90).aspx

      另外一篇介绍SMO的文章http://hi.baidu.com/qualylee/blog/item/0e4e0e33a64127fb1a4cff53.html

      2.MyGeneration的MyMeta.dll中。功能肯定不如SMO强,但是提供了对数据库管理的比较丰富的类,并且支持十几种数据库。尤其可喜的是,MyGeneration现在是开源的。http://sourceforge.net/projects/mygeneration/

      不过毕竟MyMeta.dll 的目的并不是用于管理数据库,因此可能对于管理数据库方面的功能少了点。

      3.SQL Server Web Data Administrator 的SqlAdmin.dll。SQLWebAdm 是在CodeComplex的一个开源项目,也是微软团队开发的,因此也只支持Sql Server。该项目主要是SQL Server管理器的Web版本(不过好像很久没有更新了最近更新时间2007年11月),但是它并没有引用SMO的类库而是自己开发了SqlAdmin.dll,也许是为了独立吧。SqlAdmin.dll中的类跟MyMeta.dll中MyMeta.Sql命名空间的类有些类似,可谓英雄所见略同吧。

      http://www.codeplex.com/SqlWebAdmin

       补充:实用ADO.NET的DbConnection 类的 GetSchema 方法也可以获取数据库的架构信息。

       http://msdn.microsoft.com/zh-cn/library/kcax58fh(VS.80).aspx

      我们的项目需要自动生成导入数据的脚本,假如目标数据库中已经存在数据,对于自增列值冲突的问题要有特殊的解决,等我研究好了我会在下篇随笔中公布源代码和详细描述,假如哪位朋友已经有现成的解决方案,也希望不吝赐教。

posted @ 2009-03-31 22:37  rapid  阅读(334)  评论(0编辑  收藏  举报