2011年7月10日 星期日

Visual Studio 2010 T4 Text Templates 與 SqlExector 整合

在先前的分享中有提到以下兩個部份:
1. Visual Studio 2010 T4 Text Templates - 文字範本與程式碼產生
2. Visual Studio 2010 SqlExector - 快速執行.sql檔案

現在我將兩個工具進行了一些整合,並將整合後的結果更能應用在實際的程式開發上,以下就是這整個概念的說明

1. 在SQL Server上建立如下的資料庫與包含的資料表


2. 在Visual Studio 2010中,建立一個空白的Web Application(C#)專案,並建立如下圖的資料夾結構


3. 編輯專案中的Web.Config檔案,加入你需要連線的資料庫連結字串


4. 接下來會使用到的功能就是這次整合好的成果.

5. 滑鼠右鍵選取SQL這個資料夾並選擇新增項目,在視窗中可看到一個新的分類"Likol",選擇"Sql Text Template"項目,並修改檔案名稱為"ProductCategory.tt".


6. 完成後會出現資料表的選擇畫面,先選擇稍早鎖建立的資料庫連線設定,並選擇"ProductCategory"這個資料表


7. 重複5的步驟,但這次選擇的新增項目改為"Data Text Template",並一樣選擇"ProductCategory"這個資料表




8. 重複5,6,7步驟,但資料表的部份選擇"Product"

9.上述步驟完成後可看到如下圖的畫面


10. 接下來我們在SQL這個資料夾使用右鍵選擇,並選取SqlExector來執行由Text Template所產生的SQL Script






11. 執行完成後,我們可以在資料庫中看到,相關資料異動的Store Procedure都已經建立完成.


12. 現在,我們就可以使用由"Data Text Template"所產生的相關資料表操作,來進行程式的撰寫.我建立了如下的程式界面與程式

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <table>
            <tr>
                <td colspan="2"><b>Create</b></td>
            </tr>
            <tr>
                <td><asp:TextBox ID="txtName" runat="server" /></td>
                <td><asp:Button ID="btnCreate" Text="Create" runat="server" 
                        onclick="btnCreate_Click" /></td>
            </tr>
        </table>
        <br/>
        <br/>
        <table>
            <tr>
                <td colspan="2"><b>Select</b></td>
            </tr>
            <tr>
                <td><asp:TextBox ID="txtID" runat="server" /></td>
                <td><asp:Button ID="btnSelect" Text="Select" runat="server" 
                        onclick="btnSelect_Click" /></td>
            </tr>
            <tr>
                <td colspan="2">
                    Name: <asp:Label ID="lblName" Font-Bold="true" runat="server"></asp:Label>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

namespace WebApplication1
{
    public partial class ProductCategory : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnCreate_Click(object sender, EventArgs e)
        {
            Data.ProductCategory productCategory = new Data.ProductCategory();
            productCategory.ID = Guid.NewGuid();
            productCategory.Name = this.txtName.Text;

            Data.ProductCategory.Create(productCategory);
        }

        protected void btnSelect_Click(object sender, EventArgs e)
        {
            Data.ProductCategory productCategory = new Data.ProductCategory();
            productCategory.ID = new Guid(this.txtID.Text);

            productCategory = Data.ProductCategory.Select(productCategory);

            this.lblName.Text = productCategory.Name;
        }
    }
}

13. 輸入要新增的ProductCategroy名稱,並選擇Create.


14. 從資料表中找出剛剛新增的資料ID,並填入畫面,接著按下Select按鈕,就會將該Category的名稱顯示出來.


Data\SQL\ProductCategory.tt 產生的內容如下:
IF EXISTS(SELECT * FROM sys.objects WHERE type='P' AND name='sp_ProductCategory_Create')
 DROP PROCEDURE sp_ProductCategory_Create
GO

CREATE PROCEDURE sp_ProductCategory_Create
 @ID AS uniqueidentifier, 
 @Name AS nvarchar(50) 
AS
BEGIN

 INSERT INTO ProductCategory
 (
  ID, 
  Name 
 )
 VALUES
 (
  @ID, 
  @Name 
 )
END
GO

IF EXISTS(SELECT * FROM sys.objects WHERE type='P' AND name='sp_ProductCategory_Update')
 DROP PROCEDURE sp_ProductCategory_Update
GO

CREATE PROCEDURE sp_ProductCategory_Update
 @ID AS uniqueidentifier, 
 @Name AS nvarchar(50) 
AS
BEGIN

 UPDATE ProductCategory SET
  Name=@Name 
 WHERE
  ID=@ID 
END
GO

IF EXISTS(SELECT * FROM sys.objects WHERE type='P' AND name='sp_ProductCategory_Delete')
 DROP PROCEDURE sp_ProductCategory_Delete
GO

CREATE PROCEDURE sp_ProductCategory_Delete
  @ID AS uniqueidentifier 
AS
BEGIN

 DELETE ProductCategory WHERE
  ID=@ID 
END
GO

IF EXISTS(SELECT * FROM sys.objects WHERE type='P' AND name='sp_ProductCategory_Select')
 DROP PROCEDURE sp_ProductCategory_Select
GO

CREATE PROCEDURE sp_ProductCategory_Select
  @ID AS uniqueidentifier 
AS
BEGIN

 SELECT * FROM ProductCategory WHERE
  ID=@ID 
END
GO

Data\ProductCategory.tt 產生的內容如下:
//------------------------------------------------------------------------------
// 
// This code was generated by Likol.VisualStudio.Template Tool.
// Last generater time: 2011/7/10 上午 06:23:11
// 
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using Likol.Data;
using Likol.Web.Validation;

namespace WebApplication1.Data
{
 public partial class ProductCategory
 {
  private Guid _ID;
  private string _Name;

  public Guid ID
  {
   get { return this._ID; }
   set { this._ID = value; }
  }

  [Length(50)]
  public string Name
  {
   get { return this._Name; }
   set { this._Name = value; }
  }

  public static void Create(ProductCategory _ProductCategory)
  {
   SqlParameter[] parameters = new SqlParameter[]{
    new SqlParameter("ID", _ProductCategory.ID), 
    new SqlParameter("Name", _ProductCategory.Name) 
   };

   string commandText = "sp_ProductCategory_Create";

   DatabaseManager.ExecuteNonQuery(commandText, parameters);
  }

  public static void Update(ProductCategory _ProductCategory)
  {
   SqlParameter[] parameters = new SqlParameter[]{
    new SqlParameter("ID", _ProductCategory.ID), 
    new SqlParameter("Name", _ProductCategory.Name) 
   };

   string commandText = "sp_ProductCategory_Update";

   DatabaseManager.ExecuteNonQuery(commandText, parameters);
  }

  public static void Delete(ProductCategory _ProductCategory)
  {
   SqlParameter[] parameters = new SqlParameter[]{
    new SqlParameter("ID", _ProductCategory.ID) 
   };

   string commandText = "sp_ProductCategory_Delete";

   DatabaseManager.ExecuteNonQuery(commandText, parameters);
  }

  public static ProductCategory Select(ProductCategory _ProductCategory)
  {
   SqlParameter[] parameters = new SqlParameter[]{
    new SqlParameter("ID", _ProductCategory.ID) 
   };

   string commandText = "sp_ProductCategory_Select";

   SqlConnection sqlConnection = null;

   SqlDataReader sqlDataReader = DatabaseManager.ExecuteReader(commandText, parameters, ref sqlConnection);

   bool hasData = sqlDataReader.Read();

   if (!hasData) return null;

   ProductCategory __ProductCategory = new ProductCategory();

   __ProductCategory.ID = (Guid)sqlDataReader["ID"];
   __ProductCategory.Name = (string)sqlDataReader["Name"];

   sqlDataReader.Close();
   sqlConnection.Close();

   return __ProductCategory;
  }

  public static string GetLookupText(object propertyValue)
  {
   ProductCategory _ProductCategory = new ProductCategory();
   _ProductCategory.ID = (Guid)propertyValue;

   _ProductCategory = ProductCategory.Select(_ProductCategory);

   if (_ProductCategory != null) return _ProductCategory.Name;

   return "";
  }
 }
}


用T4 Text Templates的好處其實在於產生出來的格式雖然是固定的了,還是可以透過一些程式設計的方式進行異動,而且可以根據當時的需求進行修改,完全還是在程式設計的範疇之中.

沒有留言:

張貼留言