SQL Server2005中的SMO编程

     http://blog.chinaunix.net/u/23701/showart_425165.html
SQL Server2005中的SMO编程
SMO编程
SMO是SQL Mangagement Objects的简称.与之相对应的是ADO.Net,不过不同的地方是ADO.Net是用于数据访问的,而SMO是用于设计的,虽然SMO能够再服务器上执行任意的SQL语句.另外一个不同的地方是ADO.Net可以访问计算机中任意数据源,而SMO对象是专门针对SQL Server而设计的.
在SMO中最重要的一个类就是Server.其他大多数对象都是Server对象的后代.比如Database,Table,View等等对象都是通过Server属性不断向下检索到的.
要在VS2005中使用必须引用SMO的程序集.我们建立好一个控制台应用程序,添加引用:Microsoft.SqlServer.ConnectionInfo和Microsoft.SqlServer.Smo.我们可以输入如下代码使用Server对象给出某服务器中的数据库数目:
using  System;
using  Microsoft.SqlServer.Management.Smo;
namespace  SMOTest
{
    
class Class1
    
{
        
public static void Main()
        
{
            Microsoft.SqlServer.Management.Common.ServerConnection conn 
= new Microsoft.SqlServer.Management.Common.ServerConnection("tcp:157.60.15.215,12345""sa""123456");
            Server s 
= new Server(conn);
            Console.WriteLine(
"DatabaseCount:" + s.Databases.Count);
 }

    }

}

运行以上代码就可以得到服务器上数据库的数目.下面我们再来看看在SMO中对数据库常见的操作:
1,创建删除数据库.
Database db2 = new Database(s, "NewDatabaseName");
db2.Create();
以上是创建数据库的代码,那么删除数据库的代码就是:
 Database db2 = s.Databases["NewDatabaseName"];
db2.Drop();
2,创建表.
Database db  =  s.Databases[ " AdventureWorks " ];
Table tb 
=   new  Table(db,  " NewTableName " );
Column c 
=   new  Column(tb,  " CustomerID " );
c.Identity 
=   true ;
c.IdentitySeed 
=   1 ;
c.DataType 
=  DataType.Int;
c.Nullable 
=   false ;
tb.Columns.Add(c);
=   new  Column(tb,  " CustomerName " );
c.DataType 
=  DataType.VarChar( 20 );
c.Nullable 
=   true ;
tb.Columns.Add(c);
tb.Create();
以上语句是在数据库AdventureWorks中创建了一个表NewTableName,其中我们定义了两个字段,一个是CustomerID,一个是CustomerName.需要注意的是在创建表的时候必须要指定其中的列,如果没有指定列,那么创建表就会失败.
3,创建存储过程.
StoredProcedure sp  =   new  StoredProcedure(db,  " NewStoredProcedure " );
StoredProcedureParameter spp1 
=   new  StoredProcedureParameter(sp,  " @addrID " , DataType.Int);
sp.TextMode 
=   false ;
sp.Parameters.Add(spp1);
sp.TextBody 
=   " select * from Person.Address where AddressID=@addrID " ;
sp.Create();

这儿需要说明的是如果不写sp.TextMode = false;那么可能创建存储过程要失败,所以最好把这句加上.
整个语句比较简单,而且也比较好理解,就不用多作解释了.
4,删除对象.
删除对象比较简单,只要将需要删除的对象引用过来,然后执行Drop操作就可以了.比如:
删除表:
Table tb = db.Tables[ " TableName " ]; tb.Drop();
删除存储过程:
StoredProcedure sp  =  db.StoredProcedures[ " NewStoredProcedure123 " ]; sp.Drop();

5,执行存储过程.
执行存储过程不需要在StoredProcedure对象下寻找方法,要SMO直接执行存储过程可以使用Database对象下的ExecuteNonQuery方法.
6,更新对象属性.
若想要修改数据库的属性,修改存储过程内容等,在进行修改后必须要执行Alter方法才能真正更新.
比如修改数据库属性可以使用修改db.DatabaseOptions下的属性,新属性修改好后执行一句db.Alter();便可.
若要修改存储过程,代码如下:
StoredProcedure sp  =  db.StoredProcedures[ " NewStoredProcedure123 " ];
StoredProcedureParameter spp1 
=   new  StoredProcedureParameter(sp,  " @spID " , DataType.Int);
sp.TextMode 
=   false ;
sp.Parameters.Add(spp1);
sp.TextBody 
=   " select * from Person.Address where StateProvinceID=@spID " ;
sp.Alter();

其他的一下对象如表,视图等等原理相同.

http://www.365master.com/manage/database/sqlserver/20080421/33267.shtml

深入讲解SQL Server 2005中的SMO
来源: 作者: 发布时间:2008-04-21
1、数据库的连接与关闭
     //方式一
            ServerConnection conn = new ServerConnection(”计算机的名字”);
            server canopus5 = new server(conn);
            ServerConnection conn2 = canopus5.ConnectionContext;//获取这个连接的引用

     //方式2
            server server = new server(”localhost”);
            server.ConnectionContext.Connect();
            server.Initialize(false);
//表示不加载数据库服务器的属性,如果是true,则强制加

载属性
          
            Console.WriteLine(server.State.ToString());
     Console.WriteLine(serverConnection.ProcessID);//52
            Console.ReadLine();
            //关闭数据库
            server.ConnectionContext.SqlConnectionObject.Close();

对数据库连接的方式,具体的根据下面的程序,大家会有一个比较清晰的认识:
//首先给大家介绍的默认连接的形式
            ServerConnection serverConnection = new ServerConnection();
            serverConnection.Connect();
            //数据库,我们采用的混合模式
            Console.WriteLine(serverConnection.ConnectionString.ToString());
//默认是使用

Windows的认证模式,
            //所以下面的属性是空的
            Console.WriteLine(serverConnection.ConnectAsUserName.ToString());
//这里返回的是空的
            Console.WriteLine(serverConnection.ConnectAsUserPassword.ToString());
//返回的是空
            Console.ReadLine();
//下面的形式比较灵活,使用Sql Server登录模式
//也使用了WIndows的认证模式,这里我们使用的登录用户是通过模拟实现的,

也就是登录的用户不是当前在Windows中运行的用户
          ServerConnection serverConnection = new ServerConnection();
            SqlCommand cmd =
                new SqlCommand(”SELECT SUSER_NAME()”,
                serverConnection.SqlConnectionObject);
            serverConnection.ServerInstance = “7D87EB54AFCA4D2″;
//根据LoginSecure属性来决定是什么模式登录数据库

//LoginSecure=false,表示使用SQL Server登录方式,需要提供sa和对应的密码,

或者其他的用户名和密码
            /*
            serverConnection.LoginSecure = false;
            serverConnection.Login = “sa”;
            serverConnection.Password = “qeilf0327″;
//这里提供一种加密的方式
            SecureString spwd = new SecureString();
            spwd.AppendChar(’q');
            spwd.AppendChar(’e');
            spwd.AppendChar(’i');
            spwd.AppendChar(’l');
            spwd.AppendChar(’f');
            spwd.AppendChar(’0′);
            spwd.AppendChar(’3′);
            spwd.AppendChar(’2′);
            spwd.AppendChar(’7′);
            spwd.MakeReadOnly();
            Console.WriteLine(spwd.ToString());
//返回的字符串System.Security.SecureString
            localhost =
                new ServerConnection(
                “localhost”, name, spwd);

            Console.WriteLine(localhost.Password);
            Console.ReadLine();
           */

            //根据LoginSecure属性来决定是什么模式登录数据库
            //LoginSecure=true,表示使用Windows认证的方式,需要提供系统的用户的
            serverConnection.LoginSecure = true;//这种方式为Windows认证的方式,
            //如果至此我们什么都不设置的话,就是当前登录的用户
            serverConnection.ConnectAsUser = true;//如果将这个属性设置为true,

必须要相应设置下面的两个属性
            serverConnection.ConnectAsUserName = @”SQLUser”;
//SQLUser,是我在系统中建立的一个管理员用户
            serverConnection.ConnectAsUserPassword = @”chenleiilf)#27″;
            /*下面的是我们的输出
            LogonUser succedded
            7D87EB54AFCA4D2SQLUser
            */

            serverConnection.Connect();
//连接建立起来的时候,我们可以看看当前的状态,并输出当前登录的用户
     if (serverConnection.IsOpen)
            {
                Console.WriteLine(serverConnection.TrueLogin);
            }
          
            Console.WriteLine(cmd.ExecuteScalar());//返回的结果是7D87EB54AFCA4D2

Administrator
            Console.ReadLine();
      

2、连接数据库,获取数据库的列表
using microsoft.SqlServer.Management.Smo;

     //Server server = new server(args[0]);
            //Server server = new server(”localhost”);//本地的
            //Server server = new server();//默认的,只有一个实例的时候
            server server = new server(”7D87EB54AFCA4D2″);//计算机的名字
            foreach (Database database in server.Databases)
            {
                Console.WriteLine(database.Name);
            }
            Console.ReadLine();
     //补充另外一种方法,来获取服务器中的所有数据库
            SqlConnectionStringBuilder sb =
                new SqlConnectionStringBuilder();
            sb.DataSource = “localhost”;
            sb.IntegratedSecurity = true;
            SqlConnection conn =
                new SqlConnection(sb.ConnectionString);
            conn.Open();
            SqlCommand cmd = new SqlCommand(
                 @”SELECT dtb.name AS [Name] FROM
                   master.sys.databases AS dtb
                   ORDER BY [Name] ASC”,
                   conn);
            SqlDataReader rdr = cmd.ExecuteReader();
            while(rdr.Read())
            {
                Console.WriteLine(rdr[0]);
            }
     //获取数据下面的表
            server server = new server();
            Console.WriteLine(server.Information.Product
              + ” ” + server.Information.ProductLevel
              + ” ” + server.Information.VersionString);
            foreach (Database db in server.Databases)
            {
                Console.WriteLine(”Database: ” + db.Name);
                foreach (Table tb in db.Tables)
                {
                    Console.WriteLine(”  table: ” + tb.Name);
                }
            }
      
3、连接数据库,获取数据库对象的URN,如,表,数据库,存储过程,程序集等

using microsoft.SqlServer.Management.Common;
using microsoft.SqlServer.Management.Smo;
        static void Main(string[] args)
        {
            server localhost = new server(”localhost”);
            Database firstDatabase = localhost.Databases[0];
            table table = firstDatabase.Tables[0];
            Console.WriteLine(firstDatabase.Name.ToString());
            Console.WriteLine(table.Name.ToString());
            Urn firstUrn = firstDatabase.Urn;
            //Server[@Name=’7D87EB54AFCA4D2′]/Database[@Name=’AdventureWorks’]
            Console.WriteLine(firstUrn.ToString());

            Urn firstTable = table.Urn;
            /*Server[@Name=’7D87EB54AFCA4D2′]
/Database[@Name=’AdventureWorks’]/Table

[@Name=’AWBuildVersion’ and @Schema=’dbo’]
            */
            Console.WriteLine(firstTable.ToString());
            //看看存储过程,URN,样子是怎样的
            if (firstDatabase.StoredProcedures.Count != 0)
            {
                StoredProcedure sp = firstDatabase.StoredProcedures[0];
                Console.WriteLine(sp.Urn.ToString());
            }
            //触发器
            if (firstDatabase.Triggers.Count != 0)
            {
                DatabaseDdlTrigger tigger = firstDatabase.Triggers[0];
                Console.WriteLine(tigger.Urn.ToString());
            }
            //视图
            if (firstDatabase.Views.Count != 0)
            {
                View view = firstDatabase.Views[0];
                Console.WriteLine(view.Urn.ToString());
            }
            //用户
            if(firstDatabase.Users.Count!=0)
            {
                foreach (User user in firstDatabase.Users)
                {
                    Console.WriteLine(user.Urn.ToString());
                }
            }

            Console.WriteLine(firstDatabase.UserName.ToString());//dbo

            Console.WriteLine(firstDatabase.ActiveConnections.ToString());//0
            Console.WriteLine(firstDatabase.ActiveDirectory.Urn.ToString());
            if(firstDatabase.Assemblies.Count!=0)
            {
                foreach(SqlAssembly assembly in firstDatabase.Assemblies)
                {
                    Console.WriteLine(assembly.Urn.ToString());
                }
              
            }
            localhost.ConnectionContext.Disconnect();
            //
            server localhost1 = new server(”localhost”);
            Database tryAgain = localhost1.GetSmoObject(firstUrn) as Database;
            Console.WriteLine(firstDatabase.Name.ToString());
            Console.ReadLine();
        }
4、创建和删除表,数据库
            server localhost = new server();
            //必须输入本机的名字,7D87EB54AFCA4D2,localhost似乎不行
            Database NorthWind = localhost.GetSmoObject(
                “Server[@Name=’7D87EB54AFCA4D2′]/Database[@Name=’NorthWind’]”) as

Database;
            table t = new table(NorthWind, “MyTable”);
            t.Columns.Add(new Column(t, “ID”, DataType.Int));
            t.Columns.Add(new Column(t, “Description”, DataType.NVarChar(200)));
            t.Create();
            Console.WriteLine(”Successfully!!”);

     //一种比较容易理解的方法
        static void AddTable(string serverName, string databaseName, string tableName,

string columnName)
        {
            server server = new server(serverName);
            Database database = server.Databases[databaseName];
            table table = new table(database, tableName);
            Column column = new Column(table, “ID”, DataType.Int);
            column.Identity = true;
            table.Columns.Add(column);
            Index primary = new Index(table, “PK_” + tableName);
            primary.IndexKeyType = IndexKeyType.DriPrimaryKey;
            primary.IndexedColumns.Add(new IndexedColumn(primary, “ID”));
            table.Indexes.Add(primary);
            column = new Column(table, columnName, DataType.VarChar(256));
            table.Columns.Add(column);
            table.Create();
        }

     //删除数据库中的表
            table Test456 = canopus5.GetSmoObject(
                @”Server[@Name=’7D87EB54AFCA4D2′]
                /Database[@Name=’NorthWind’]
                /Table[@Name=’MyTable’ and @Schema=’dbo’]”)
                as table;
            Test456.Drop();
5、查询等操作
//学习会使用SMO的连接对象,与SqlCommand结合进行查询,执行SQL语句
     ServerConnection serverConnection = new ServerConnection();
            serverConnection.Connect();
            SqlCommand cmd = new SqlCommand(
                “Select * from pubs..authors”, serverConnection.SqlConnectionObject);
6、脚本的操作

using microsoft.SqlServer.Management.Smo;
using system.Collections.Specialized;//StringCollection

            server server = new server();
            Database database = server.Databases[”northwind”];
            string tableName = “mytest”;
            string columnName = “name”;
            table table = new table(database, tableName);
            Column column = new Column(table, “ID”, DataType.Int);
            column.Identity = true;
            table.Columns.Add(column);
            Index primary = new Index(table, “PK_” + tableName);
            primary.IndexKeyType = IndexKeyType.DriPrimaryKey;//需要添加引用

microsoft.SqlServer.SqlEnum文件
            primary.IndexedColumns.Add(new IndexedColumn(primary, “ID”));
            table.Indexes.Add(primary);
            column = new Column(table, columnName, DataType.VarChar(256));
            table.Columns.Add(column);
            table.Create();
            ScriptingOptions so = new ScriptingOptions();
            //so.ScriptDrops = true;
            StringCollection sc = new StringCollection();
            //customer.Script(
            sc = table.Script(so);
            foreach (String s in sc)
            {
                Console.WriteLine(s);
            }
            Console.ReadLine();
        }
        /*
         * 下面是输出的内容,就是创建的脚本
        SET ANSI_NULLS ON
        SET QUOTED_IDENTIFIER ON
        CREATE table [dbo].[mytest](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [name] [varchar](256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
        ) ON [PRIMARY]
       
        */
    }
}

7、配置管理
using microsoft.SqlServer.Management.Smo;
using microsoft.SqlServer.Management.Smo.Wmi;
            //可以获取,本地计算机的信息,下面演示的服务的列表
            ManagedComputer mc = new ManagedComputer();
            Console.WriteLine(mc.Name);
            foreach (Service s in mc.Services)
            {
                Console.WriteLine(s.Name);
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值