转自http://www.csharphelp.com/archives2/archive342.html
很多时候,我需要在我的程序中得到SQL Server的详细信息。直到最近我还在使用API调用和假冒的ADO调用来获得我需要的信息。现在,我们有了SQLDMO(SQL Distributed Management Objects)。尽管没有被广泛的知晓和使用,SQLDMO提供了一个非常强大的功能集来用代码实现SQL Server所有能作的事。我举这个例子,是为了展示如何在你本地网络上取得SQL Server列表,如何连接一个Server,和如何从服务器得到表、存储过程和视图的列表。
SQLDMO对象来自与SQL Server 2000一同发售的SQLDMO.dll。这个dll本身是一个COM对象,而你必须把它引用到你的.net项目中。IDE将会为使用这个库创建必需的COM包装(wrapper)。注意:如果你在你的程序中使用“using SQLDMO”声明,你会得到一个错误。
(你必须为你的样例程序正常工作重引用这个COM对象)
在引用了这个COM对象之后,你可以开始非常简单的使用它。
所有在例子中出现的操作使用了一个或多个如下对象:
- SQLDMO.Application
- SQLDMO.SQLServer
- SQLDMO.Database
- SQLDMO.NameList
有很多可用的对象来完成诸如备份和还原的操作,但为了本文的目的,我打算保持简单使你能很容易的对SQLDMO入门。
列出你在网络的所有SQL Servers是非常容易的。首先,你需要引用SQLDMO.Application对象。然后你把一个SQLDMO.NameList的实例设为SQLDMO.Application.ListAvailableSQLServers()方法的返回值。SQLDMO.NameList是一个服务器名的COM集合。
记住,在你习惯之前,调用COM对象有点让人胆战心惊,但是它们之间的协定(convention)是非常相似的。这里有一段示例代码,它把本地网络上可用的SQL Servers列表填入一个叫cboServers的combo box中:
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。
连接到一个服务器然后得到一个数据库的列表也同样非常简单。接下来的代码将用combo box中选中的SQL Server,连上它(用text box中的用户名和密码),然后,另一个combo box就灌入了那个服务器上的数据库列表。
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);
}
使用这个库得到类型对象列表也同样是轻而易举的事。你再一次建立一个数据库连接,然后你循环通过这个对象集合。
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;
}
}
好了伙计,这就是我的SQLDMO入门指南。请立即下载样例代码和程序来看。就像你看到的,当你需要SQL信息和控制时,这是一种更方便的选择。编程愉快!