利用SQLDMO操控SQL Server

来源:互联网 发布:红米怎么设置4g网络 编辑:程序博客网 时间:2024/05/17 15:04
在开发基于SQL Server数据库的应用程序时,经常会遇到需要知道SQL Server数据库对象的相关信息的情况,例如SQL Server中有哪些数据库,这些数据库中有哪些数据表,每个数据表有哪些字段,这些字段是什么属性等。利用SQL-DMO(分布式管理对象)来访问SQL Server数据库。SQL-DMO是为Windows 9x与 Windows NT提供的32位OLE对象,它为与OLE兼容的应用程序提供了SQL Server管理功能的接口,开发者通过DMO就可以直接访问SQL Server所有的数据对象。
        不知道大家注意过没有,有好多代码生成器在操作数据库的时候就是利用SQLDMO对象来显示数据库的(包括数据库服务器、数据库、表、视图、存储过程)。但是我上次写的那个简单的代码生成器却没有利用这个对象,我是直接利用SQL语句来操作的,大家不妨在看看那个“代码生成器”。好了,废话少说,下面就介绍一下怎么利用SQLDMO操作数据的。

一、获取局域网数据库服务器
首先要定义一个SQLDMO.Application 对象
private SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
然后再定义一个SQLDMO.NameList 对象
SQLDMO.NameList sqlServers=null;
cboServers是下列列表框的ID,下面是将数据库服务器显示在下拉列表框中的代码:
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);                        
    }

}

二、获取服务器中的数据库列表
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);
}

this.cboDatabase.Sorted = true;
if(this.cboDatabase.Items.Count >0)
{
    
this.cboDatabase.SelectedIndex = 0;
    
this.cboDatabase.Enabled = true;
    
this.groupBox1.Enabled = true;
}

else
{
    
this.groupBox1.Enabled = false;
    
this.cboDatabase.Enabled = false;
    
this.cboDatabase.Text = "<No databases found>";
}

三、获取数据库中的表
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.Tables.Count;j++)
        
{
            
this.lstObjects.Items.Add(db.Tables.Item(j+1,"dbo").Name);
        }

        
this.Cursor = Cursors.Default;
        
return;
    }

}


四、获取数据库中的存储过程
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);
        }

        
this.Cursor = Cursors.Default;
        
return;
    }

}

五、获取数据库中的视图
SQLDMO.SQLServer srv = new SQLDMO.SQLServerClass();                
srv.Connect(
this.cboServers.SelectedText,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.Views.Count;j++)
        
{
            
this.lstObjects.Items.Add(db.Views.Item(j+1,"dbo").Name);
        }

        
this.Cursor = Cursors.Default;
        
return;
    }

}


        这些都是最基本的操作,有了这些大家还可以操作表中的字段、数据类型、字段长度等信息。利用这些信息和.NET框架中的CodeDOM大家就可以轻而易举实现自己的代码生成器了。怎么样,简单吧,哈哈!

posted on 2005-09-03 15:26 振河 阅读(374) 评论(10)  编辑 收藏 收藏至365Key 所属分类: SQL Server 2000
-->
评论:
# re: 利用SQLDMO操控SQL Server 2005-09-03 15:40 | 当兵的人
能否写一下怎么获取字段名及其信息呢?
  
# re: 利用SQLDMO操控SQL Server 2005-09-03 16:21 | 蛙蛙池塘
这个东西需要引用哪个命名空间呀,我只知道用ADOX可以获取这些信息。
  
# re: 利用SQLDMO操控SQL Server 2005-09-03 16:40 | 振河
哦,忘记告诉大家怎么用了,还以为大家都熟悉SQLDMO呢。那就在这补充一下吧:首先添加对sqldmo.dll的引用,位置在C:/Program Files/Microsoft SQL Server/80/Tools/Binn目录下,然后在程序中加入using SQLDMO;引用就可以了。
  
# re: 利用SQLDMO操控SQL Server 2005-09-03 16:45 | 补丁
不错不错
另外,如何调用图形化的sql语句编辑器呢?
就像vs里生成sql语句的那样?
  
# re: 利用SQLDMO操控SQL Server 2005-09-03 16:51 | 振河
@蛙蛙池塘兄弟今天又给了我一点启示,还有ADOX也可以做这些事情,看来要做一件事情,还真是条条大路通罗马啊!
  
# re: 利用SQLDMO操控SQL Server 2005-09-03 16:57 | 蛙蛙池塘
呵呵,主要是我孤陋寡闻。
  
# re: 利用SQLDMO操控SQL Server 2005-09-03 17:19 | 浪淘沙
那些字段、表、主键等信息都存放在系统表中。比如sysobjects,sysusers...
数据库的信息存放在master库中。
可以一个个研究。


最省事情的方法就是打开一个“事件探查器”,设置一下监控,然后你在前台运行一下要做德东东,探查器里面就告诉你是什么脚本了。我测试了一下,爽!

于是自己都可以做查询分析器,甚至“企业管理器”都是可以的。
  
# re: 利用SQLDMO操控SQL Server 2005-09-03 17:42 | 極速麻醉
老兄,我照你的方法做了。自怎會出錯呢?
錯誤信息如下:
類型 'System.InvalidCastException' 的未處理例外狀況發生於 Wintest.exe
其他資訊: 介面 SQLDMO.NameList 的 QueryInterface 失敗。
我的msn:lilingjun888@msn.com

  
# re: 利用SQLDMO操控SQL Server 2005-09-04 08:15 | lemongtree
SQLDOM必须运行在SQL Server SP2或以上版本
看这里
http://lemongtree.cnblogs.com/archive/2005/08/25/222789.html

天地任我行。。。