好学IT学院:IT信息技术分享交流平台
标签:.NET  来源:enet论坛  作者:Rick-Dobson  发布时间:2006-12-01  ★★★加入收藏〗〖手机版
摘要:【简介】您是否留意过Microsoft提供的新Express套件?您将会发现它们对您的组织或个人大有好处。RickDobson介绍了三个Express套件:VisualBasicExpress、VisualWebDeveloperExpress和SQLServ…

在 Express 套件客户端应用程序中,通常用 AttachDBFileName 参数来为连接字符串指定数据库文件名和路径。Database 或 Initial Catalog 参数的使用是可选的。如果您在连接字符串中将 Database 和 Initial Catalog 参数与 AttachDBFileName 参数一起使用,则不必为该 Database 或 Initial Catalog 参数赋值。对于指向 vsdvbe1sse.mdf 数据库文件的连接字符串,正确的 AttachDBFileName 参数值是 C:\Articles\vsdvbe1\vsdvbe1\ vsdvbe1sse.mdf。

SQL Server Express 也支持不断附加数据库,这对 SQL Server 来说更典型。SQL Server Express 安装过程将 master.mdf 数据库文件附加到它安装的实例上。您也可以使用 T-SQL 技术(例如 sp_attach_db 系统存储过程)来附加任何数据库文件,以不断受 SQL Server Express 实例管理。当使用一个已附加的数据库文件时,请在连接字符串中使用 Database 或 Initial Catalog 参数来表示数据库,而不使用 AttachDBFileName 参数。

下面的代码摘录演示了一种连接到 SQL Server Express 数据库的方法。这段代码适用于 Visual Basic Express,但同样的方法也适用于 Visual Web Developer Express。该示例对 vsdvbe2 项目中的 Form1 上的 Button1 使用 Click 事件过程,以此连接到 vsdvbe1sse.mdf 数据库文件。由于 Button2 的 Click 事件过程对 vsdvwde1sse.mdf 文件执行相同的任务,所以应用程序使用 CNN 类来允许重用两个 Click 事件过程需要的公共代码。通过这种方式,我在项目中添加了对 System.Data 命名空间的引用,因为 Visual Basic Express 不会自动添加该引用。另外,Form1 模块包含一条 Imports 语句,以便 System.Data.SqlClient 命名空间简化引用 SqlClient 类型(例如 System.Data.SqlClient 命名空间中的 SqlConnection 类)的语法。

对于表示 SqlConnection 实例的变量 (cnn1),CNN 类包含两个方法和一个公共声明。用于变量声明的 Public 关键字使得 cnn1 在 CNN 类实例外可用。MakeCNN 方法为 cnn1 指定连接字符串,并返回 SqlConnection 类实例。该方法带有两个参数:一个指定到数据库文件的路径,另一个是数据库文件的名称,包括其扩展名。

Public cnn1 As New SqlConnectionPublic Function MakeCNN( _ ByVal strPathAs String, _ ByVal DBFileName As String) As _ System.Data.SqlClient.SqlConnection Dim strConnection As String strConnection = _ "Data Source = .\sqlexpress;" & _ "Integrated Security = true;" & _ "AttachDBFileName= " & strPath& "\" & _ DBFileName cnn1.ConnectionString= strConnection Return cnn1End Function

第二个 CNN 类方法是由 OpenCNN 函数实现的,它调用 SqlConnection 实例的 Open 方法。该函数需要两个参数:一个用于 SqlConnection 实例,另一个用于不带扩展名的数据库名称。这段代码在 Try...Catch...Finally 语句的 Try 子句内部调用 Open 方法。Try 和 Catch 子句包含用于显示一条消息的语句,这个消息通知用户打开数据库成功或失败。这些子句执行这个非常简单的应用程序需要的所有工作。因此,Finally 子句关闭数据库。

Public Function OpenCnn( _ ByVal cnn1 As SqlConnection, _ ByVal DBName As String) As String Try cnn1.Open() Return (DBName & " opened successfully.") Catch ex As Exception Return (DBName & _ " did not open successfully.") Finally cnn1.Close() End TryEnd Function

回想一下,Button1 的 Click 事件过程中的代码连接到 vsdvbe1sse.mdf 数据库文件。因此,该事件过程首先为指向数据库文件的路径设置一个字符串变量 (strPath)。接下来,代码将 strName 赋值为不带文件扩展名的数据库名称。然后,应用程序使用这些变量作为 CNN 类实例 (MyCNN) 的 MakeCNN 方法的参数。最后,该过程通过使用来自 OpenCNN 方法的 MyCNN 返回值结束。

strPath= "C:\Articles\" & _ "VSDVBE1\VSDVBE1" strName= "vsdvbe1sse" Dim MyCNNAs New CNN cnn1 = MyCNN.MakeCNN(strPath, _ strName+ ".mdf") MessageBox.Show(MyCNN.OpenCnn(cnn1, strName))

Button2 的 Click 事件过程与 Button1 的 Click 事件过程相同。唯一的不同在于 strPath 和 strName 变量所赋的值,它们指向 C:\WebSites\VSDVWDE1\Data 路径中的 vsdvwde1sse.mdf 数据库文件。

以编程方式从远程计算机打开数据库

以编程方式从另一台计算机打开和使用 SQL Server Express 数据库基于并结合了本文前面介绍的技术。另外,此任务需要新元素 — 即,登录到 SQL Server 实例(SQL Server Express 数据库中的一个用户帐户),并且授予该用户帐户一个或多个数据库访问权限。本文前面的所有演示和示例都隐式使用 Windows 管理员帐户。本节显式使用非 Windows 管理员帐户的 Windows 帐户。虽然您在 SQL Server Express 中既可以使用 Windows 帐户也可以使用 SQL Server 帐户,但 Microsoft 明显希望我们使用 Windows 帐户。实际上,SQL Server Express 默认安装时只有 Windows 身份验证,它拒绝任何非 Windows 用户的访问。

由于 SQL Server Express 的默认身份验证,您至少需要创建一个域 Windows 帐户,以便来自远程计算机的用户可以使用该帐户连接到运行 SQL Server Express 的计算机。您还需要为 SQL Server Express 实例授予 Windows 用户登录权限。接下来,需要在数据库中为您创建的登录创建一个用户。最后一步是分配权限,例如为与您的 Windows 用户登录相关的用户帐户分配对一张表的 SELECT 权限。在进行完最后这步设置后,您就可以用您的 Windows 用户帐户登录到远程计算机。接下来就能够以正常方式从远程计算机的客户端应用程序连接到运行 SQL Server Express 的计算机。

vsdvbe2 项目中的 Form1 包含带有 Click 事件过程的 Button3、Button4 和 Button5,从而帮助您测试这些从远程计算机连接到 SQL Server Express 数据库的指南。Click 事件过程假设有一个名为 vsd1 的 Windows 帐户。Button3 的 Click 事件过程设置为允许 vsd1 Windows 用户打开 vsdvbe1sse.mdf 数据库中的 Contacts 表。Button4 的 Click 事件过程删除 vsd1 在 vsdvbe1sse.mdf 数据库中的数据库用户帐户,但该过程保留 vsd1 登录到 SQL Server Express 实例的权限。Button5的 Click 事件过程禁用 vsd1 Windows 帐户登录到 SQL Server Express 实例的权限。

Button3 的 Click 事件过程有两个部分。第一部分授予 vsd1 登录到本地 SQL Server Express 实例的权限。第一部分通过 master.mdf 数据库上下文执行。请注意,连接字符串语法与前面使用的连接字符串略有不同。master.mdf 数据库是不断附加的,因此可以由 Database 参数引用,该参数在引用数据库时不需要数据库文件扩展名(使用 master 而不是 master.mdf)。

另外,在连接字符串中不需要使用 AttachDBFileName 参数。您可以通过调用 sp_grantlogin 系统存储过程来为 SQL Server Express 实例分配 Windows 用户帐户登录权限。该系统存储过程需要一个 Windows 帐户名作为它的参数。该 Windows 帐户名有两个部分,它们之间以反斜杠 (\) 分隔。第一部分是域服务器名,第二部分是 Windows 帐户名。在下面的代码中,cab233a 作为域名,vsd1 作为 Windows 帐户名。这段代码摘录使用 SqlCommand 类实例 (cmd1) 来包含该系统存储过程。SqlCommand 对象的 ExecuteNonQuery 方法运行该系统存储过程。

strPath= "Data Source = .\sqlexpress;" & _ "Integrated Security = true;" & _ "Database = master" cnn2.ConnectionString= strPath cnn2.Open() cmd1.CommandText= _ "sp_grantlogin 'cab233a\vsd1'" cmd1.Connection = cnn2 cmd1.ExecuteNonQuery() cnn2.Close()

Button3 的 Click 事件过程的第二部分在 vsdvbe1sse.mdf 数据库中为 cab233a\vsd1 登录创建一个用户帐户。因此,下面的代码摘录首先连接到 vsdvbe1sse.mdf 数据库。在连接到数据库文件之后,该摘录执行 SqlCommand 对象。SqlCommand 对象包含 T-SQL 指令,用于在 vsdvbe1sse.mdf 数据库中创建一个与 cab233a\vsd1 登录名称相同的用户帐户,并授予该用户帐户对 Contacts 表的 SELECT 权限。

strPath= "C:\Articles\" & _ "VSDVBE1\VSDVBE1" strName= "vsdvbe1sse" cnn1 = MyCNN.MakeCNN(strPath, _ strName+ ".mdf") Try cnn1.Open() cmd1.CommandText= _ "sp_grantdbaccess 'cab233a\vsd1' " & _ "GRANT SELECTON Contacts " & _ "to [cab233a\vsd1]" cmd1.Connection = cnn1 cmd1.ExecuteNonQuery() cnn1.Close() Catch ex As Exception MsgBox(ex.Message) MessageBox.Show( _ "Cannot assign databaseAccess" & _ "at this time.") End Try

Button4 和 Button5 的 Click 事件过程与 Button3 的 Click 事件过程的第二段摘录语法相同。Button4 的 Click 事件过程将其 SqlCommand 对象的 CommandText 属性赋值为 sp_revokedbaccess 'cab233a\vsd1'。此 T-SQL 指令对 vsdvbe1sse.mdf 数据库调用 Access。吊销数据库 Access 会调用删除数据库中对应于 cab233a\vsd1 登录的用户帐户。然而,该用户仍然可以登录到 SQL Server Express 实例。Button5 的 Click 事件过程将其 SqlCommand 对象的 CommandText 属性赋值为 sp_revokelogin 'cab233a\vsd1'。此 T-SQL 指令禁用 vsd1 Windows 帐户在 SQL Server Express 实例中的登录特权。

我从两台远程计算机,用三个不同的客户端应用程序(即 Visual Studio、Visual Studio 2003 和 Access)测试了这些过程。在运行 Button3 的 Click 事件过程之后,就可以从远程计算机上运行的这三个应用程序看到 vsdvbe1sse.mdf 数据库的 Contacts 表中的数据。

  图 6 显示 Visual Studio 客户端应用程序中的 Contacts 数据。您可以在 Visual Studio 中用在 Visual Basic Express 中显示表中数据的相同步骤来显示表中的数据。这些步骤包括右键单击 Database Explorer 中的表名称,然后选择 Show Table Data 项。

7 显示来自 Access 项目的相同数据。这类项目使用 OLE DB(而不是 .NET 数据访问技术)来连接到 SQL Server Express 数据库。从 Access 连接到 SQL Server Express 数据库的方式与从早期 SQL Server 版本连接到任何数据库的方式相同。在连接到数据库之后,Contacts 表作为一个表出现在 Access Database 窗口中。双击 Database 窗口中的表名称将打开表中的数据,如图 7 所示。

  • 好学考试H5触屏版开放内测
  • 好学触屏公众号虎力全开、杨帆起航!