• SQL Server编程系列(2):SMO常用对象的有关操作


    在上一篇讲述了SMO的一些基本概念,实际上SMO体系结构远不止周公在上一篇中讲述的那么简单,下图是MSDN上给出的一个完整的结构图:

    上图是一个完整的涉及到各种关系的结构图。不过它们之间的层次结构关系周公已经在上一篇做了简单概述。
    在本篇中周公还是在上一篇的基础上再做稍微深入一点的介绍,在本篇中主要讲述如何获取数据库常见对象信息,并且如何利用SMO来进行一些日常操 作:如创建Login,创建数据库、备份数据库和还原数据库。执行上面这些操作的SQL语句也许我们已经写过,下面我们来看看利用SMO来操作的代码将如 何写。
    代码如下:
     
    1. using System; 
    2. using System.Collections.Generic; 
    3. using System.Linq; 
    4. using System.Text; 
    5. using Microsoft.SqlServer.Management.Smo.RegisteredServers;//在microsoft.sqlserver.smo.dll中 
    6. using Microsoft.SqlServer.Management.Smo;//需添加microsoft.sqlserver.smo.dll的引用 
    7. using Microsoft.SqlServer.Management.Common;//需添加microsoft.sqlserver.connectioninfo.dll的引用 
    8. namespace SSISStudy 
    9.     /// <summary> 
    10.     /// SQL Server编程些列文章(2):SMO常用对象的有关操作 
    11.     /// 作者:周公  
    12.     /// 创建日期:2012-05-23  
    13.     /// 博客地址:http://blog.csdn.net/zhoufoxcn http://zhoufoxcn.blog.51cto.com  
    14.     /// 新浪微博地址:http://weibo.com/zhoufoxcn   
    15.     class SMODemo02 
    16.     { 
    17.         /// <summary> 
    18.         /// 显示数据库常见对象信息示例 
    19.         /// </summary> 
    20.         public static void ShowSMOObjects() 
    21.         { 
    22.             Console.WriteLine("Server Group Information"); 
    23.             foreach (ServerGroup serverGroup in SmoApplication.SqlServerRegistrations.ServerGroups) 
    24.             { 
    25.                 Console.WriteLine("Group Name:{0},Path:{1},ServerType:{2},State:{3},Urn:{4}", serverGroup.Name, serverGroup.Path, serverGroup.ServerType, serverGroup.State, serverGroup.Urn); 
    26.             } 
    27.             Console.WriteLine("Registered Server Information"); 
    28.             foreach (RegisteredServer regServer in SmoApplication.SqlServerRegistrations.RegisteredServers) 
    29.             { 
    30.                 Console.WriteLine("Server Name:{0},Login:{1},State:{2},Urn:{3}", regServer.Name, regServer.Login, regServer.State, regServer.Urn); 
    31.             } 
    32.             //创建ServerConnection的实例 
    33.             ServerConnection connection = new ServerConnection(); 
    34.             //指定连接字符串 
    35.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
    36.             //实例化Server 
    37.             Server server = new Server(connection); 
    38.             Console.WriteLine("ActiveDirectory:{0},InstanceName:{1}", server.ActiveDirectory, server.InstanceName); 
    39.             //下面列出每个数据库的具体信息 
    40.             foreach (Database db in server.Databases) 
    41.             { 
    42.                 Console.WriteLine("Database Name:{0},ActiveDirectory:{1},ActiveConnections:{2},DataSpaceUsage:{3},PrimaryFilePath:{4}", db.Name, db.ActiveDirectory, db.ActiveConnections, db.DataSpaceUsage, db.PrimaryFilePath); 
    43.                 //列出数据库的数据文件文件组信息 
    44.                 foreach (FileGroup fileGroup in db.FileGroups) 
    45.                 { 
    46.                     Console.WriteLine(" FileGroup Name:{0},Size:{1},State:{2},Urn:{3}", fileGroup.Name, fileGroup.Size, fileGroup.State, fileGroup.Urn); 
    47.                     //列出每个文件组中的数据文件信息 
    48.                     foreach (DataFile dataFile in fileGroup.Files) 
    49.                     { 
    50.                         Console.WriteLine(" DataFile Name:{0},Size:{1},State:{2},Urn:{3},FileName:{4}", dataFile.Name, dataFile.Size, dataFile.State, dataFile.Urn, dataFile.FileName); 
    51.                     } 
    52.                 } 
    53.                 //列出数据库日志文件信息 
    54.                 foreach (LogFile logFile in db.LogFiles) 
    55.                 { 
    56.                     Console.WriteLine(" LogFile Name:{0},Size:{1},State:{2},Urn:{3},FileName:{4}", logFile.Name, logFile.Size, logFile.State,logFile.Urn,logFile.FileName); 
    57.                 } 
    58.             } 
    59.         } 
    60.         /// <summary> 
    61.         /// 利用SMO创建SQL登录 
    62.         /// </summary> 
    63.         public static void CreateLogin() 
    64.         { 
    65.             string loginName = "zhoufoxcn";//要创建的数据库登录名 
    66.             string loginPassword = "C#.NET";//登录密码 
    67.             //创建ServerConnection的实例 
    68.             ServerConnection connection = new ServerConnection(); 
    69.             //指定连接字符串 
    70.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
    71.             //实例化Server 
    72.             Server server = new Server(connection); 
    73.             #region [创建数据库登录对象] 
    74.             //检查在数据库是否已经存在该登录名 
    75.             var queryLogin = from Login temp in server.Logins 
    76.                              where string.Equals(temp.Name, loginName, StringComparison.CurrentCultureIgnoreCase) 
    77.                              select temp; 
    78.             Login login = queryLogin.FirstOrDefault<Login>(); 
    79.             //如果存在就删除 
    80.             if (login != null) 
    81.             { 
    82.                 login.Drop(); 
    83.             } 
    84.             login = new Login(server, loginName); 
    85.             login.LoginType = LoginType.SqlLogin;//指定登录方式为SQL认证 
    86.             login.PasswordPolicyEnforced = true; 
    87.             login.DefaultDatabase = "master";//默认数据库 
    88.             login.Create(loginPassword); 
    89.             #endregion 
    90.         } 
    91.         /// <summary> 
    92.         /// 利用SMO创建数据库 
    93.         /// </summary> 
    94.         public static void CreateDatabase() 
    95.         { 
    96.             string databaseName = "SMODemo"; 
    97.             //创建ServerConnection的实例 
    98.             ServerConnection connection = new ServerConnection(); 
    99.             //指定连接字符串 
    100.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
    101.             //实例化Server 
    102.             Server server = new Server(connection); 
    103.             #region [创建数据库对象] 
    104.             //检查在数据库是否已经存在该数据库 
    105.             var queryDatabase = from Database temp in server.Databases 
    106.                                 where string.Equals(temp.Name, databaseName, StringComparison.CurrentCultureIgnoreCase) 
    107.                                 select temp; 
    108.             Database database = queryDatabase.FirstOrDefault<Database>(); 
    109.             //如果存在就删除 
    110.             if (database != null) 
    111.             { 
    112.                 database.Drop(); 
    113.             } 
    114.             database = new Database(server, databaseName); 
    115.             //指定数据库数据文件细节 
    116.             FileGroup fileGroup = new FileGroup { Name = "PRIMARY", Parent = database, IsDefault = true }; 
    117.             DataFile dataFile = new DataFile 
    118.             { 
    119.                 Name = databaseName + "_data", 
    120.                 Parent = fileGroup, 
    121.                 FileName = @"F:SQLData2005" + databaseName + ".mdf" 
    122.             }; 
    123.             fileGroup.Files.Add(dataFile); 
    124.             //指定数据库日志文件细节 
    125.             LogFile logFile = new LogFile 
    126.             { 
    127.                 Name = databaseName + "_log", 
    128.                 Parent = database, 
    129.                 FileName = @"F:SQLData2005" + databaseName + ".ldf" 
    130.             }; 
    131.             database.FileGroups.Add(fileGroup); 
    132.             database.LogFiles.Add(logFile); 
    133.             database.Create(); 
    134.             #endregion 
    135.         } 
    136.         /// <summary> 
    137.         /// 利用SMO备份数据库 
    138.         /// </summary> 
    139.         public static void BackupDatabase() 
    140.         { 
    141.             string databaseName = "msdb";//备份的数据库名 
    142.             string bkPath = @"C:";//存放备份后的数据的文件夹 
    143.             //创建ServerConnection的实例 
    144.             ServerConnection connection = new ServerConnection(); 
    145.             //指定连接字符串 
    146.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
    147.             //实例化Server 
    148.             Server server = new Server(connection); 
    149.             #region [创建数据库备份对象] 
    150.             Backup backup = new Backup(); 
    151.             backup.Action = BackupActionType.Database;//完全备份 
    152.             backup.Database = databaseName; 
    153.             backup.BackupSetDescription = "Full backup of master"; 
    154.             backup.BackupSetName = "master Backup"; 
    155.             //创建备份设备 
    156.             BackupDeviceItem bkDeviceItem = new BackupDeviceItem(); 
    157.             bkDeviceItem.DeviceType = DeviceType.File; 
    158.             bkDeviceItem.Name = bkPath+databaseName+".bak"; 
    159.             backup.Devices.Add(bkDeviceItem); 
    160.             backup.Incremental = false; 
    161.             backup.LogTruncation = BackupTruncateLogType.Truncate; 
    162.             backup.SqlBackup(server); 
    163.             #endregion 
    164.         } 
    165.         /// <summary> 
    166.         /// 备份数据库 
    167.         /// </summary> 
    168.         public static void RestoreDatabase() 
    169.         { 
    170.             string databaseName = "SMODemo";//备份的数据库名 
    171.             string bkPath = @"C:";//存放备份后的数据的文件夹 
    172.             //创建ServerConnection的实例 
    173.             ServerConnection connection = new ServerConnection(); 
    174.             //指定连接字符串 
    175.             connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;"; 
    176.             //实例化Server 
    177.             Server server = new Server(connection); 
    178.             Restore restore = new Restore(); 
    179.             restore.NoRecovery = false; 
    180.             restore.NoRewind = false; 
    181.             restore.Action = RestoreActionType.Database; 
    182.             restore.Database = databaseName; 
    183.             //创建备份设备 
    184.             BackupDeviceItem bkDeviceItem = new BackupDeviceItem(); 
    185.             bkDeviceItem.DeviceType = DeviceType.File; 
    186.             bkDeviceItem.Name = bkPath + databaseName + ".bak"; 
    187.             //如果需要重新制定Restore后的数据库的物理文件位置,需要知道数据库文件的逻辑文件名 
    188.             //可以RESTORE FILELISTONLY 来列出逻辑文件名,如果覆盖已有数据库可以通过SMO来获取 
    189.             //因本处使用的是刚刚备份的msdb数据库来Restore,所以其分别为"MSDBData"和"MSDBLog" 
    190.             //如果不指定Restore路径则默认恢复到数据库服务器存放数据的文件夹下 
    191.             RelocateFile relocateDataFile = new RelocateFile { LogicalFileName = "MSDBData", PhysicalFileName = bkPath + databaseName + ".mdf" };//(databaseName + "_data", bkPath + databaseName + ".mdf"); 
    192.             RelocateFile relocateLogFile = new RelocateFile { LogicalFileName = "MSDBLog", PhysicalFileName = bkPath + databaseName + ".ldf" };//(databaseName + "_log", bkPath + databaseName + ".ldf"); 
    193.             restore.Devices.Add(bkDeviceItem); 
    194.             restore.RelocateFiles.Add(relocateDataFile); 
    195.             restore.RelocateFiles.Add(relocateLogFile); 
    196.             restore.SqlRestore(server); 
    197.         } 
    198.     } 
    执行结果在这里就不贴图了,反正是是在周公家里的中文环境和办公室英文环境中测试通过。预先透漏一下,下一篇将讲述如何获取SQL Server的对象的创建SQL语句,比如表、存储过程、函数等。
  • 相关阅读:
    cookie加载不正确的问题
    android多图选择器 图片/视频 单选or多选,以及视频录制。
    Android开发之高仿微信图片选择器
    Glide升级到4.x版本遇到的问题
    v关于使用Glide加载图片失败时显示自己特定的图片
    Java的方法类型
    Java二维数组的应用
    Java中字符串操作的基本方法总结:
    Java冒泡排序
    报错:flutter: Another exception was thrown: Could not find a generator for route RouteSettings
  • 原文地址:https://www.cnblogs.com/Alenliu/p/5046116.html
Copyright © 2020-2023  润新知