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')