逐步解說:建立自訂資料產生器
開發資料庫「結構描述」(Schema) 時,藉由將盡可能貼近實際執行資料的資料填入測試資料庫,即可以讓提議變更的測試更加有效。 自訂資料產生器提供的測試資料,會比內建資料產生器更精確地符合您的規格。 例如,您可以建立產生器,使用您指定的清單中的隨機字串或是您指定的數字範圍,來填入資料表資料行。 如需詳細資訊,請參閱資料產生器擴充性概觀。
在此逐步解說主題中,您會建立一個可以產生隨機地址字串的自訂資料產生器。 在這個逐步解說中,您將執行下列工作:
建立繼承自 Generator 的自訂地址資料產生器的類別庫。
加入輸出屬性當做產生器輸出來使用。
覆寫 OnGenerateNextValues 方法來產生資料。
簽署產生器組件。
建立與用來註冊組件相關的 XML 檔。
建立「資料庫專案」(Database Project) 和「資料產生計劃」(Data Generation Plan),以測試自訂資料產生器。
必要條件
您必須安裝 Visual Studio Premium 或 Visual Studio Ultimate 才能完成本逐步解說。
建立自訂資料產生器的類別庫
首要步驟時建立自訂地址資料產生器的類別庫。
若要建立自訂資料產生器的類別庫
建立 Visual C# 類別庫,並將其命名為 SampleGenerator。
在 [方案總管] 中,以滑鼠右鍵按一下專案,然後按一下 [加入參考]。
按一下 [.NET] 索引標籤。
在 [元件名稱] 欄中,選取下列元件:
Microsoft.Data.Schema
Microsoft.Data.Schema.Sql
Microsoft.Data.Schema.Tools
秘訣 若要選取多個元件,請在按一下時同時按住 CTRL。
當完成選取所需的全部元件後,按一下 [確定]。
選取的參考將出現在 [方案總管] 中專案的 [參考] 節點底下。
在 [程式碼] 視窗上方的類別宣告之前,加入以下程式碼行:
using Microsoft.Data.Schema.Tools.DataGenerator; using Microsoft.Data.Schema.Extensibility; using Microsoft.Data.Schema; using Microsoft.Data.Schema.Sql;
將此類別從 Class1 重新命名為 AddressGenerator。
警告
根據預設,您提供給類別的名稱即為 [資料行詳細資料] 視窗中出現在 [產生器] 資料行中清單內的名稱。 您應該指定不會與內建產生器名稱或另一個自訂產生器名稱發生衝突的名稱。
public class AddressGenerator { }
指定您的類別繼承自 Generator,如下列範例所示:
public class AddressGenerator : Generator { }
加入 DatabaseSchemaProviderCompatibilityAttribute,如以下範例所示:
[DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))] public class AddressGenerator : Generator { }
如需擴充相容性屬性的詳細資訊,請參閱擴充 Visual Studio 的資料庫功能。
在 [檔案] 功能表上按一下 [全部儲存]。
將輸出屬性加入至產生器
在上一個章節中,您會建立一個繼承自 Generator 類別的類別庫。 在本章節中,您會將輸出屬性加入至類別。 輸出屬性包含所產生的資料值。 輸出屬性也會指定這個產生器可以產生的資料型別。
若要加入輸出屬性
建立成員變數,其將用來產生地址,如下列範例所示。
_address 變數將用於輸出屬性的後續步驟中。
private Random _random; private string _street; private string _city; private string _state; private int _zipCode; private string _address; private static readonly List<String> _states = new List<string>() { "AK", "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY" };
建立 _random 成員變數的私用屬性,如下列範例所示:
private Random Random { get { if (_random == null) _random = new Random(base.Seed); return _random; } }
建立 _address 成員變數的公開屬性,並且將 OutputAttribute 加入至其中,如下列範例所示:
[Output(Description = "Generates street and city values of \"2150 Newton Street, San Francisco\", with random state and zip code.", Name = "Address")] public string Address { get { return this._address; } }
在 [檔案] 功能表上按一下 [全部儲存]。
覆寫 OnGenerateNextValues 方法
Visual Studio 會呼叫每一個產生器的 OnGenerateNextValues 方法,以取得所需的每一個值集。 當您建立資料產生器時,您應該覆寫這個方法來提供邏輯,該邏輯會針對每一個輸出屬性產生值。
若要覆寫 OnGenerateNextValues 方法
覆寫 OnGenerateNextValues 方法,如以下範例所示:
protected override void OnGenerateNextValues() { this._street = "2150 Newton Street"; this._city = "San Francisco"; this._state = _states[Random.Next(0, _states.Count)]; this._zipCode = Int32.Parse(String.Format("{0}{1}{2}{3}{4}", GetRandomDigit(1), GetRandomDigit(), GetRandomDigit(), GetRandomDigit(), GetRandomDigit())); this._address = String.Format("{0}, {1}, {2} {3}", _street, _city, _state, _zipCode); }
加入下列方法,其可用於建立 _zipcode 變數的值:
private int GetRandomDigit() { return GetRandomDigit(0); } private int GetRandomDigit(int lowNumber) { return Random.Next(lowNumber, 10); }
在 [檔案] 功能表上按一下 [全部儲存]。
簽署產生器
接下來,您必須以強式名稱簽署自訂資料產生器。
若要以強式名稱簽署產生器
按一下 [專案] 功能表上的 [SampleGenerator 屬性]。
選取 [簽署] 索引標籤上的 [簽署組件] 核取方塊。
在 [選擇強式名稱金鑰檔] 方塊中,按一下 [<新增>]。
[建立強式名稱金鑰] 對話方塊隨即出現。
在 [金鑰檔名稱] 方塊中,輸入 SampleGeneratorKey。
輸入並確認密碼,然後按一下 [確定]。
當您建置方案時,會使用金鑰檔來簽署組件。
在 [檔案] 功能表上按一下 [全部儲存]。
在 [建置] 功能表上,按一下 [建置方案]。
您已經建立自訂資料產生器。
註冊產生器組件
您的組件完成簽署和編譯之後,下一步就是收集專案中產生的組件資訊,包括版本、文化特性和 PublicKeyToken,以利於註冊自訂產生器組件。
若要收集組件資訊
按一下 [檢視] 功能表上的 [其他視窗],然後按一下 [命令視窗] 開啟 [命令視窗]。
在 [命令] 視窗中輸入下列程式碼。 將 FilePath 替代為已編譯之 .dll 檔案的路徑和檔案名稱。 請在路徑和檔案名稱周圍加上引號。
注意事項 根據預設,已編譯之 .dll 檔案的路徑為 SampleGenerator\bin\Debug。
? System.Reflection.Assembly.LoadFrom(@"<FilePath>").FullName
按 ENTER。 該行應該看起來如下,其中含有您的特定 PublicKeyToken:
" SampleGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn"
標記或複製此組件資訊;此資訊將用於下一個程序。
接下來,您將使用在上一個程序中收集的組件資訊來建立 XML 檔案。
若要建立 XML 檔
在 [方案總管] 中,選取 [SampleGenerator] 專案。
在 [專案] 功能表中選取 [加入新項目]。
在 [範本] 窗格中,找出並選取 [XML 檔] 項目。
在 [名稱] 文字方塊中輸入 SampleGenerator.Extensions.xml,然後按一下 [加入] 按鈕。
SampleGenerator.Extensions.xml 檔會加入至 [方案總管] 中的專案。
注意事項 您必須使用您的 dll 名稱 (在此例中為 "SampleGenerator" 後面接著 ".Extensions.xml"),組件才能正確註冊。
開啟並更新 SampleGenerator.Extensions.xml 檔,以與下列 XML 相符。 取代您在前面程序擷取的組件版本、文化特性和 PublicKeyToken。
注意事項 擴充功能型別必須使用類別的完整名稱。 在此情況下:擴充功能型別="SampleGenerator.AddressGenerator"。
<?xml version="1.0" encoding="utf-8"?> <extensions assembly="" version="1" xmlns="urn:Microsoft.Data.Schema.Extensions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd"> <extension type="SampleGenerator.AddressGenerator" assembly="SampleGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/> </extensions>
按一下 [檔案] 功能表上的 [全部儲存]。
接下來,您會將組件和 XML 檔複製到 Extensions 目錄。 當 Visual Studio Premium 啟動時,它會識別和註冊 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions 目錄和子目錄中的任何擴充功能,以在工作階段中使用。
若要複製並註冊組件和 XML 檔到 Extensions 目錄
在 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ 目錄中建立名為 CustomGenerators 的資料夾。
將 SampleGenerator.dll 組件檔從 ProjectFolder\SampleGenerator\SampleGenerator\bin\Debug\ 目錄複製到您剛才建立的 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators 資料夾中。
將 SampleGenerator.Extensions.xml 檔從 ProjectFolder\SampleGenerator\SampleGenerator\ 目錄複製到您剛才建立的 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators 目錄中。
注意事項 最佳做法是將擴充組件置於 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions 目錄中的資料夾。 此策略有助您識別哪些擴充功能已包含在產品中,哪些是自訂建立的。 您也應考慮將擴充功能組織到特定類別的資料夾中。
測試地址產生器
您已經建立了地址資料產生器,您必須啟動 Visual Studio 的新執行個體。 當 Visual Studio 啟動時,它會註冊您已加入至 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators 目錄中的 SampleGenerator 組件。 然後,您可建立資料庫專案,您可在其中驗證地址資料產生器正確運作。
若要建立資料庫專案
啟動 Visual Studio 的新執行個體,其會識別和註冊 SampleGenerator.dll 組件。
在 [檔案] 功能表中,指向 [新增],然後按一下 [專案]。
[新增專案] 對話方塊隨即出現。
展開 [已安裝的範本] 底下的 [資料庫] 節點,然後按一下 [SQL Server] 節點。
在範本清單中,按一下 [SQL Server 2008 資料庫專案]。
在 [名稱] 中,輸入 SampleGeneratorDB。
注意事項 如果您已完成逐步解說:為檢查條件約束建立自訂資料產生器中的所有步驟,您即已建立 SampleGeneratorDB 專案,而可以跳至步驟 9。
選取 [為方案建立目錄] 核取方塊。
接受 [位置]、[方案名稱] 和 [加入至原始檔控制] 的預設值,然後按一下 [確定]。
按一下 [確定]。
新的資料庫專案 SampleGeneratorDB 會出現在 [方案總管] 中。
按一下 [檢視] 功能表上的 [資料庫結構描述檢視]。
[結構描述檢視] 隨即出現 (如果尚未出現)。
接下來,您會將簡單資料表加入至專案,其中包含 varchar SQL 類型的單一資料行。
若要將資料表加入至資料庫專案
在 [結構描述檢視] 中依次展開 [SampleGeneratorDB] 節點、[結構描述] 節點和 [dbo] 節點,然後按一下 [資料表] 節點。
按一下 [專案] 功能表上的 [加入新項目]。
注意事項 您也可以用滑鼠右鍵按一下 [結構描述檢視] 中的 SampleGeneratorDB 專案,然後指向 [加入],再按一下 [資料表]。
按一下 [範本] 中的 [資料表]。
注意事項 在 [分類] 清單中按一下 [資料表和檢視],可讓您更容易找到資料表的範本。
在 [名稱] 中,輸入 Addresses 當做要提供給新資料表的名稱。
按一下 [加入],將此資料表加入至資料庫專案中。
[方案總管] 會顯示此資料表在資料庫專案中的新檔案。 [結構描述檢視] 會顯示新的資料表物件。 Transact-SQL 編輯器隨即出現,並且會顯示新資料表的定義。
在 Transact-SQL 編輯器中修改資料表定義,使其符合下列範例:
CREATE TABLE [dbo].[Addresses] ( address varchar(100) )
在 [檔案] 功能表上,按一下 [儲存 Addresses.table.sql]。
資料表就緒時,您現在可設定部署的資料庫。
若要進行專案部署設定
在 [方案總管] 中,按一下 SampleGeneratorDB (此為專案而不是方案)。
按一下 [專案] 功能表上的 [SampleGeneratorDB 屬性]。
專案的 [屬性] 視窗隨即出現。
注意事項 您也可以用滑鼠右鍵按一下 [方案總管] 中的 SampleGeneratorDB,然後按一下 [屬性]。
按一下 [部署] 索引標籤。
在 [部署動作] 中,按一下 [建立部署指令碼 (.sql) 並部署到資料庫]。
按一下 [編輯] 按鈕,指定目標連接。
指定您要將 SampleGeneratorDB 資料庫部署到其中之資料庫伺服器的連接資訊。
在 [選取或輸入資料庫名稱] 中,輸入 SampleGeneratorDB。
按一下 [確定]。
即會將此連接字串填入 [目標連接] 中。 請注意,[目標資料庫名稱] 會設定為 SampleGeneratorDB。
接受其他選項的預設值。
在 [檔案] 功能表上,按一下 [儲存選取項目]。
即會儲存您的專案建置設定。
接下來,您要建置資料庫專案。
若要建置資料庫專案
在 [建置] 功能表上,按一下 [建置方案]。
即會建置資料庫專案。 如果成功的話,狀態列中會出現訊息 [建置成功],而且 [輸出] 視窗中會顯示建置結果。
接下來,您要部署資料庫專案。
若要將資料庫專案部署至資料庫伺服器
在 [方案總管] 中,按一下 SampleGeneratorDB (此為專案而不是方案)。
按一下 [建置] 功能表上的 [部署 SampleGeneratorDB]。
即會使用您在建置組態中所指定的連接來部署資料庫專案。 「部署成功」訊息會出現在狀態列和 [輸出] 視窗中。
建立和設定資料產生計劃
接下來,您要建立資料產生計劃。 資料產生計劃會包含您想要將資料填入其中之資料表和資料行的相關資訊。 如需詳細資訊,請參閱 HOW TO:建立資料產生計劃。
若要建立和設定資料產生計劃
在 [方案總管] 中,選取 [資料產生計劃] 節點。
按一下 [專案] 功能表上的 [加入新項目]。
在 [分類] 窗格中,按一下 [資料產生計劃]。
在 [範本] 窗格中,按一下 [資料產生計劃]。
在 [名稱] 文字方塊中,輸入 SampleGenerator.dgen。
按一下 [加入]。
即會建立資料產生計劃。 資料產生計劃隨即出現。
資料產生計劃視窗會水平分割成兩個窗格。 上方窗格會列出資料庫專案結構描述中所定義的資料表,在此情況下為 dbo.Addresses 資料表。 下方窗格會針對在上方窗格中反白顯示的資料表顯示資料行詳細資料,在此情況下為地址資料行。
注意事項 如果沒有開啟 [資料產生預覽] 視窗,您可以透過開啟 [資料] 功能表、指向 [資料產生器],然後按一下 [預覽資料產生],開啟此視窗。 根據預設,[資料產生預覽] 視窗會停駐在資料產生計劃視窗的底部,並以索引標籤形式出現。 若要展開檢視,請按一下此視窗,然後按一下 [視窗] 功能表上的 [索引標籤式文件]。 您也可以用滑鼠右鍵按一下標題列,然後按一下 [停駐做為索引標籤式文件]。
在 SampleGenerator.dgen 設計工具中,驗證已同時核取 [dbo.Addresses] 資料表和 [地址] 資料行。
在 SampleGenerator.dgen 設計工具中,選取地址資料行,然後按一下 [產生器] 下拉式清單來選取 [AddressGenerator]。
您的自訂地址產生器現在已正確地設定。
在 [檔案] 功能表上按一下 [全部儲存]。
執行資料產生計劃來產生地址資料
最後,您可執行資料產生器計劃,並且可以查看動作中的自訂地址資料產生器。
若要執行資料產生計劃
在 [方案總管] 中按一下 [SampleGenerator.dgen]。
注意事項 此資料產生計劃也必須開啟; 如果此計劃尚未開啟,請先將它開啟。
指向 [資料] 功能表上的 [資料產生器],然後按一下 [產生資料]。
[連接至資料庫] 對話方塊隨即出現。
在 [資料產生連接資訊] 清單中,按一下 [SampleGeneratorDB] 資料庫,然後按一下 [確定]。
當系統提示您是否要在插入新的資料列之前,清除資料表的內容時,請按一下 [是]。
資料隨即產生。 在擴展視窗中,狀態資料行會隨著資料產生的狀態更新。 狀態列會摘要列出所有資料表的資料產生。
(選擇性) 使用不同的工具來登入資料庫。 在這個步驟中,您可以使用 Visual Studio Premium 所提供的 Transact-SQL 編輯器。 如需詳細資訊,請參閱 Microsoft 網站上的使用 Transact-SQL 編輯器編輯資料庫指令碼和物件。
執行下列查詢來檢視新的資料:
use SampleGeneratorDB select * from dbo.Addresses
[結果] 索引標籤應隨機顯示具有州名和郵遞區號值的地址。
後續步驟
Visual Studio Premium 和 Visual Studio Ultimate 包含 DateTime 產生器,可以與具有檢查條件約束要求日期位於某個範圍中的資料行搭配使用,方法是使用產生器的 Min 和 Max 屬性。 在逐步解說:為檢查條件約束建立自訂資料產生器中,您可建立自訂資料產生器,用於具有檢查條件約束要求日期位於兩個不同範圍之其中一個範圍的資料行。
請參閱
工作
參考
Microsoft.Data.Schema.Tools.DataGenerator
概念
其他資源
Editing Database Scripts and Objects with the Transact-SQL Editor