现在的位置: 首页 > 综合 > 正文

深入讲解SQL Server 2005中的SMO

2013年03月09日 ⁄ 综合 ⁄ 共 10663字 ⁄ 字号 评论关闭
深入讲解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);
            }

抱歉!评论已关闭.