zoukankan      html  css  js  c++  java
  • C#中使用SQL Server分布式管理对象(SQLDMO)(转) dodo

    我们曾经在以前的应用中多次需要得到SQL Server的详细信息,过去,我们必须使用API和效率低下的ADO的 调用才能得到,现在,我们有了一个新的方法,就是SQLDMO(SQL Distributed Management Objects,SQL分布式管 理对象),尽管它目前还不被人所知和使用,但是SQLDMO提供了许多强有力的、和利用代码从SQL Server获得 信息相类似的许多功能,为举例方便,这里仅向您解释如何得到本地网络的SQL Server列表,如何去连接每 个SQL Server,以及如何得到Server中的表、存储过程和视图的列表。

    SQLDMO对象来自SQLDMO.dll,SQLDMO.dll是随SQL Server2000一起发布的。SQLDMO.dll自身是一个COM对象,因此 ,在你的.NET项目里必须先引用它,VS.NET集成开发环境会创建所有必要的对COM的封装。注意:如果你使用“ using SQLDMO;”语句来引用的话,你将会得到一个错误信息。要让它在你的应用程序里正常工作,你必须按下图 去引用它:

    引用了COM对象之后,你就可以很容易地使用它了。

    本例子中的所有操作都使用以下的一个或几个对象:

    SQLDMO.Application SQLDMO.SQLServer SQLDMO.Database SQLDMO.NameList

    象数据备份和恢复这样的操作都有许多对象可以使用,但作为例子,我们会尽量简单,使你轻松进 入SQLDMO的世界来浏览一下它的方便性。

    列出本地网络中可使用的SQL服务器相对来说比较简单,首先,你需要引用SQLDMO.Application对象,其 次,你必须建立一个SQLDMO.Application.ListAvailableSQLServers()方法的返回值的实 例SQLDMO.NameList,SQLDMO.NameList是服务器名字的COM集合。

    请记住:在你习惯了调用COM对象之前,调用COM对象总是令人感到可怕的,但习惯了就会好的。下面 是一些示例代码,它利用本地可使用的SQL服务器的列表来填充下拉列表框。

    //得到所有本地网络中可使用的SQL服务器列表。 SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers(); for(int i=0;i<sqlServers.Count;i++) { object srv = sqlServers.Item(i + 1); if(srv != null) { this.cboServers.Items.Add(srv); } } if(this.cboServers.Items.Count > 0) this.cboServers.SelectedIndex = 0; else this.cboServers.Text = "<No available SQL Servers>";

    正如前面所讲的,是不是很简单?请记住:COM集合的第一个项目是1,而不是0。

    连接数据库并得到所有数据库的列表也是相当简单的。下面的代码采用上面下拉列表框所选择的SQL服 务器,并连接该服务器(使用文本框输入的用户名和密码),生成该服务器上数据库列表的下拉列表框。

    //得到指定SQL服务器所有数据库的列表 SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass(); srv.Connect(this.cboServers.SelectedItem.ToString(),this.txtUser.Text,this.txtPassword.Text); foreach(SQLDMO.Database db in srv.Databases) { if(db.Name!=null) this.cboDatabase.Items.Add(db.Name); }

    要得到该库中对象的列表也是轻而易举的事,再一次连接到数据库,就可以遍历出对象的集合。

    //得到所有的存储过程,所有的表放到Tables集合,所以的视图放到Views集合 SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass(); srv.Connect(this.cboServers.SelectedItem.ToString(),this.txtUser.Text,this.txtPassword.Text); for(int i=0;i<srv.Databases.Count;i++) { if(srv.Databases.Item(i+1,"dbo").Name == this.cboDatabase.SelectedItem.ToString()) { SQLDMO._Database db= srv.Databases.Item(i+1,"dbo"); this.lstObjects.Items.Clear(); for(int j=0;j<db.StoredProcedures.Count;j++) { this.lstObjects.Items.Add(db.StoredProcedures.Item(j+1,"dbo").Name); } break; } }

    程序运行的结果将象下图的样子:

    通过上面的例子,要得到SQL的信息是不是很方便呢。

    关键字:
      关于本文的评论:为了保护您的电子邮件不被骚扰,地址中的个别符号转换成了全角字符!
    评论人:jazz 电子邮件: 评论日期:2008年02月13日 11:37:36
    有一个问题:

           对这个方法中的参数有点不明白db.StoredProcedures.Item(j+1,"dbo"),这里的"dbo"是个object,做什么用的?随便写一个就可以吗?

    知道的请赐教!!!
    评论人:jazz 电子邮件: 评论日期:2008年02月13日 11:36:46
     网络转载自:孟子E章

    我们曾经在以前的应用中多次需要得到SQL Server的详细信息,过去,我们必须使用API和效率低下的ADO的 调用才能得到,现在,我们有了一个新的方法,就是SQLDMO(SQL Distributed Management Objects,SQL分布式管 理对象),尽管它目前还不被人所知和使用,但是SQLDMO提供了许多强有力的、和利用代码从SQL Server获得 信息相类似的许多功能,为举例方便,这里仅向您解释如何得到本地网络的SQL Server列表,如何去连接每 个SQL Server,以及如何得到Server中的表、存储过程和视图的列表。

    SQLDMO对象来自SQLDMO.dll,SQLDMO.dll是随SQL Server2000一起发布的。SQLDMO.dll自身是一个COM对象,因此 ,在你的.NET项目里必须先引用它,VS.NET集成开发环境会创建所有必要的对COM的封装。注意:如果你使用“ using SQLDMO;”语句来引用的话,你将会得到一个错误信息。要让它在你的应用程序里正常工作,你必须按下图 去引用它:  

    引用了COM对象之后,你就可以很容易地使用它了。 

    本例子中的所有操作都使用以下的一个或几个对象: 

    SQLDMO.Application SQLDMO.SQLServer SQLDMO.Database SQLDMO.NameList 
    象数据备份和恢复这样的操作都有许多对象可以使用,但作为例子,我们会尽量简单,使你轻松进 入SQLDMO的世界来浏览一下它的方便性。 

    列出本地网络中可使用的SQL服务器相对来说比较简单,首先,你需要引用SQLDMO.Application对象,其 次,你必须建立一个SQLDMO.Application.ListAvailableSQLServers()方法的返回值的实 例SQLDMO.NameList,SQLDMO.NameList是服务器名字的COM集合。 

    请记住:在你习惯了调用COM对象之前,调用COM对象总是令人感到可怕的,但习惯了就会好的。下面 是一些示例代码,它利用本地可使用的SQL服务器的列表来填充下拉列表框。 

    //得到所有本地网络中可使用的SQL服务器列表。 SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers(); for(int i=0;i 0) this.cboServers.SelectedIndex = 0; else this.cboServers.Text = ""; 

    正如前面所讲的,是不是很简单?请记住:COM集合的第一个项目是1,而不是0。 

    连接数据库并得到所有数据库的列表也是相当简单的。下面的代码采用上面下拉列表框所选择的SQL服 务器,并连接该服务器(使用文本框输入的用户名和密码),生成该服务器上数据库列表的下拉列表框。 

    //得到指定SQL服务器所有数据库的列表 SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass(); srv.Connect(this.cboServers.SelectedItem.ToString(),this.txtUser.Text,this.txtPassword.Text); foreach(SQLDMO.Database db in srv.Databases) { if(db.Name!=null) this.cboDatabase.Items.Add(db.Name); } 
    要得到该库中对象的列表也是轻而易举的事,再一次连接到数据库,就可以遍历出对象的集合。 

    //得到所有的存储过程,所有的表放到Tables集合,所以的视图放到Views集合 SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass(); srv.Connect(this.cboServers.SelectedItem.ToString(),this.txtUser.Text,this.txtPassword.Text); for(int i=0;i程序运行的结果将象下图的样子: 

     

    通过上面的例子,要得到SQL的信息是不是很方便呢。

     

    有一个问题:

           对这个方法中的参数有点不明白db.StoredProcedures.Item(j+1,"dbo"),这里的"dbo"是个object,做什么用的?随便写一个就可以吗?

    知道的请赐教!!!
    评论人:zbw911 电子邮件:zbw911@126.com 评论日期:2007年05月11日 10:14:18
    不错
    评论人:Steven 电子邮件:lingfenglin@21cn.com 评论日期:2007年04月25日 10:53:29
    我的问题和Jason的第一个问题一样,在srv.Connect(this.cmbSQLInstance.SelectedItem.Value, this.txtUser.Text, this.txtPwd.Text);出错
    .原因是程序把列表、用户名、密码都默认为初始值,也就是列表为local,其他为空。
    请问怎么才能实现用户输入后才校验啊?
    评论人:Jason 电子邮件:JasonPu.F430@gmail.com 评论日期:2007年01月30日 09:56:32
    在局域网内可以得到服务器,在家单机上仍然得不到,另外得到服务器名后在获取DataBase时
    srv.Connect(this.cmbSQLInstance.SelectedItem.Value, this.txtUser.Text, this.txtPwd.Text);出错
    错误:
    [Microsoft][ODBC SQL Server Driver][Shared Memory]SQL Server 不存在或访问被拒绝
    [Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()).
    评论人:Jason 电子邮件:JasonPu.F430@gmail.com 评论日期:2007年01月29日 09:14:56
    我和wangsea一样没有得到SQL服务器名,第一个方法调用后sqlServers.Count =0 。我在本地装了2000 SP4 和2005。
    还请指点得不到服务器名的原因,谢谢。
    评论人:wangsea 电子邮件:512501372@163.com 评论日期:2006年08月28日 07:18:18
    为什么我的在公司内部的网络可以用,可是拿到家里的就不行呀,连本地的都得不到,就是"SQL服务器"得不到(什么都没有),求助!!!
    评论人:pm 电子邮件:pm0115@sina.com 评论日期:2006年07月11日 10:25:26
    请问我应该如何Building SQL Server Applications呢?斑竹给的网址:http://msdn.microsoft.com/library/en-us/bldgapps/ba_highprog_3fg3.asp
    我看不太懂,能再给小弟指点一下吗?
    非常感谢!!
    评论人: 电子邮件: 评论日期:2006年07月11日 10:23:47
    请问我应该如何Building SQL Server Applications呢?我看了斑竹给的网址:http://msdn.microsoft.com/library/en-us/bldgapps/ba_highprog_3fg3.asp
    但是没有看懂,能再给我指点一下吗?
    非常感谢!!
    评论人: 电子邮件: 评论日期:2006年05月27日 09:35:58
    我用VB写,为什么每次运行,获得的SQL服务器的个数都不一
    评论人: 电子邮件: 评论日期:2005年02月23日 02:34:40
    如果备份到异地,怎么办?
    评论人: 电子邮件:mmcgzs@yeah.net 评论日期:2004年12月07日 09:19:19
    很不错呀。
    评论人:maconelxp 电子邮件:ch2x@163.com 评论日期:2004年11月10日 11:24:41
    To James
    这个问题解决办法就是将你的SqlServer打补丁sp3
    这篇文章在一个国外的站点上看过,当时我用的时候也是出现你一样的问题,后来打了补丁之后就好了
    评论人:<font color=red>t</font> 电子邮件: 评论日期:2004年11月05日 11:58:26
    好!
    评论人:James 电子邮件:jz0717@sohu.com 评论日期:2004年08月13日 12:16:49
    我写代码:
    //得到所有本地网络中可使用的SQL服务器列表。
    SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass(); 
    SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers(); 
    for(int i=0;i<sqlServers.Count;i++) 

        object srv = sqlServers.Item(i + 1); 
        if(srv != null) 
        { 
            this.cboServers.Items.Add(srv);                         
        } 

    if(this.cboServers.Items.Count > 0) 
        this.cboServers.SelectedIndex = 0; 
    else 
        this.cboServers.Text = "<No available SQL Servers>"; 
    但是却得到SQLDMO.NameList的QueryInterface失败的错误,我该怎么解决呢?
    评论人:本站管理员 电子邮件: 评论日期:2004年05月25日 03:43:40
    Building SQL Server Applications
    http://msdn.microsoft.com/library/en-us/bldgapps/ba_highprog_3fg3.asp
    评论人:本站管理员 电子邮件: 评论日期:2004年05月25日 03:37:46
    有用的链接:
    Enabling SQL DMO Clients Without Installing the Client Side
    http://support.microsoft.com/?id=248241

    How to distribute and how to install SQL-DMO for SQL Server 2000
    http://support.microsoft.com/?id=326613
  • 相关阅读:
    vmwear 及docker
    vue相关
    vue demo
    线程的死锁
    让出和守护线程
    join加入线程
    线程的优先级
    线程间的通信
    synchronized关键字的使用
    线程的并发
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1298902.html
Copyright © 2011-2022 走看看