在上一篇周公简单讲述了SMO的一些基本概念,实际上SMO体系结构远不止周公在上一篇中讲述的那么简单,下图是MSDN上给出的一个完整的结构图:
上图是一个完整的涉及到各种关系的结构图。不过它们之间的层次结构关系周公已经在上一篇做了简单概述。
在本篇中周公还是在上一篇的基础上再做稍微深入一点的介绍,在本篇中主要讲述如何获取数据库常见对象信息,并且如何利用SMO来进行一些日常操作:如创建Login,创建数据库、备份数据库和还原数据库。执行上面这些操作的SQL语句也许我们已经写过,下面我们来看看利用SMO来操作的代码将如何写。为了便于理解,在代码中的注释比较详尽,所以本篇中代码之外的讲解就不多了。
另外,需要注意的是SMO的dll的版本随着升级变化比较大,这一点不同.NET Framework,没有考虑向下兼容。 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo.RegisteredServers;//在microsoft.sqlserver.smo.dll中
using Microsoft.SqlServer.Management.Smo;//需添加microsoft.sqlserver.smo.dll的引用
using Microsoft.SqlServer.Management.Common;//需添加microsoft.sqlserver.connectioninfo.dll的引用
namespace SSISStudy
{
/// <summary>
/// SQL Server编程些列文章(2):SMO常用对象的有关操作
/// 作者:周公
/// 创建日期:2012-05-23
/// 博客地址:http://blog.csdn.net/zhoufoxcn http://zhoufoxcn.blog.51cto.com
/// 新浪微博地址:http://weibo.com/zhoufoxcn
class SMODemo02
{
/// <summary>
/// 显示数据库常见对象信息示例,本方法中的代码只针对9.0版本的SMO dll(SQL2005附带程序集)
/// </summary>
public static void ShowSMOObjects()
{
Console.WriteLine("Server Group Information");
foreach (ServerGroup serverGroup in SmoApplication.SqlServerRegistrations.ServerGroups)
{
Console.WriteLine("Group Name:{0},Path:{1},ServerType:{2},State:{3},Urn:{4}", serverGroup.Name, serverGroup.Path, serverGroup.ServerType, serverGroup.State, serverGroup.Urn);
}
Console.WriteLine("Registered Server Information");
foreach (RegisteredServer regServer in SmoApplication.SqlServerRegistrations.RegisteredServers)
{
Console.WriteLine("Server Name:{0},Login:{1},State:{2},Urn:{3}", regServer.Name, regServer.Login, regServer.State, regServer.Urn);
}
//创建ServerConnection的实例
ServerConnection connection = new ServerConnection();
//指定连接字符串
connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;";
//实例化Server
Server server = new Server(connection);
Console.WriteLine("ActiveDirectory:{0},InstanceName:{1}", server.ActiveDirectory, server.InstanceName);
//下面列出每个数据库的具体信息
foreach (Database db in server.Databases)
{
Console.WriteLine("Database Name:{0},ActiveDirectory:{1},ActiveConnections:{2},DataSpaceUsage:{3},PrimaryFilePath:{4}", db.Name, db.ActiveDirectory, db.ActiveConnections, db.DataSpaceUsage, db.PrimaryFilePath);
//列出数据库的数据文件文件组信息
foreach (FileGroup fileGroup in db.FileGroups)
{
Console.WriteLine("\tFileGroup Name:{0},Size:{1},State:{2},Urn:{3}", fileGroup.Name, fileGroup.Size, fileGroup.State, fileGroup.Urn);
//列出每个文件组中的数据文件信息
foreach (DataFile dataFile in fileGroup.Files)
{
Console.WriteLine("\t\tDataFile Name:{0},Size:{1},State:{2},Urn:{3},FileName:{4}", dataFile.Name, dataFile.Size, dataFile.State, dataFile.Urn, dataFile.FileName);
}
}
//列出数据库日志文件信息
foreach (LogFile logFile in db.LogFiles)
{
Console.WriteLine("\tLogFile Name:{0},Size:{1},State:{2},Urn:{3},FileName:{4}", logFile.Name, logFile.Size, logFile.State,logFile.Urn,logFile.FileName);
}
}
}
/// <summary>
/// 利用SMO创建SQL登录
/// </summary>
public static void CreateLogin()
{
string loginName = "zhoufoxcn";//要创建的数据库登录名
string loginPassword = "C#.NET";//登录密码
//创建ServerConnection的实例
ServerConnection connection = new ServerConnection();
//指定连接字符串
connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;";
//实例化Server
Server server = new Server(connection);
#region [创建数据库登录对象]
//检查在数据库是否已经存在该登录名
var queryLogin = from Login temp in server.Logins
where string.Equals(temp.Name, loginName, StringComparison.CurrentCultureIgnoreCase)
select temp;
Login login = queryLogin.FirstOrDefault<Login>();
//如果存在就删除
if (login != null)
{
login.Drop();
}
login = new Login(server, loginName);
login.LoginType = LoginType.SqlLogin;//指定登录方式为SQL认证
login.PasswordPolicyEnforced = true;
login.DefaultDatabase = "master";//默认数据库
login.Create(loginPassword);
#endregion
}
/// <summary>
/// 利用SMO创建数据库
/// </summary>
public static void CreateDatabase()
{
string databaseName = "SMODemo";
//创建ServerConnection的实例
ServerConnection connection = new ServerConnection();
//指定连接字符串
connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;";
//实例化Server
Server server = new Server(connection);
#region [创建数据库对象]
//检查在数据库是否已经存在该数据库
var queryDatabase = from Database temp in server.Databases
where string.Equals(temp.Name, databaseName, StringComparison.CurrentCultureIgnoreCase)
select temp;
Database database = queryDatabase.FirstOrDefault<Database>();
//如果存在就删除
if (database != null)
{
database.Drop();
}
database = new Database(server, databaseName);
//指定数据库数据文件细节
FileGroup fileGroup = new FileGroup { Name = "PRIMARY", Parent = database, IsDefault = true };
DataFile dataFile = new DataFile
{
Name = databaseName + "_data",
Parent = fileGroup,
FileName = @"F:\SQLData2005\" + databaseName + ".mdf"
};
fileGroup.Files.Add(dataFile);
//指定数据库日志文件细节
LogFile logFile = new LogFile
{
Name = databaseName + "_log",
Parent = database,
FileName = @"F:\SQLData2005\" + databaseName + ".ldf"
};
database.FileGroups.Add(fileGroup);
database.LogFiles.Add(logFile);
database.Create();
#endregion
}
/// <summary>
/// 利用SMO备份数据库
/// </summary>
public static void BackupDatabase()
{
string databaseName = "msdb";//备份的数据库名
string bkPath = @"C:\";//存放备份后的数据的文件夹
//创建ServerConnection的实例
ServerConnection connection = new ServerConnection();
//指定连接字符串
connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;";
//实例化Server
Server server = new Server(connection);
#region [创建数据库备份对象]
Backup backup = new Backup();
backup.Action = BackupActionType.Database;//完全备份
backup.Database = databaseName;
backup.BackupSetDescription = "Full backup of master";
backup.BackupSetName = "master Backup";
//创建备份设备
BackupDeviceItem bkDeviceItem = new BackupDeviceItem();
bkDeviceItem.DeviceType = DeviceType.File;
bkDeviceItem.Name = bkPath+databaseName+".bak";
backup.Devices.Add(bkDeviceItem);
backup.Incremental = false;
backup.LogTruncation = BackupTruncateLogType.Truncate;
backup.SqlBackup(server);
#endregion
}
/// <summary>
/// 备份数据库
/// </summary>
public static void RestoreDatabase()
{
string databaseName = "SMODemo";//备份的数据库名
string bkPath = @"C:\";//存放备份后的数据的文件夹
//创建ServerConnection的实例
ServerConnection connection = new ServerConnection();
//指定连接字符串
connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;";
//实例化Server
Server server = new Server(connection);
Restore restore = new Restore();
restore.NoRecovery = false;
restore.NoRewind = false;
restore.Action = RestoreActionType.Database;
restore.Database = databaseName;
//创建备份设备
BackupDeviceItem bkDeviceItem = new BackupDeviceItem();
bkDeviceItem.DeviceType = DeviceType.File;
bkDeviceItem.Name = bkPath + databaseName + ".bak";
//如果需要重新制定Restore后的数据库的物理文件位置,需要知道数据库文件的逻辑文件名
//可以RESTORE FILELISTONLY 来列出逻辑文件名,如果覆盖已有数据库可以通过SMO来获取
//因本处使用的是刚刚备份的msdb数据库来Restore,所以其分别为"MSDBData"和"MSDBLog"
//如果不指定Restore路径则默认恢复到数据库服务器存放数据的文件夹下
RelocateFile relocateDataFile = new RelocateFile { LogicalFileName = "MSDBData", PhysicalFileName = bkPath + databaseName + ".mdf" };//(databaseName + "_data", bkPath + databaseName + ".mdf");
RelocateFile relocateLogFile = new RelocateFile { LogicalFileName = "MSDBLog", PhysicalFileName = bkPath + databaseName + ".ldf" };//(databaseName + "_log", bkPath + databaseName + ".ldf");
restore.Devices.Add(bkDeviceItem);
restore.RelocateFiles.Add(relocateDataFile);
restore.RelocateFiles.Add(relocateLogFile);
restore.SqlRestore(server);
}
}
}
执行结果在这里就不贴图了,反正是是在周公家里的中文环境和办公室英文环境中测试通过。预先透漏一下,下一篇将讲述如何获取SQL Server的对象的创建SQL语句,比如表、存储过程、函数等。
2012-05-23
周公
分享到:
相关推荐
阅读《Microsoft SQL Server 2008技术内幕:T-SQL查询》,可以充分地理解T-SQL语言和良好的编程实践,学会如何编写更加有效而强大的查询语句。 序言 I 致谢III 前言 V 第1章 逻辑查询处理 1.1 逻辑查询处理的...
为了实现上述功能,你需要在项目中引用Microsoft.SqlServer.Smo和Microsoft.SqlServer.SqlManagementUtils库。在压缩包文件"SQL Server数据库备份与恢复"中,可能包含了详细的C#代码示例,你可以参考这些示例来理解...
SQLServer API,全称为Microsoft SQL Server应用程序编程接口,是微软公司提供的一种用于访问和操作SQL Server数据库的强大工具。它允许开发者使用不同的编程语言,如C++, C#, Java, VB.NET等,来创建、管理和维护...
SMO类库提供了丰富的接口和类,例如`Microsoft.SqlServer.Management.Smo.Agent.Job`代表一个作业,`Microsoft.SqlServer.Management.Smo.Agent.Server`则代表SQL Server实例。开发者可以通过这些类的属性和方法来...
这个“sqlserver 接口保姆”可能是一个专为新手设计的工具或教程,旨在帮助初学者更好地理解和使用SQL Server的API(应用程序编程接口)进行数据操作。下面我们将详细探讨SQL Server接口及其相关知识点。 1. SQL ...
然后在开发环境中,通过添加引用的方式引入`Microsoft.SqlServer.Smo`和`Microsoft.SqlServer.ConnectionInfo`等命名空间。 3. **连接到SQL Server** 使用SMO,可以通过创建`Server`对象并设置其`ConnectionString...
- 主要类层次结构包括:`Microsoft.SqlServer.Management.Smo`命名空间,其中包含服务器、数据库、表、视图等对象。 2. **服务器对象** - `Server`类是SMO中的顶级对象,代表SQL Server实例。 - 可以通过`Server...
SQL Server Express 是独立软件供应商 (ISV)、服务器用户、非专业开发人员、Web 应用程序开发人员、网站宿主以及客户端应用程序编程爱好者的理想之选。 未及时包括在本自述文件中的任何有关 SQL Server Express 的...
首先,需要在项目中引用`Microsoft.SqlServer.Smo`和`Microsoft.SqlServer.ConnectionInfo`库。 以下是一个简单的C#代码示例,展示如何使用SMO创建一个完整数据库备份: ```csharp using Microsoft.SqlServer....
在IT领域,尤其是在数据库管理和开发中,C#是一种常用的编程语言,用于与SQL Server进行交互。本篇文章将详细探讨如何使用C#中的SQL Server Management Objects(SMO)库来获取本地SQL服务器列表,同时对比旧有的SQL...
10. **Management Objects (SMO)**:一组.NET Framework类库,用于编程SQL Server的管理任务。 在安装SQL Server 2008 Client时,会根据用户的需求选择安装这些组件。这些工具极大地提高了SQL Server管理员和开发...
这个部分涵盖了新的编程接口,如SQL Server Management Objects (SMO) 和Integration Services,以及T-SQL的增强,如CLR集成,这使得开发者可以直接在数据库中使用.NET Framework的类库。此外,它还讨论了数据库引擎...
1. **SQL Server Management Objects (SMO)**:这是微软提供的一个.NET Framework类库,用于管理和操作SQL Server实例。利用SMO,我们可以创建、修改和删除数据库对象,以及执行T-SQL语句。批量执行脚本时,可以创建...
第2章 使用SQL Server 2008管理工具 SQL 2008完全学习手册 视频教程 第3章 管理数据库 SQL 2008完全学习手册 视频教程 第4章 SQL Server 2008数据表管理 SQL 2008完全学习手册 视频教程 第5章 操作架构、索引和视图 ...
《SQL Server 2008高级程序设计》由世界顶尖SQL Server权威专家Robert Vieira编写,旨在指导您熟练运用一系列日趋复杂的功能,助您更高效地管理数据。 本书首先介绍SQL Server 2008的新功能,然后在更详实的示例...
这个库的核心组件是`Microsoft.SqlServer.Management.Smo`,它包含了大量类,这些类代表了SQL Server的各种对象,如Database、Table、Index等,并提供了操作这些对象的方法。 首先,要使用SMO,你需要在项目中引用...
$server = New-Object Microsoft.SqlServer.Management.Smo.Server("服务器名\实例名") $server.Databases | Select-Object Name ``` 以上就是获取SQL Server所有数据库名称的基本方法。在实际应用中,可以根据...
"SqlServer备份源码"指的是用于自动执行SQL Server数据库备份的编程代码,这通常涉及到SQL Server Management Objects (SMO) 或 Transact-SQL (T-SQL) 脚本。下面我们将深入探讨SQL Server备份的相关知识点。 1. **...
在标题中提到的"SQLDMO.SQLServer对象操作数据库源码",这通常意味着提供了一个使用易语言编写的程序,该程序能够实例化SQLDMO中的SQLServer对象,通过这个对象与SQL Server建立连接,并进行各种数据库操作。...