成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何用T4模板生成數據實體

運維 數據庫運維
什么是T4模板,自己去搜吧,怎么用也請自己搜吧。我將要貼出的T4模板是將SQLServer 2008的Table, View , TableType, Procedure解析為C#里的對應實體。

我們現有的項目沒有采用任何ORM,所有的數據讀取與操作都是基于存儲過程的,在代碼端使用 Enterprise Library 5 。 在 EntLib 和數據庫之間,是基于我原來寫的一個 T4 實體生成的模板,之前也沒有詳細的去整,反正能運行出結果就行了,總之,代碼很亂。

最近一期項目告一段落,后續項目還沒有上馬,一手把這個部門建立起來的總監(經理)又離開了這個團隊,我們幾個老一批的員工也在思索著是否換換。趁著這個便當,我把這個東西在整出來,算是給我增加一個砝碼吧。

什么是 T4 模板,自己去搜吧,怎么用也請自己搜吧。懂就懂,不懂我也懶得解釋。

我將要貼出的T4模板是將 SQLServer 2008 的 Table, View , TableType, Procedure 解析為 C# 里的對應實體,形如下:

Table/View/TableType

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Data;  
  6. using System.Collections;  
  7. using System.ComponentModel;  
  8. using System.Runtime.Serialization;  
  9. namespace AsNum.MySecret.Entity.Database {  
  10.     /// <summary>  
  11.     /// Table : dbo.LoginPolicy  
  12.     /// 登陸策略  
  13.     /// 數據實體  
  14.     /// </summary>  
  15.     [Serializable]  
  16.     [DataContract]  
  17.     public class LoginPolicyEntity {  
  18.         /// <summary>  
  19.         /// 自動編號  
  20.         /// dbo.LoginPolicy.PolicyID  
  21.         /// 默認值  
  22.         /// </summary>  
  23.         public int PolicyID{  
  24.             get;set;  
  25.         }  
  26.         private int _UnfreezeTime = 30;  
  27.         /// <summary>  
  28.         /// 解凍時間  
  29.         /// dbo.LoginPolicy.UnfreezeTime  
  30.         /// 默認值((30))  
  31.         /// </summary>  
  32.         public int UnfreezeTime{  
  33.             get{  
  34.                 return _UnfreezeTime;  
  35.             }  
  36.             set{  
  37.                 _UnfreezeTime = value;  
  38.             }  
  39.         }  
  40.         private int _MaxFailedCount = 5;  
  41.         /// <summary>  
  42.         /// 最大失敗次數  
  43.         /// dbo.LoginPolicy.MaxFailedCount  
  44.         /// 默認值((5))  
  45.         /// </summary>  
  46.         public int MaxFailedCount{  
  47.             get{  
  48.                 return _MaxFailedCount;  
  49.             }  
  50.             set{  
  51.                 _MaxFailedCount = value;  
  52.             }  
  53.         }  
  54.         private bool? _EnableLoginPolicy = true;  
  55.         /// <summary>  
  56.         /// 是否啟用登陸策略  
  57.         /// dbo.LoginPolicy.EnableLoginPolicy  
  58.         /// 默認值((1))  
  59.         /// </summary>  
  60.         public bool? EnableLoginPolicy{  
  61.             get{  
  62.                 return _EnableLoginPolicy;  
  63.             }  
  64.             set{  
  65.                 _EnableLoginPolicy = value;  
  66.             }  
  67.         }  
  68.         private DateTime _CreateTime = new DateTime();  
  69.         /// <summary>  
  70.         ///  
  71.         /// dbo.LoginPolicy.CreateTime  
  72.         /// 默認值(getdate())  
  73.         /// </summary>  
  74.         public DateTime CreateTime{  
  75.             get{  
  76.                 return _CreateTime;  
  77.             }  
  78.             set{  
  79.                 _CreateTime = value;  
  80.             }  
  81.         }  
  82.         /// <summary>  
  83.         ///  
  84.         /// dbo.LoginPolicy.Creator  
  85.         /// 默認值  
  86.         /// </summary>  
  87.         public string Creator{  
  88.             get;set;  
  89.         }  
  90.     }  

Procedure

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Data;  
  6. using System.Collections;  
  7. using System.ComponentModel;  
  8. using System.Data.SqlClient;  
  9. using Microsoft.Practices.EnterpriseLibrary.Data;  
  10. using AsNum.MySecret.Entity.Database;  
  11. using AsNum.Common.Extend;  
  12. namespace AsNum.MySecret.DB {  
  13.     ///   
  14.     ///  
  15.     ///  
  16.     public partial class SPs {  
  17.         ///   
  18.         /// 發送消息  
  19.         ///   
  20.         ///   
  21.         /// @Title 消息標題  
  22.         /// @Ctx 消息內容  
  23.         /// @UserID 用戶ID  
  24.         /// @FromIP 發消息的IP  
  25.         /// @IntranetIP 發消息的內網IP,用于擴展  
  26.         /// @IsPublic 是否公開  
  27.         /// @Receiver 消息接收者,表變量  
  28.         ///   
  29.         public static SqlCommand SendMsg(Database db, string title , string ctx , int? userID , long? fromIP , long? intranetIP , long? isPublic , List receiver){  
  30.             if(db == null)  
  31.                 throw new ArgumentNullException("db");  
  32.             SqlCommand sc = new SqlCommand("SendMsg");  
  33.             sc.CommandType = CommandType.StoredProcedure;  
  34.             db.AddParameter(sc , "@Title" , DbType.String , 100 , ParameterDirection.Input , true , 0 , 0 , String.Empty , DataRowVersion.Default , title);  
  35.             db.AddParameter(sc , "@Ctx" , DbType.String , 500 , ParameterDirection.Input , true , 0 , 0 , String.Empty , DataRowVersion.Default , ctx);  
  36.             db.AddParameter(sc , "@UserID" , DbType.Int32 , 4 , ParameterDirection.Input , true , 0 , 0 , String.Empty , DataRowVersion.Default , userID);  
  37.             db.AddParameter(sc , "@FromIP" , DbType.Int64 , 8 , ParameterDirection.Input , true , 0 , 0 , String.Empty , DataRowVersion.Default , fromIP);  
  38.             db.AddParameter(sc , "@IntranetIP" , DbType.Int64 , 8 , ParameterDirection.Input , true , 0 , 0 , String.Empty , DataRowVersion.Default , intranetIP);  
  39.             db.AddParameter(sc , "@IsPublic" , DbType.Int64 , 8 , ParameterDirection.Input , true , 0 , 0 , String.Empty , DataRowVersion.Default , isPublic);  
  40.             db.AddParameter(sc , "@Receiver" , DbType.Object , -1 , ParameterDirection.Input , true , 0 , 0 , String.Empty , DataRowVersion.Default , receiver.ToDataTable());  
  41.             return sc;  
  42.         }  
  43.     }  

可以看到產生的存儲過程調用方法并沒有獲取到參數的默認值,這個是因為(http://msdn.microsoft.com/en-us/library/ms176074.aspx):

SQL Server only maintains default values for CLR objects in this catalog view;

不過,有牛人做出來了,前提是存儲過程沒有加密:

http://www.codeproject.com/KB/database/FindDefaultValueSPParams.aspx

#p#

在聲明 Table / View / TableType 的時候:

  1. CREATE TYPE TMessageReceiver AS TABLE(  
  2.     SendType VARCHAR(10) NOT NULL,  
  3.     Receiver NVARCHAR(128) NOT NULL 
  4. )  
  5. GO  
  6. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息接收人, 相同SendType 和Recever 只能出現一次' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TYPE',@level1name=N'TMessageReceiver' 
  7. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息發送類型EML(QQ, MSN留擴展)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TYPE',@level1name=N'TMessageReceiver', @level2type=N'COLUMN',@level2name=N'SendType' 
  8. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'接收地址,跟據SendType' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TYPE',@level1name=N'TMessageReceiver', @level2type=N'COLUMN',@level2name=N'Receiver' 
  9. GO  

------------

  1. CREATE TABLE LoginPolicy(  
  2.     PolicyID INT IDENTITY(1,1) NOT NULL,  
  3.     UnfreezeTime INT NOT NULL DEFAULT 30,  
  4.     MaxFailedCount INT NOT NULL DEFAULT 5,  
  5.     EnableLoginPolicy BIT DEFAULT 1, -- 0 : 不啟用, 1:啟用  
  6.     CreateTime DATETIME NOT NULL DEFAULT GETDATE(),  
  7.     Creator NVARCHAR(30),  
  8.     CONSTRAINT LoginPolicy_PK PRIMARY KEY (PolicyID)  
  9. )  
  10. GO  
  11. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'登陸策略' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LoginPolicy' 
  12. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'自動編號' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LoginPolicy', @level2type=N'COLUMN',@level2name=N'PolicyID' 
  13. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'解凍時間' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LoginPolicy', @level2type=N'COLUMN',@level2name=N'UnfreezeTime' 
  14. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'最大失敗次數' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LoginPolicy', @level2type=N'COLUMN',@level2name=N'MaxFailedCount' 
  15. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否啟用登陸策略' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'LoginPolicy', @level2type=N'COLUMN',@level2name=N'EnableLoginPolicy' 
  16. GO  

聲明存儲過程:

  1. CREATE PROCEDURE SendMsg  
  2.     @Title NVARCHAR(100),  
  3.     @Ctx NVARCHAR(500),  
  4.     @UserID INT,  
  5.     @FromIP BIGINT,  
  6.     @IntranetIP BIGINT,  
  7.     @IsPublic BIGINT,  
  8.     @Receiver TMessageReceiver READONLY  
  9. AS 
  10. BEGIN 
  11.     -- 表變量,用以存儲新增的主表ID  
  12.     DECLARE @T AS TABLE (ID INT)  
  13.     BEGIN TRAN NewMsg  
  14.     BEGIN TRY  
  15.         -- 寫入主表  
  16.         INSERT INTO [Message]  
  17.         (Title, Ctx, UserID, FromIP, IntranetIP, IsPublic)  
  18.         OUTPUT INSERTED.MessageID INTO @T  
  19.         VALUES 
  20.         (@Title, @Ctx, @UserID, @FromIP, @IntranetIP , @IsPublic )  
  21.         -- 取出新增數據的ID  
  22.         DECLARE @MessageID INT 
  23.         SELECT TOP 1 @MessageID = ID FROM @T  
  24.         -- 寫子表, 這里要改動一下,相同的只保留一條  
  25.         INSERT INTO MessageReceiver  
  26.             (MessageID, SendType, Receiver )  
  27.         SELECT 
  28.             @MessageID, R.SendType, R.Receiver  
  29.         FROM 
  30.             @Receiver R  
  31.     END TRY  
  32.     BEGIN CATCH  
  33.         ROLLBACK TRAN NewMsg  
  34.         RETURN 2 -- DatabaseError  
  35.     END CATCH  
  36.     COMMIT TRAN NewMsg  
  37.     RETURN 0  
  38. END 
  39. GO  
  40. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'發送消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'SendMsg' 
  41. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息標題' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'SendMsg', @level2type=N'PARAMETER', @level2name = '@Title' 
  42. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息內容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'SendMsg', @level2type=N'PARAMETER', @level2name = '@Ctx' 
  43. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用戶ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'SendMsg', @level2type=N'PARAMETER', @level2name = '@UserID' 
  44. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'發消息的IP' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'SendMsg', @level2type=N'PARAMETER', @level2name = '@FromIP' 
  45. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'發消息的內網IP,用于擴展' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'SendMsg', @level2type=N'PARAMETER', @level2name = '@IntranetIP' 
  46. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否公開' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'SendMsg', @level2type=N'PARAMETER', @level2name = '@IsPublic' 
  47. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息接收者,表變量' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'SendMsg', @level2type=N'PARAMETER', @level2name = '@Receiver' 
  48. GO 

這些 MS_Description 的 value 會做為注釋寫到生成的代碼里。

實現T4模板就很簡單了,就是把下面幾個SQL的結果取出來,在自由的組合一下:

  1. WITH Entities AS (  
  2.     SELECT 
  3.         Table_catalog AS [Database]  
  4.         , table_schema [Owner]  
  5.         , table_name [Name]  
  6.         , 'Table' [Type]  
  7.         ,OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME) ID  
  8.     FROM 
  9.         INFORMATION_SCHEMA.TABLES  
  10.     WHERE 
  11.         TABLE_TYPE='BASE TABLE' 
  12.     UNION ALL 
  13.     SELECT 
  14.         Table_catalog  
  15.         , table_schema  
  16.         , table_name  
  17.         , 'View' 
  18.         , OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME) ID  
  19.     FROM 
  20.         information_schema.views  
  21.     UNION ALL 
  22.     SELECT 
  23.         DB_NAME()  
  24.         , SCHEMA_NAME(schema_id)  
  25.         , name 
  26.         , 'TableType' 
  27.         , user_type_id  
  28.     FROM 
  29.         sys.table_types  
  30. )  
  31. SELECT 
  32.     E.*  
  33.     , P.value AS [DESC]  
  34. FROM 
  35.     Entities E  
  36.     LEFT JOIN sys.extended_properties P ON E.ID = P.major_id AND P.minor_id = 0 

Table / View / TableType

字段:

  1. SELECT 
  2.     DB_NAME() AS [Database]  
  3.     ,COALESCE( SCHEMA_NAME(T.Schema_id), OBJECT_SCHEMA_NAME(C.object_id)) AS Owner  
  4.     ,COALESCE( T.Name, OBJECT_NAME(c.OBJECT_ID)) AS Parent  
  5.     ,C.column_id AS OrdinalPosition  
  6.     ,C.name AS Name 
  7.     ,TYPE_NAME(c.user_type_id) AS DataType  
  8.     ,D.definition AS DefaultSetting  
  9.     , C.is_nullable AS IsNullable  
  10.     , C.max_length AS MaxLength  
  11.     , COLUMNPROPERTY( C.OBJECT_ID , C.Name ,'PRECISION'AS [Precision-- 用于判斷NVARCHAR 實際長度的  
  12.     --,C.Object_id, P.major_id, P.minor_id  
  13.     ,P.Value AS [DESC]  
  14. FROM 
  15.     sys.columns C  
  16.     LEFT JOIN sys.table_types T ON T.type_table_object_id = C.object_ID  
  17.     LEFT JOIN sys.default_constraints D ON C.object_id = D.parent_object_id AND D.parent_column_id = C.Column_id  
  18.     LEFT JOIN sys.extended_properties P ON (P.major_id = C.OBJECT_ID OR P.major_id = T.User_type_id ) AND P.minor_id = C.COLUMN_ID AND P.name = 'MS_Description' 
  19. WHERE 
  20.     COALESCE( SCHEMA_NAME(T.Schema_id), OBJECT_SCHEMA_NAME(C.object_id)) = 'dbo' 

存儲過程:

  1. SELECT 
  2.     SCHEMA_NAME(P.schema_id) AS Owner  
  3.     , P.Name 
  4.     , PP.Value AS [Desc]  
  5. FROM 
  6.     sys.procedures P  
  7.     LEFT JOIN sys.extended_properties PP ON P.object_id = PP.major_id AND PP.minor_id = 0 

存儲過程的參數:

  1. SELECT 
  2.     SCHEMA_NAME( P.[schema_id] ) AS [Schema]  
  3.     ,P.Name AS [Proc]  
  4.     ,PA.Name 
  5.     , (SELECT COUNT(1) FROM sys.table_types WHERE user_type_id = PA.user_type_id) AS IsTableType  
  6.     ,TYPE_NAME(PA.user_type_id) AS DataType  
  7.     , PA.max_length AS MaxLength  
  8.     , COLUMNPROPERTY( PA.OBJECT_ID , PA.Name ,'PRECISION'AS [Precision-- 用于判斷NVARCHAR 實際長度的  
  9.     , PA.is_output AS IsOutput  
  10.     , PP.value AS [Desc]  
  11. FROM 
  12.     sys.procedures P  
  13.     INNER JOIN sys.parameters PA ON P.object_id = PA.object_id  
  14.     LEFT JOIN sys.extended_properties PP ON PA.object_id = PP.major_id AND PA.parameter_id = PP.minor_id  
  15. ORDER BY 
  16.     PA.Object_id, PA.Parameter_id 

源代碼包:http://files.cnblogs.com/xling/ExecuteT4.7z

這個包里有一個如何用程序運行T4模板的示例,加這個是因為同事問我如何用代碼去執行T4模板,昨晚K歌完到家12點半(跟經理道別),洗完澡后,我從以前寫的代碼里翻出來的,稍稍做了點修改。還有一份數據字典導出模板.

另外需要注意的是:

1, Microsoft.VisualStudio.TextTemplating.dll 這個 DLL,如果你裝的是VS2010 就默認裝了這個。如果是VS2008, 需要從:Visual Studio 2008 SDK 1.1 里找

2, 如圖

遺留的問題:

有些默認值沒有處理好,比如對DateTime字段只處理了這種情況: GETDATE() 或 ‘2011-01-01’ , 其它的我暫時沒有遇到,沒有做處理。

存儲過程的 TableType 參數,我簡單的映射為 DbType.Object ,還沒有驗證這樣是否可行。

后面我會把這些都修正的,如果你有興趣的話,可以留意。

原文鏈接:http://www.cnblogs.com/xling/archive/2011/05/24/2055503.html

責任編輯:艾婧 來源: 博客園
相關推薦

2013-09-08 22:30:45

EF Code Fir架構設計MVC架構設計

2011-09-26 16:26:22

T4模板

2009-07-22 16:34:36

使用T4ASP.NET MVC

2016-10-14 15:39:00

香港 數據中心

2011-09-21 16:52:11

Sparc T4芯片甲骨文

2010-12-08 09:53:42

2011-10-08 15:51:56

甲骨文SPARC

2010-01-12 14:02:14

VB.NET數據實體層

2015-08-11 11:08:19

中科創達

2022-07-12 10:48:27

Python數據日報命令

2011-08-16 10:17:12

XCode模版引擎XTemplate

2011-09-30 10:53:32

甲骨文SPARC T5SPARC T4

2023-02-23 07:46:48

學習模型數據倉庫

2023-10-26 11:03:50

C語言宏定義

2011-05-24 09:47:44

筆記本故障檢修

2009-03-25 08:32:33

Windows Ser微軟操作系統

2009-03-24 14:29:04

LinuxExt4數據丟失

2009-12-30 14:12:53

ADO.NET Fra

2021-09-07 09:01:07

人臉識別人工智能數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草综合在线视频 | 国产成人精品午夜视频免费 | 在线观看免费观看在线91 | 一区二区三区高清 | 国产亚洲精品精品国产亚洲综合 | 国产精品一区二区av | 91视频亚洲| 久久精品国产一区二区电影 | 欧美精品成人 | 国产成人一区二区三区久久久 | 亚洲精品视频二区 | 一区二区三区四区国产精品 | 九色网址| 欧产日产国产精品国产 | 国产91视频免费 | 黄a网站 | 免费看一级毛片 | 欧美一二三区 | 成人不卡 | 国产三级电影网站 | 国产精品久久久久久久久免费高清 | 91免费小视频 | 成人精品一区二区三区中文字幕 | 91亚洲精品国偷拍自产在线观看 | 欧美精品一区二区免费视频 | 538在线精品 | 高清久久久 | 免费一看一级毛片 | 成人在线亚洲 | 午夜大片 | 亚洲欧美在线一区 | 亚洲国产一区视频 | 日韩欧美视频免费在线观看 | 欧美精品一区三区 | 四虎在线观看 | 亚洲精品乱码久久久久久按摩观 | 国产免费一区二区三区 | 中文字幕在线观看视频网站 | 色综合天天综合网国产成人网 | 一区二区在线观看免费视频 | 欧美一级观看 |