设为首页 收藏本站
查看: 570|回复: 0

[经验分享] C#中使用SQL Server分布式管理对象(SQL-DMO)

[复制链接]

尚未签到

发表于 2016-11-5 10:26:26 | 显示全部楼层 |阅读模式
C#中使用SQL Server分布式管理对象(SQL-DMO <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  

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

SQLDMO对象来自SQLDMO.dll,SQLDMO.dll是随SQLServer2000一起发布的。SQLDMO.dll自身是一个COM对象,因此,在你的.NET项目里必须先引用它,VS.NET集成开发环境会创建所有必要的对COM的封装。注意:如果你使用“usingSQLDMO;”语句来引用的话,你将会得到一个错误信息。要让它在你的应用程序里正常工作,你必须按下图去引用它:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="圖片_x0020_7" style="VISIBILITY: visible; WIDTH: 375pt; HEIGHT: 275.25pt" alt="单击显示全图,Ctrl+滚轮缩放图片" type="#_x0000_t75" o:spid="_x0000_i1025"><imagedata o:title="单击显示全图,Ctrl+滚轮缩放图片" src="file:///C:/DOCUME~1/CHENG~1.CHE/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif"></imagedata></shape>

引用了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;  

}  

}  




程序运行的结果将象下图的样子:
<shape id="圖片_x0020_16" style="VISIBILITY: visible; WIDTH: 382.5pt; HEIGHT: 249pt" alt="单击显示全图,Ctrl+滚轮缩放图片" type="#_x0000_t75" o:spid="_x0000_i1034"><imagedata o:title="单击显示全图,Ctrl+滚轮缩放图片" src="file:///C:/DOCUME~1/CHENG~1.CHE/LOCALS~1/Temp/msohtmlclip1/01/clip_image005.gif"></imagedata></shape>

通过上面的例子,要得到SQL的信息是不是很方便呢。  本文转自:http://www.chenjiliang.com/Article/View.aspx?ArticleID=425&TypeID=34

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296088-1-1.html 上篇帖子: Java: Too Simple Hibernate Sample with Ms SQL Server 下篇帖子: sql server 中删除默认约束的通用sql脚本(轉)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表