SQL Server 管理对象

  • 格式:docx
  • 大小:104.41 KB
  • 文档页数:21

SQL Server 管理对象

SMO 基础知识

列举服务器

连接到服务器

列举数据库

发出 DDL 或 DML 命令

遍历对象列表

备份数据库

恢复数据库

验证数据库备份

结束语

数据库开发人员不仅必须查询和处理数据,还必须定期执行管理任务。SQL Server™ 管理对象 (SMO) 为开发人员提供了强大的工具集,用于备份和恢复数据库,以及发出数据定义语言 (DDL) 命令等操作。通过使用 SQL SMO,您还可以连接到 SQL Server,遍历数据库对象的集合,并对其执行各种任务。 在本期专栏中,我将介绍如何使用 SMO 来检查数据库对象并执行各种管理任务。具体而言,我将介绍如何设计您的项目以使用

SMO 以及如何连接到服务器等主题。我还将介绍一个对数据库发出

DDL 或数据操作语言 (DML) 命令的示例应用程序。最后,我将演示如何使用 SMO 来执行数据库备份、恢复和备份验证。

SMO 基础知识

SMO 是一种 Microsoft® .NET Framework 对象库,可让您管理一个或多个数据库服务器。其目的在于使用 SQL Server 2005 引入的新功能,但它还将连接到支持各自旧版功能的 SQL Server

2000 数据库。但是,部分 SMO 的类、属性和方法只能与 SQL

Server 2005 配合使用才能支持诸如 SQL Service Broker 和快照隔离之类的新功能。

虽然基于 COM 的 SQL 分布式管理对象 (SQL-DMO) 仍附带有 SQL Server 2005,但是它未经更新,不能像 SMO 一样可直接访问最新的 SQL Server 2005 功能。设计管理 SQL Server 数据库的 .NET 应用程序时,建议您优先选择 SQL SMO,而不推荐使用具有 DMO 的 COM interop。您还应当考虑升级目前使用 DMO

的应用程序,以转而使用 SMO。

您可在安装 Microsoft® SQL Server 2005 时勾选“安装客户端工具”选项来安装 SMO。然后在创建即将使用 SMO 的项目时,应首先引用适当的程序集。您必须引用的两个主要 DLL 是

Microsoft.SqlServer.Smo.dll 和

Microsoft.SqlServer.ConnectionInfo.dll。前者包含核心 SMO 类(如数据库、服务器、备份和恢复),而后者包含有助于管理与 SQL

Server 对象之间的连接的类库。在许多情况下,您还需要引用

Microsoft.SqlServer.SqlEnum.dll 和

Microsoft.SqlServer.SmoEnum.dll,其中前者主要包含有用的枚举;后者提供用于以编程方式访问统一资源名称 (URN) 地址的 Urn 类,URN 地址用于唯一标识 Microsoft SQL Server 对象。

列举服务器

您可使用 SMO 来检索网络上安装的 SQL Server 列表。您可指定参数,以控制是在网络上还是仅在本地搜索 SQL Server。SmoApplication 类提供了一种名为 EnumAvailableSqlServers 的静态方法。如果传递的 Boolean 值为 true,该方法将仅搜索和返回所有本地服务器。如果向本方法传递的值为 false,则该方法将搜索网络上的所有可用服务器。以下代码将获取网络上 SQL Server 的实例列表,并将其返回至 DataTable:

DataTable dtServers =

SmoApplication.EnumAvailableSqlServers(false);

foreach (DataRow row in dtServers.Rows)

{ string sqlServerName = row[“Server”].ToString();

if (row[“Instance”] != null && row[“Instance”].ToString().Length >

0)

sqlServerName += @”” + row[“Instance”].ToString();

}

它随后将遍历 DataTable 各行并格式化 SQL Server 及其实例(如果存在实例)的名称。遗憾的是,本方法不大可靠,原因是它依赖于结合了超时的 UDP 广播,因此可能会得到不一致或不完整的结果。

连接到服务器

以下几个示例均为《MSDN® 杂志》网站上可供下载或浏览的应用程序的一部分。当使用 SMO 构建应用程序时,首先执行的步骤之一通常是连接到 SQL Server 实例。这里没什么特别之处;建立连接需要您传递 SQL Server 的名称(如果存在多个实例,还需要其实例名称)以及登录凭据。如果想使用 Windows® 身份验证建立连接,您可使用 SMO 指定这种方式。但如果想使用 SQL 身份验证建立连接,则必须传递有效的登录名和密码。

图 1 显示了一个示例应用程序,其中用户可输入 SQL Server

实例名称和他的凭据。在本图中,我输入了一个实例化的 SQL Server 的名称,并告诉它使用 Windows 身份验证连接到服务器。当我单击“连接”按钮时,便会填充数据库列表。

图 1通过 SMO 连接到服务器

我在示例应用程序中创建一个名为 SMOHelper 的类,以协助提供我的应用程序将用到的一些通用例程。SMOHelper 类的实例可用于和单个 SQL Server 交互。该实例拥有一个构造函数,负责接受通过 Windows 或 SQL Server 身份验证连接到服务器所需的信息。图 2 显示了负责获取和设置适当类属性的 SMOHelper 构造函数,此类的方法将使用类属性来执行数据库操作。

Figure2接受服务器连接信息

public SMOHelper(string serverAndInstanceName,

string userName, string password,

bool useWindowsAuthentication)

{

this.server = new Server();

int slashPos = serverAndInstanceName.IndexOf(‘’);

if (slashPos >= 0)

{

this.serverName = serverAndInstanceName.Substring(0,

slashPos);

this.instance = serverAndInstanceName.Substring(slashPos +

1);

}

else

{

this.serverName = serverAndInstanceName; this.instance = string.Empty;

}

erName = userName;

this.password = password;

eWindowsAuthentication = useWindowsAuthentication;

}

通过创建 Server 类的实例并设置其 ConnectionContext 类的属性来建立与服务器的连接。图 3 所示代码根据用户在窗体中选择的身份验证类型来设置连接。当您可以显式调用 ConnectionContext

的 Connect 方法时,这实际上并不是必需的,因为 SMO 会自动从池中调用和释放连接。有关详细信息,请参见

/mwories/archive/2005/05/02/smoconnections.aspx。

Figure3连接到服务器

public void Connect()

{

server.ConnectionContext.ServerInstance =

ServerAndInstanceName;

server.ConnectionContext.LoginSecure =

useWindowsAuthentication;

if (!eWindowsAuthentication) {

server.ConnectionContext.Login = erName;

server.ConnectionContext.Password = this.password;

}

// server.ConnectionContext.Connect();

}

列举数据库

一旦连接到服务器,可通过 Server 对象的 Databases 属性检索该服务器上的数据库列表。在我的示例应用程序中,我使用了数据绑定,将此服务器上的数据库列表绑定到一个组合框控件上。我遍历了 DatabaseCollection 并创建了一个 List 来包含这些数据库的名称。随后将本列表绑定到组合框控件中,用户可以在此选择其中一个数据库并对其执行操作。以下代码段会遍历数据库并生成名称字符串的列表。

public List GetDatabaseNameList()

{

List dbList = new List();

foreach (Database db in server.Databases)

dbList.Add();

return dbList;

} 在以上显示的代码段中,我只想得到一个数据库名称的列表,因此我只创建了一个 List。但也可同样轻易地将组合框控件与自定义类的列表(如 List)绑定在一起,该列表包含通常由许多 SMO 方法返回的多功能对象。

发出 DDL 或 DML 命令

SMO 与 类似,可用于在数据库上执行命令,使用标准 DML 检索或修改数据。尽管 SMO 未得到优化,不可处理复杂的 DML,但是仍可用于执行简单的 DML 语句。

图 1 中的窗体显示了一个文本框,用户可在其中输入 DML 或

DDL 语句并执行该语句。如果查询应检索行集合(即 SELECT 语句),SMO 将通过其 ExecuteWithResults 方法检索此行集合。否则,如果命令不返回行集合(INSERT、UPDATE 或 DELETE),SMO 将使用其 ExecuteNonQuery 方法执行命令。以下代码示例执行了一次查询并将行集合返回至 DataSet 中。DataSet

随后被绑定到窗体中的 DataGridView:

DataSet ds = db.ExecuteWithResults(txtSQL.Text);

dgvResults.DataSource = ds.Tables[0];

下一个代码段将对数据库对象执行一条无返回结果的命令。

db.ExecuteNonQuery(sql);