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

by vivid 16. 十一月 2011 01:12

.NET Magazine國際中文電子雜誌
作 者:許薰尹
審 稿:張智凱
文章編號:N111111802
出刊日期:2011/11/16

本文延續《.Net Framework 4.5與Visual Studio 11–工具與程式語言新功能》一文的內容來介紹Visual Studio 11 Developer Preview中的Visual Database Tools的使用。

資料存取工具

Visual Studio 11 Developer Preview中的Visual Database Tools可以讓你直接在「Server Explorer(伺服器總管)」工具中連結、建立、刪除、管理SQL Server資料庫,也可以透過它來建立登入(login) 帳號等安全性的設定動作。

新增SQL Server

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

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

clip_image002

圖 1:Add SQL Server。

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

clip_image004

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

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

clip_image006

圖 3:「Server Explorer」工具。

執行DDL或DML查詢

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

clip_image008

圖 4:新增、執行查詢。

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

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

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

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

clip_image010

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

Visual Studio 11 Developer Preview會自動在專案中新增一個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 Developer Preview工具開啟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 Developer Preview會啟動「Generate Database Wizard」,並且產生出建立結構描述資訊的SQL語法,請按下「Finish」按鈕結束這個精靈,參考圖12所示:

clip_image024

圖 12:產生DDL語法。

結束精靈後,專案中會產生一個sql檔案,您可以直接選取「Execute」按鈕執行SQL語法來建立結構描述資訊,參考圖13所示:

clip_image026

圖 13:執行SQL。

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

修改結構描述

和前版Visual Studio 2010有點不太一樣的是,若後續有需要修改結構描述資訊,只能夠在「Server Explorer」的「SQL Server」節點下透過工具提供的功能來進行。若在「Data Connections」節點下,就無法變更結構描述資訊,「Data Connections」節點只能夠修改前版SQL Server 2008的資料庫結構描述資訊,而不能修改SQL Server “Denali”版本的資料庫。因此,若在「Data Connections」下資料庫的資料表上,按滑鼠右鍵,選取「Open Table Definition」項目時,就會出現以下的錯誤訊息,參考圖14所示。

clip_image028

圖 14:「Data Connections」無法修改SQL Server “Denali”版本的資料庫。

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

clip_image030

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

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

clip_image032

圖 16:Update Database。

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

clip_image034

圖 17:Preview Database Update。

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

clip_image036

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

Visual Studio 11 Developer Preview會自動在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:LocalDBDemo" mc:Ignorable = "d" x:Class = "LocalDBDemo.MainWindow"
        Title = "MainWindow" Height = "350" Width = "525" Loaded = "Window_Loaded" >
    <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" ItemsSource = "{Binding}" Margin = "58,43,80,80" 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.cs檔案中也會自動產生程式碼,讀取資料庫的內容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace LocalDBDemo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow( )
        {
            InitializeComponent( );
        }

        private System.Data.Objects.ObjectQuery<Employee> GetEmployeesQuery( Model1Container1 model1Container1 )
        {
            System.Data.Objects.ObjectQuery< LocalDBDemo.Employee > employeesQuery = model1Container1.Employees;
            // Returns an ObjectQuery.
            return employeesQuery;
        }

        private void Window_Loaded( object sender, RoutedEventArgs e )
        {

            LocalDBDemo.Model1Container1 model1Container1 = new LocalDBDemo.Model1Container1( );
            // Load data into Employees. You can modify this code as needed.
            System.Windows.Data.CollectionViewSource employeesViewSource = ((System.Windows.Data.CollectionViewSource) (this.FindResource("employeesViewSource")));
            System.Data.Objects.ObjectQuery<LocalDBDemo.Employee> employeesQuery = this.GetEmployeesQuery( model1Container1 );
            employeesViewSource.Source = employeesQuery.Execute( System.Data.Objects.MergeOption.AppendOnly );
        }
    }
}

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

clip_image038

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

連結到mdf檔案

若要在Visual Studio 11 Developer Preview中存取mdf檔案,這個檔案必需轉換為SQL Server "Denali"版本能支援的檔案格式。預設安裝Visual Studio 11 Developer Preview軟體時,會安裝 SQL Server "Denali" Express,Visual Studio 11 Developer Preview的選項設定中可以看到預設的SQL Server實體名稱為「(LocalDB)\v11.0」,參考圖20所示:

clip_image040

圖 20:SQL Server Instance Name。

以本文的範例而言,連結時,在Visual Studio 11 Developer Preview的「Server Explorer」-> 「SQL Server」項目上,按滑鼠右鍵,選取「Add SQL Server」,接著就會看到「Connect to Server」對話盒,在此設定Server Name為「(LocalDB)\v11.0」,LocalDB資料庫引擎是存取SQL Server “Denali” Express資料庫檔案的預設引擎。 (本文撰寫時此版本的SQL Server為Microsoft SQL Server Denali Express版CTP3,內建在Visual Studio 11 Developer Preview版之中) ,參考圖21所示。

clip_image042

圖 21:連結到SQL Server “Denali” Express。

按下「Connect」按鈕後,便可以連接到資料庫,參考圖22所示:

clip_image044

圖 22:連接到資料庫。

在Visual Studio 11 Developer Preview工具「Server Explorer」的「Data Connection」節點要開啟mdf檔案類型的資料庫時,有兩種選擇,暫時與永久開啟mdf檔。暫時開啟的意思是在使用到此連結的專案關閉時,「Data Connection」節點下就會移除這的資料庫連結,若永久開始的話,表示下回開啟Visual Studio 11 Developer Preview工具時,這個連結項目會依舊存在。

若在「Server Explorer」的「Data Connection」節點要暫時地連結到mdf資料庫檔案,則可以點選滑鼠右鍵,從突顯式選單中選取「Add Connection」項目,參考圖23所示:

clip_image046

圖 23:「Add Connection」。

在「Change Data Source」對話盒中選取「Microsoft SQL Server Database File」,按下「OK」按鈕,參考圖24所示。

clip_image048

圖 24:選取資料來源。

在「Add Connection」對話盒中,點選「Browse」按鈕選取欲開啟的mdf檔案,然後按下「OK」按鈕以附加資料庫,參考圖25所示。

clip_image050

圖 25:選取資料庫檔案。

若要永久開啟檔案類型的mdf資料庫,則在「Add Connection」對話盒中,將「Data Source」設定為「Microsoft SQL Server」;將Server Name設定為「(LocalDB)\V11.0」,然後設定「Attach a database file」為欲開啟的mdf檔案,參考圖26所示。

clip_image052

圖 26:使用附加功能連接到資料庫。

Tags:

NET 開發 | 許薰尹Vivid Hsu | .NET Magazine國際中文電子雜誌

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List