2012年3月13日 星期二

.Net Framework 4.5與Visual Studio 11–資料存取工具

 

此篇文章改寫原刊於 .NET Magazine的文章,原文是使用Visual Studio 11 Developer Preview版工具撰寫的,本文改用Visual Studio 11 Beta工具測試,重新抓圖並修訂部分工具的差異。原文URL:

http://blogs.uuu.com.tw/Articles/post/2011/11/16/Net-Framework-45%E8%88%87Visual-Studio-11%E2%80%93%E8%B3%87%E6%96%99%E5%AD%98%E5%8F%96%E5%B7%A5%E5%85%B7.aspx

本文撰寫時使用的工具是Visual Studio 11 Beta,資料庫則為SQL Server 2012 Express版,因此本文探討的內容在正式版上市時可能不適用。

本文延續《.Net Framework 4.5與Visual Studio 11–工具與程式語言新功能》一文的內容來介紹Visual Studio 11 Beta中的SQL Server Object Explorer的使用。

 

資料存取工具

Visual Studio 11 Beta中的SQL Server Object Explorer可以讓你直接在此工具中連結、建立、刪除、管理SQL Server資料庫,也可以透過它來建立登入(login) 帳號等安全性的設定動作。

 

新增SQL Server

SQL Server Object Explorer工具可以用來連接到資料庫伺服器,並列出資料庫的相關物件。你可能會想到原來的「SQL Server Object Explorer」工具中包含一個「Data Connection」的節點,為何又要有一個SQL Server Object Explorer工具,這兩個項目在使用上有一點點不同。「Data Connection」項目通常是用來搭配Visual Studio 11 Beta設計應用程式來使用,而SQL Server Object Explorer工具則是用來管理資料庫伺服器,它的功能比較類似之前管理SQL Server 2008時所使用的「SQL Server Management Studio」工具。

 

讓我們先來了解一下SQL Server Object Explorer工具的功能,透過它,您可以新增想要管理的SQL Server到此工具進行管理作業。只要在Visual Studio 11的「View」-「SQL Server Object Explorer」選項開啟工具,然後點選「SQL Server」項目,按滑鼠右鍵,從突顯式選單中選取「Add SQL Server」項目,參考圖1所示:

clip_image002

圖 1:Add SQL Server。

接著便會出現「Connect to Server」對話盒,在「Connect to Server」對話盒中設定要連結的伺服器名稱,底下的圖示展示連接到本機SQL Server 2012 Express版的資料庫設定,設定好伺服器名稱為「.\Sqlexpress」後,按下「Connect」按鈕進行連接,參考圖2所示。

clip_image004

圖 2:連接到本機SQL Server 2012 Express版的資料庫。

連結到資料庫之後,在「SQL Server Object Explorer」工具中,你便可以看到一個類似之前「SQL Server Management Studio」管理畫面的操作界面,可以透過它來檢視、管理資料庫物件,或進行資料查詢的動作,參考圖3所示。

clip_image006

圖 3: 「SQL Server Object Explorer」工具。

 

執行DDL或DML查詢

若要執行資料庫的DDL或DML動作,參考圖4所示,你可以先在「SQL Server Object Explorer」視窗 -> SQL Server伺服器項目上方,點選滑鼠右鍵,從突顯式選單中選取「New Query」項目,接著輸入DDL或DML語法後,按上方Execute按鈕執行(有一個三角型和驚嘆號的圖示)。

clip_image008

圖 4:新增、執行查詢。

 

建立資料存取程式與mdf資料庫檔案

服務架構資料庫(Service-Based Database)指的是一種附檔名為mdf的資料庫檔案。在Visual Studio 11 Beta版本中建立的Service-Based資料庫檔案是屬於SQL Server 2012版本的資料庫,預設將會使用LocalDB引擎來進行存取。SQL Server 2012 提供一個LocalDB版本,資料庫預設的實體名稱為「(LocalDB)\v11.0」。LocalDB是專門為程式開發人員設計階段使用的資料庫版本,提供類似SQL Server Express版本的T-SQL功能,以及程式開發介面,但好處是更容易安裝與管理。LocalDB安裝之後,相關的組件放在C:\Program Files\Microsoft SQL Server\110\LocalDB\Binn 目錄中。

Visual Studio 11 Beta版本開發工具建立資料存取程式與mdf檔案型資料庫的動作很簡單,我們以一個WPF應用程式來說明。在Visual Studio 11 Beta建立一個新的WPF應用程式類型專案,選取Visual Studio 11 Beta的「File」->「New 」->「Project」,選取「Visual Basic」程式語言,然後選取「WPF Application」項目,建立一個WPF應用程式。

選取「Project」-> 「Add New Item」,加入一個「Service-Based Database」項目,本文範例中將它命名為MyDB.mdf檔案,然後按下「Add」按鈕,參考圖5所示。

clip_image010

圖 5:新增服務架構資料庫。

Visual Studio 11 Beta會自動在專案中新增一個MyDB.mdf檔案,並且啟動「Data Source Configuration Wizard」,您可以使用DataSet (ADO.NET)或Entity Data Model (ADO.NET實體資料模型) 來連接到資料庫。在本文的範例中展示使用ADO.NET實體資料模型,因此這個步驟選取了「Entity Data Model」,參考圖6所示:

clip_image012

圖 6:使用Entity Data Model連接到資料庫。

按下「Next」按鈕後,會進入「Entity Data Model Wizard」的「Choose Model Contents」對話盒,您可以選取要使用來設計資料存取程式所需的模型,本例選取的是「Empty Model」,接著按下「Finish」按鈕,建立一個空白的模型,以便先將資料模型設計好,然後再利用資料模型來產生資料庫的結構描述資訊,參考圖7所示:

clip_image014

圖 7:新增Empty Model。

下一步是設計資料模型,以存放員工的編號、姓名與年齡的資料。這部分的設計動作跟前版Visual Studio 2010沒什麼太大的差別。在Visual Studio 11 Beta工具開啟Model1.edmx設計畫面,從「Toolbox」拖曳一個Entity項目到設計畫面。預設Entity的名稱為「Entity1」,在設計畫面雙擊「Entity1」項目會進入編輯畫面,以便修改名稱。本文的範例將Entity1改名為「Employee」,並利用屬性視窗將EntitySetName設定為「Employees」,參考圖8所示。

clip_image016

圖 8:設定Entity。

接著利用屬性視窗將Employee Entity的第一個屬性名稱設定為「EmpID」,EmpID預設的StoredGeneratedPattern屬性設為「Identity」,表示其為自動編號欄位,參考圖9所示。

clip_image018

圖 9:設定Entity Property。

在Employee Entity中,若要新增屬性,點選設計畫面上的Employee Entity,按滑鼠右鍵,選擇「Add New」->「Scalar Property」,參考圖10所示。

clip_image020

圖 10:新增Scalar Property。

利用上述的步驟,本文範例中新增了EmpName屬性,型別為「string」;Age屬性,型別為「Int32」。下一步便是產生資料庫的結構描述資訊,點選設計畫面上的Employee Entity,按滑鼠右鍵,選擇「Generate Database from Model」,參考圖11所示:

clip_image022

圖 11:從模型產生資料庫結構資訊。

Visual Studio 11 Beta會啟動「Generate Database Wizard」:

clip_image024

圖 12:Generate Database Wizard。

並且產生出建立結構描述資訊的SQL語法,請按下「Finish」按鈕結束這個精靈,參考圖13所示:

clip_image026

圖 13:產生DDL語法。

結束精靈後,專案中會產生一個sql檔案。按Connect按鈕連接到資料庫:

clip_image028

圖 14:連接到資料庫。

接下來會跳出「Connect to Server」視窗:

clip_image030

圖 15:「Connect to Server」視窗

選取資料庫檔案:

clip_image032

圖 16:選取資料庫檔案

刪掉有問題SQL語法 (算是Beta工具的Bug嗎?)

clip_image034

圖 17:刪掉有問題SQL語法。

選取「Execute」按鈕執行SQL語法來建立結構描述資訊,參考圖18所示:

clip_image036

圖 18:執行SQL。

執行完資料表就建好了。

當結構描述資訊建立後,你可以使用「Server Explorer」->「Data Connection」,在資料庫的Employees資料表,按滑鼠右鍵,選取「Show Table Data」,進入資料編輯畫面來輸入資料。

clip_image040

圖 19:編輯測試資料。

或者是在「SQL Server Object Explorer」->「SQL Server」,在資料庫的Employees資料表,按滑鼠右鍵,選取「View Data」來編輯測試資料,不管使用哪種方式叫出畫面,編輯視窗是同一個。

修改結構描述

若後續有需要修改結構描述資訊,可以在「Server Explorer」或「SQL Server Object Explorer」工具來進行,一樣會跳出相同的編輯畫面。

舉例來說,若要修改EmpName欄位的長度,可以在「SQL Server Object Explorer」-> 「Databases」,找到資料庫節點,再選取「Tables」->「Employees」資料表,按滑鼠右鍵選取「View Designer」項目,進入編輯畫面,參考圖20所示:

clip_image042

圖 20:設計結構描述資訊。

修改欄位長度為「nvarchar(20)」,然後點選設計畫面上方向上箭頭(Update Database)來修改資料庫結構,參考圖21所示:

clip_image044

圖 21:Update Database。

接下來Visual Studio 11 Beta會顯示「Preview Database Updates」對話盒,其中包含異動的相關資訊,你可以按下「Update Database」按鈕將這些結構的異動寫回資料庫,參考圖22所示。

clip_image046

圖 22:Preview Database Update。

若使用「Server Explorer」工具,操作方式雷同。在Employee上按滑鼠右鍵,選「Open Table Definition」畫面,修改欄位之後,再按「Update」。

clip_image048

圖 23:Update

和前版的Visual Studio 2010一樣,若要設計資料存取程式,將資料庫資料取出後,顯示在WPF視窗上,可以利用「Data Sources」視窗。從Visual Studio 11 Beta工具的「Data」-> 「Show Data Sources」,開啟「Data Sources」視窗,其中將會列出先前加入的ADO.NET Entity Framework的資料模型,以本例而言,名稱為「Model1Container1」,其下便包含Employees Entity,將其拖曳到WPF MainWindow設計畫面,參考圖24所示:

clip_image050

圖 24:使用拖曳建立資料繫結應用程式介面。

Visual Studio 11 Beta會自動在MainWindow.xaml產生資料繫結語法,並利用一個Grid控制項來顯示資料,參考以下自動建立的XAML檔:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApplication5" mc:Ignorable="d" x:Class="MainWindow"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <CollectionViewSource x:Key="EmployeesViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Employee}, CreateList=True}"/>
    </Window.Resources>
    <Grid DataContext="{StaticResource EmployeesViewSource}">
        <DataGrid x:Name="EmployeesDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Margin="44,45,65,67" RowDetailsVisibilityMode="VisibleWhenSelected">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="EmpIDColumn" Binding="{Binding EmpID}" Header="Emp ID" Width="SizeToHeader"/>
                <DataGridTextColumn x:Name="EmpNameColumn" Binding="{Binding EmpName}" Header="Emp Name" Width="SizeToHeader"/>
                <DataGridTextColumn x:Name="AgeColumn" Binding="{Binding Age}" Header="Age" Width="SizeToHeader"/>
            </DataGrid.Columns>
        </DataGrid>

    </Grid>
</Window>


除了XAML之外,MainWindow.xaml.vb檔案中也會自動產生程式碼,讀取資料庫的內容:

Class MainWindow

    Private Function GetEmployeesQuery(Model1Container As Model1Container) As System.Data.Objects.ObjectQuery(Of WpfApplication5.Employee)
        Dim EmployeesQuery As System.Data.Objects.ObjectQuery(Of WpfApplication5.Employee) = Model1Container.Employees
        'Returns an ObjectQuery.
        Return EmployeesQuery
    End Function

    Private Sub Window_Loaded_1(sender As Object, e As RoutedEventArgs) Handles MyBase.Loaded

        Dim Model1Container As WpfApplication5.Model1Container = New WpfApplication5.Model1Container()
        'Load data into Employees. You can modify this code as needed.
        Dim EmployeesViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("EmployeesViewSource"), System.Windows.Data.CollectionViewSource)
        Dim EmployeesQuery As System.Data.Objects.ObjectQuery(Of WpfApplication5.Employee) = Me.GetEmployeesQuery(Model1Container)
        EmployeesViewSource.Source = EmployeesQuery.Execute(System.Data.Objects.MergeOption.AppendOnly)
    End Sub
End Class


此程式的執行結果,參考圖25所示:

clip_image052

圖 25:範例程式執行結果。

沒有留言:

總瀏覽量