Microsoft Visual Studio .NET 包括一系列工具和数据访问类,使通过 Microsoft SQL Server? 2000 生成数据库应用程序比以前更加轻易。现在,开发人员所需的所有工具都包含在 Visual Studio 集成开发环境 (IDE) 中。本白皮书将介绍新的工具和数据类,引导您完成生成数据库应用程序的整个过程,并重点介绍对 SQL Server 2000 新增功能(例如 xml 支持、索引视图和级联引用完整性)的支持。本文还包括一个简单的 Microsoft Visual Basic 应用程序,用于阐明如何使用这些工具。
前提条件
要生成本文中的示例应用程序,您的计算机上必须安装以下软件:
Microsoft windows 2000 Server Visual Studio .NET(有些示例程序注明需要使用 Visual Studio .NET EnterPRise Edition) SQL Server 2000 Enterprise Edition 还需要使用数据库所有者 (dbo) 权限登录 SQL Server。
可视化数据库工具
Visual Studio .Net IDE 包含一套可视化数据库工具,旨在简化使用 SQL Server 2000 开发数据库应用程序。可视化数据库工具包含以下各项:
服务器资源治理器 数据库设计器 表设计器 SQL 编辑器 查询和视图设计器
以下各节将具体介绍这些工具。
服务器资源治理器
服务器资源治理器是可视化数据库工具以及多数其他工具和设计器的门户。使用服务器资源治理器,您可以连接到 SQL Server 数据库并查看带有 SQL Server 计算机、数据库关系图、表、视图、存储过程和函数等节点的分层结构树状视图。许多开发人员以前需要使用 SQL Server 企业治理器才能完成的任务,现在可以使用服务器资源治理器来完成,而无需再使用企业治理器。
要打开服务器资源治理器,请启动 Visual Studio .NET,然后在 View(视图)菜单中单击 Server EXPlorer(服务器资源治理器)。
第一次打开服务器资源治理器时,会看到两个节点,如图 1 所示。第一个节点 Data Connections(数据连接)列出了计算机上以前创建的所有数据库连接。第二个节点 Servers(服务器)列出了当前网络上的所有服务器。Servers(服务器)节点下有一个名为 SQL Servers(SQL 服务器)的节点,使用该节点可以访问可视化数据库工具而无需创建数据连接。创建数据连接后,也可以通过 Data Connections(数据连接)节点访问可视化数据库工具。
Cascade Update Related Fields(级联更新相关字段)- 在主键更新后,使数据库将新键值传播到相应的外键。
Cascade Delete Related Records(级联删除相关的记录)- 删除主键表中的行时,使数据库从外键表中删除相应的行。
3、选择 Cascade Delete Related Records(级联删除相关的记录),单击 Close(关闭),然后单击 Save(保存)。设置此选项将使 SQL Server 从 ServiceCall 表中删除与从 Customers 表中删除的每行的 CustomerID 匹配的所有行。
注重:系统将显示一个 Save Warning(保存警告)对话框,其中显示消息“以下各表将保存到数据库中。是否继续?”。将列出 Customers 表和 ServiceCall 表。单击 Yes(是)。显示保存警告信息是因为打开了 Warn about Tables Affected(表受到影响时警告)选项;您可以在 Save Warning(保存警告)对话框中关闭此选项。
图 7:选中了 Cascade Delete Related Records(级联删除相关的记录)的 Relationships(关系)选项卡
在服务器资源治理器中,依次展开 ServiceCall Data Connection(ServiceCall 数据连接)节点和 Tables(表)节点并右键单击一个表,然后单击 Retrieve Data from Table(从表中检索数据)。 与表内容一同出现的数据网格就是查询设计器数据网格。请注重,一个工具栏将与数据网格一同打开,该工具栏可用于访问关系图窗格、SQL 窗格、网格窗格以及查询设计器的结果窗格。同样,这些功能也非常类似于企业治理器中的功能。
调试存储过程
服务器资源治理器中另外一个强大的功能是存储过程调试。要调试 BrowseInvoiceTotals 存储过程,请打开服务器资源治理器,然后定位到 ServiceCall 连接中的 Stored Procedure(存储过程)节点。右键单击 BrowseInvoiceTotals,然后单击 Step Into Stored Procedure(单步执行存储过程)。也可以双击存储过程打开编辑器,然后单击 Database(数据库)菜单中的 Step Into Stored Procedure(单步执行存储过程)。
按 F11 键单步执行存储过程,并注重当执行到语句 Set @TotalInvoice = dbo.ComputeServiceCallTotal(50, 5, 200) 时,调试器将离开存储过程并进入该函数。完成函数的调试后,调试器将返回存储过程。可以将鼠标指针移到 @TotalInvoice 变量之上,或者右键单击该变量并设置一个观察变量,以查看该变量的内容。也可以在 Locals(本地变量)窗口中查看变量的内容:在 Debug(调试)菜单中,突出显示 Windows(窗口),然后单击 Locals(本地变量)。在图 11 中,执行 Set 语句后,Locals(本地变量)窗口中显示 @TotalInvoice 的值为 450.0000。同样,从 Visual Studio .NET IDE 中也可以访问 Transact-SQL 语句调试工具。
ADO.NET 提供两种托管提供程序:一种用于 SQL Server 数据库,另一种用于任何 OLE DB 兼容数据库。到目前为止,我们创建的所有示例都使用了 SQL Server 托管提供程序。假如查看工具箱中 Data(数据)下的选项,您会注重到三对名称相同但前缀不同的控件。下表列出了这三对控件。 SQL ServerOLE DB SqlDataAdapter OLEDBDataAdapterSqlDataConnectionOLEDBDataConnection SqlCommandOLEDBCommand 前缀为 OLEDB 的控件表示 OLE DB 托管提供程序,可用于访问所有与 OLE DB 兼容的数据库。这些控件与当前的 ADO 对象类似,但已被改写为托管代码,因而可以在 .NET Framework 中使用。
前缀为 SQL 的控件表示 SQL Server 托管提供程序,只能用于 SQL Server。与其 OLE DB 的对应控件相比,这些控件具有一些优点。首先,这些对象使用本地表格数据流 (TDS) 接口以获得最佳性能。OLE DB 对象所需的其他接口层已被删除,这使数据库的访问速度更快。其次,从这些控件中创建的 SQL 对象具有其他一些方法,这些方法利用了专用于 SQL Server 的功能。这为使用 SQL Server 进行设计和编程提供了更大的灵活性。
我们在前面创建的示例应用程序中使用了 ADO.NET,而 Visual Studio .NET 为我们处理了大多数编码工作,我们所要做的就是通过 IDE 的用户界面配置数据集和数据适配器。现在,让我们看看使用 ADO.NET 从表中选择、插入、更新和删除数据时所需的 Microsoft Visual Basic? .NET 编码。首先看一下 Select 语句的代码:
Dim strCmdText As String Dim rowsProcessed As Integer Dim CustomerDS As New DataSet() strCmdText = "Select * from Customers" Dim SqlDataAdapter2 As New SqlDataAdapter(strCmdText, _ "Data Source=localhost;Initial Catalog=ServiceCall;User ID=sa;passsword=yourpassword") SqlDataAdapter2.Fill(CustomerDS, "Customers") 在此代码示例中,我们首先定义了要使用的变量和对象,其中包括 CustomersDS,它是一个 ADO.NET DataSet 对象。然后我们定义了查询,该查询将填充变量 strCmdText 中的数据集。下一步,我们定义一个 ADO.NET SqlDataAdapter 对象 (SqlDataAdapter2),将查询和数据库连接字符串作为参数提供。请注重,我们使用的是 SQL Server ADO.NET 托管提供程序。最后,通过调用 SqlDataAdapter 对象的 Fill 方法,填充 CustomerDS 并在名为 Customers 的 DataSet 中创建一个表。
因为 SqlDataAdapter2 是使用查询和连接串字符串定义的,所以 Fill 方法将建立到 SQL Server 数据库的连接、执行查询并将结果返回到 DataSet。
下一步,我们将看一看在表中插入行的代码:
Dim strCmdText As String Dim rowsProcessed As Integer Dim sqlConn As New SqlConnection _ ("Data Source=localhost;Initial Catalog=ServiceCall;User ID=sa;password=yourpassword") strCmdText = "INSERT INTO Customers VALUES ('Cust4', 'Customer Four', " _ & "'Cust4 Address', 'City', 'ST', '11111','(888)-123-4567')" Dim sqlCmd As New SqlCommand(strCmdText, sqlConn) sqlCmd.Connection.Open() rowsProcessed = sqlCmd.ExecuteNonQuery() 我们首先定义将要使用的对象和变量。然后创建一个 ADO.NET SqlConnection 对象 (sqlConn),并将连接字符串作为参数传递给该对象。然后定义查询,该查询将行插入到变量 strCmdText 中的 Customers 表中。
Dim strCmdText As String Dim rowsProcessed As Integer Dim sqlConn As New SqlConnection _ ("Data Source=localhost;Initial Catalog=ServiceCall;User ID=sa;password=yourpassword") strCmdText = "Update Customers Set CustomerName = 'Updated Customer' " _ & "Where CustomerID = 'Cust4'" Dim sqlCmd As New SqlCommand(strCmdText, sqlConn) sqlCmd.Connection.Open() rowsProcessed = sqlCmd.ExecuteNonQuery() 以下代码将删除表中的一行。
Dim strCmdText As String Dim rowsProcessed As Integer Dim sqlConn As New SqlConnection _ ("Data Source=localhost;Initial Catalog=ServiceCall;User ID=sa") strCmdText = "Delete Customers Where CustomerID = 'Cust4'" Dim sqlCmd As New SqlCommand(strCmdText, sqlConn) sqlCmd.Connection.Open() rowsProcessed = sqlCmd.ExecuteNonQuery() 这些示例展示了如何使用 SqlCommand 对象的 ExecuteNonQuery 方法。SqlCommand 对象还具有其他几个方法,包括专用于 SQL Server 处理 XML 数据的方法。在下一个示例中,我们将介绍它的工作原理。 QQRead.com 推出数据恢复指南教程 数据恢复指南教程 数据恢复故障解析 常用数据恢复方案 硬盘数据恢复教程 数据保护方法 数据恢复软件 专业数据恢复服务指南 XML 和 Visual Studio .NET
SQL Server 2000 具有对 XML 的内置支持。其中一个功能是 Select 语句中的 For XML 子句,它返回一个作为 XML 的结果集。SqlCommand 对象具有 ExecuteXMLReader 方法,此方法利用 SQL Server 中的这一功能。
下一个示例将展示 SqlCommand 对象的另一个应用。我们将查询 Customers 表,将结果作为 XML 返回,然后在窗体的文本框中显示该 XML。
3、双击该按钮打开单击事件的代码窗口,然后添加以下代码。请记住更改数据源、用户 ID 和密码,使其与您的服务器匹配。
Dim XMLTxtReader As Xml.XmlTextReader Dim StringBuilder As New System.Text.StringBuilder() Dim XMLOutput As String Dim SQLCommand As New System.Data.SqlClient.SqlCommand() Dim SQLServiceCallConn As New _ System.Data.SqlClient.SqlConnection _ ("Data Source=YourServer;Initial Catalog=ServiceCall;User ID=xx;password=yourpassword") SQLServiceCallConn.Open() SQLCommand.Connection = SQLServiceCallConn SQLCommand.CommandType = CommandType.Text SQLCommand.CommandText = "Select CustomerID, CustomerName," _ & "Phone from Customers for XML auto" ' 执行 SQL 并返回 XML XMLTxtReader = SQLCommand.ExecuteXmlReader() StringBuilder.Append(XMLTxtReader.GetRemainder.ReadToEnd) XMLOutput = StringBuilder.ToString() Me.TextBox1.Text = XMLOutput 您的代码窗口应类似与图 22 所示(数据源、用户 ID 和密码可能会有所不同)。
在此代码示例中,我们首先定义要使用的对象和变量。XMLTextReader 对象用于保存从数据库返回的数据。StringBuilder 对象用于根据 XMLTextReader 对象中的数据创建 XML 字符串。
首先,我们创建一个 SqlConnection 对象 (SQLServiceCallConn) 并传入数据库的连接参数。然后,设置 SqlCommand 对象 (SqlCommand) 的 CommandType 属性和 CommandText 属性。请注重,我们在查询中使用了 For XML Auto 语句。它指示 SQL Server 将查询结果作为 XML 字符串返回。
然后,使用 SqlCommand 对象的 ExecuteXmlReader 方法来执行我们的 Transact-SQL 语句。此方法旨在利用 SQL Server 2000 的本地 XML 支持并返回一个 XMLTextReader 对象。最后一步是使用 StringBuilder 对象从 XMLTextReader 对象中提取一个包含从 SQL Server 返回的 XML 的字符串。
在前面的示例中,我们讨论了 SQL Server 对 XML 的内置支持,有时也称其为 SQLXML。SQLXML 3.0 包含以下托管类,可以简化 SQLXML 在 Visual Studio .NET 中的使用。
类说明SqlXmlCommand 对象将 XML 数据从 SQL Server 返回到一个新的或现有的 Stream 对象,或将数据返回到一个 XMLReader 对象。此对象还包含一个用于创建参数的方法。 SqlXmlParameter 对象用于填充使用 SqlXMLCommand 对象创建的参数。 SqlXmlAdapter 对象用 SQL Server 中的 XML 数据填充数据集。此对象还将更新应用于数据集中的 SQL Server 数据。 这些托管类答应您通过多种方法处理 SQL Server 中的 XML 数据,包括:
执行 SQL 查询以返回 XML 数据
对 XML 数据应用 XSL 转换
对 XML 数据执行 XPath 查询
对于最后一个示例应用程序,我们将扩展以前的示例,使用 SQLXML 托管类返回 SQL 查询中的 XML 数据。
重要信息:必须安装 SQLXML 3.0 才能运行此示例应用程序。SQL Server 2000 Web Services 工具包附带了 SQLXML 3.0,也可以从 SQLXML and XML Mapping Technologies(英文)下载 SQLXML 3.0。 必须将 SQLXML 组件引用添加到项目中后才能使用 SQLXML 托管类。
7、打开 Form3.vb,在该窗体中 GetXML 按钮旁边添加一个新按钮,然后将新按钮的 Name 属性和 Text 属性更改为 SQLXML。
8、双击 SQLXML 按钮打开单击事件的代码窗口并添加以下代码。请记住更改数据源、用户 ID 和密码,使其与您的服务器匹配。
Dim strm As System.IO.Stream Dim sqlXmlCmd As New Microsoft.Data.SqlXml.SqlXmlCommand _ ("Provider=SQLOLEDB;Data Source=localhost;" _ & "Initial Catalog=ServiceCall;User ID=sa;password=yourpassword") sqlXmlCmd.CommandType = Microsoft.Data.SqlXml.SqlXmlCommandType.Sql sqlXmlCmd.CommandText = ("Select CustomerID, CustomerName," _ & "Phone from Customers for XML auto") strm = sqlXmlCmd.ExecuteStream() Dim streamRdr As New System.IO.StreamReader(strm) Me.TextBox1.Text = streamRdr.ReadToEnd().ToString 在此代码示例中,我们首先定义要使用的对象和变量。Stream 对象 (strm) 将保存从查询返回的 XML 数据。然后,定义 SqlXmlCommand 对象 (sqlXmlCmd),并将连接字符串作为参数传递给该对象。
1、在服务器资源治理器中的 Data Connections(数据连接)下,展开 Tables(表)节点,右键单击 Customers 表,然后单击 Generate Create Scripts(生成创建脚本)。假如使用的不是 Windows 2000 或者 Windows NT 的集成安全性,系统可能会提示您为运行 SQL Server 的计算机提供用户 ID 和密码。将打开 Generate Create Scripts(生成创建脚本)对话框(使用过 SQL Server 企业治理器的用户应该对此对话框非常熟悉)。
2、该对话框包含三个选项卡:General(常规)、Formatting(设置格式)和 Options(选项)。接受这三个选项卡的默认设置,然后单击 OK(确定)。将打开 Browse for Folder(浏览文件夹)对话框。请注重,Visual Studio .NET 已经选择了前面创建的数据库项目中的 Create Scripts 文件夹。
本文中的示例演示了 Visual Studio .NET IDE 中内置的数据库工具的强大功能。无需退出 Visual Studio .NET IDE 即可生成完整的应用程序,其中包括数据库、用户定义函数、存储过程和应用程序代码。此外,我们还能使用 Visual Studio .NET IDE 中包含的同样丰富的调试工具,在存储过程上执行源代码级别的调试。Visual Studio .NET 为您提供了更快、更好地创建应用程序所需的工具。
Use ServiceCall Insert into Customers values('cust1','Customer One','123 Main St.','Chicago','IL','60601','(312) 555-1212') Insert into Customers values('cust2','Customer Two','248 Elm St.','Serverville','IL','60679','(872) 555-4519') Insert into Customers values('cust3','Customer Three','831 First St.','Netville','IL','60831','(763) 555-6728')