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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
在上一篇周公简单讲述了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("\tFileGroup 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("\t\tDataFile 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("\tLogFile 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语句,比如表、存储过程、函数等。














本文转自周金桥51CTO博客,原文链接: http://blog.51cto.com/zhoufoxcn/873470 ,如需转载请自行联系原作者


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
13天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
30天前
|
SQL Perl
PL/SQL编程基本概念
PL/SQL编程基本概念
13 0
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
23天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
13天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
78 6
|
1天前
|
SQL 关系型数据库 MySQL
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
6 0
|
8天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
19 0
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
17天前
|
SQL 数据安全/隐私保护
SQL Server 2016安装教程
SQL Server 2016安装教程
19 1
|
17天前
|
SQL 安全 Java
SQL server 2017安装教程
SQL server 2017安装教程
15 1