2012年9月7日星期五

存储过程生成POCO

存储过程生成POCO

       下面我们演示使用T-SQL写的一个存储过程,生成C#的POCO代码:

CREATE PROCEDURE usp_TableToClass
/*
Generates C# class code for a table
and fields/properties for each column.
 
Run as "Results to Text" or "Results to File" (not Grid)
 
Example: EXEC usp_TableToClass 'MyTable'
*/
@table_name SYSNAME
 
AS
 
SET NOCOUNT ON
 
DECLARE @temp TABLE
(
sort INT,
code TEXT
)
 
INSERT INTO @temp
SELECT 1, 'public class ' + @table_name + CHAR(13) + CHAR(10) + '{'
 
INSERT INTO @temp
SELECT 2, CHAR(13) + CHAR(10) + '#region Constructors' + CHAR(13) + CHAR(10)
INSERT INTO @temp
SELECT 3, CHAR(9) + 'public ' + @table_name + '()'
+ CHAR(13) + CHAR(10) + CHAR(9) + '{'
+ CHAR(13) + CHAR(10) + CHAR(9) + '}'
 
INSERT INTO @temp
SELECT 4, '#endregion' + CHAR(13) + CHAR(10)
 
INSERT INTO @temp
SELECT 5, '#region Private Fields' + CHAR(13) + CHAR(10)
INSERT INTO @temp
SELECT 6, CHAR(9) + 'private ' +
CASE
WHEN DATA_TYPE LIKE '%CHAR%' THEN 'string '
WHEN DATA_TYPE LIKE '%INT%' THEN 'int '
WHEN DATA_TYPE LIKE '%DATETIME%' THEN 'DateTime '
WHEN DATA_TYPE LIKE '%BINARY%' THEN 'byte[] '
WHEN DATA_TYPE = 'BIT' THEN 'bool '
WHEN DATA_TYPE LIKE '%TEXT%' THEN 'string '
ELSE 'object '
END + '_' + COLUMN_NAME + ';' + CHAR(9)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table_name
ORDER BY ORDINAL_POSITION
 
INSERT INTO @temp
SELECT 7, '#endregion' +
CHAR(13) + CHAR(10)
 
INSERT INTO @temp
SELECT 8, '#region Public Properties' + CHAR(13) + CHAR(10)
INSERT INTO @temp
SELECT 9, CHAR(9) + 'public ' +
CASE
WHEN DATA_TYPE LIKE '%CHAR%' THEN 'string '
WHEN DATA_TYPE LIKE '%INT%' THEN 'int '
WHEN DATA_TYPE LIKE '%DATETIME%' THEN 'DateTime '
WHEN DATA_TYPE LIKE '%BINARY%' THEN 'byte[] '
WHEN DATA_TYPE = 'BIT' THEN 'bool '
WHEN DATA_TYPE LIKE '%TEXT%' THEN 'string '
ELSE 'object '
END + COLUMN_NAME +
CHAR(13) + CHAR(10) + CHAR(9) + '{' +
CHAR(13) + CHAR(10) + CHAR(9) + CHAR(9) +
'get { return _' + COLUMN_NAME + '; }' +
CHAR(13) + CHAR(10) + CHAR(9) + CHAR(9) +
'set { _' + COLUMN_NAME + ' = value; }' +
CHAR(13) + CHAR(10) + CHAR(9) + '}'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table_name
ORDER BY ORDINAL_POSITION
 
INSERT INTO @temp
SELECT 10, '#endregion' +
CHAR(13) + CHAR(10) + '}'
 
SELECT code FROM @temp
ORDER BY sort
 
 
 

 

在DB中创建好后,怎么用呢?例如下面我们以 aspnet_Membership表为例: 

EXEC usp_TableToClass aspnet_Membership

 

接着生成这样的CSharp代码,不包含行号:

 

   1:  public class aspnet_Membership
   2:  {
   3:   
   4:  #region Constructors
   5:      public aspnet_Membership()
   6:      {
   7:      }
   8:  #endregion
   9:  #region Private Fields
  10:      private object _ApplicationId;    
  11:      private object _UserId;    
  12:      private string _Password;    
  13:      private int _PasswordFormat;    
  14:      private string _PasswordSalt;    
  15:      private string _MobilePIN;    
  16:      private string _Email;    
  17:      private string _LoweredEmail;    
  18:      private string _PasswordQuestion;    
  19:      private string _PasswordAnswer;    
  20:      private bool _IsApproved;    
  21:      private bool _IsLockedOut;    
  22:      private DateTime _CreateDate;    
  23:      private DateTime _LastLoginDate;    
  24:      private DateTime _LastPasswordChangedDate;    
  25:      private DateTime _LastLockoutDate;    
  26:      private int _FailedPasswordAttemptCount;    
  27:      private DateTime _FailedPasswordAttemptWindowStart;    
  28:      private int _FailedPasswordAnswerAttemptCount;    
  29:      private DateTime _FailedPasswordAnswerAttemptWindowStart;    
  30:      private string _Comment;    
  31:  #endregion
  32:  #region Public Properties
  33:      public object ApplicationId
  34:      {
  35:          get { return _ApplicationId; }
  36:          set { _ApplicationId = value; }
  37:      }
  38:      public object UserId
  39:      {
  40:          get { return _UserId; }
  41:          set { _UserId = value; }
  42:      }
  43:      public string Password
  44:      {
  45:          get { return _Password; }
  46:          set { _Password = value; }
  47:      }
  48:      public int PasswordFormat
  49:      {
  50:          get { return _PasswordFormat; }
  51:          set { _PasswordFormat = value; }
  52:      }
  53:      public string PasswordSalt
  54:      {
  55:          get { return _PasswordSalt; }
  56:          set { _PasswordSalt = value; }
  57:      }
  58:      public string MobilePIN
  59:      {
  60:          get { return _MobilePIN; }
  61:          set { _MobilePIN = value; }
  62:      }
  63:      public string Email
  64:      {
  65:          get { return _Email; }
  66:          set { _Email = value; }
  67:      }
  68:      public string LoweredEmail
  69:      {
  70:          get { return _LoweredEmail; }
  71:          set { _LoweredEmail = value; }
  72:      }
  73:      public string PasswordQuestion
  74:      {
  75:          get { return _PasswordQuestion; }
  76:          set { _PasswordQuestion = value; }
  77:      }
  78:      public string PasswordAnswer
  79:      {
  80:          get { return _PasswordAnswer; }
  81:          set { _PasswordAnswer = value; }
  82:      }
  83:      public bool IsApproved
  84:      {
  85:          get { return _IsApproved; }
  86:          set { _IsApproved = value; }
  87:      }
  88:      public bool IsLockedOut
  89:      {
  90:          get { return _IsLockedOut; }
  91:          set { _IsLockedOut = value; }
  92:      }
  93:      public DateTime CreateDate
  94:      {
  95:          get { return _CreateDate; }
  96:          set { _CreateDate = value; }
  97:      }
  98:      public DateTime LastLoginDate
  99:      {
 100:          get { return _LastLoginDate; }
 101:          set { _LastLoginDate = value; }
 102:      }
 103:      public DateTime LastPasswordChangedDate
 104:      {
 105:          get { return _LastPasswordChangedDate; }
 106:          set { _LastPasswordChangedDate = value; }
 107:      }
 108:      public DateTime LastLockoutDate
 109:      {
 110:          get { return _LastLockoutDate; }
 111:          set { _LastLockoutDate = value; }
 112:      }
 113:      public int FailedPasswordAttemptCount
 114:      {
 115:          get { return _FailedPasswordAttemptCount; }
 116:          set { _FailedPasswordAttemptCount = value; }
 117:      }
 118:      public DateTime FailedPasswordAttemptWindowStart
 119:      {
 120:          get { return _FailedPasswordAttemptWindowStart; }
 121:          set { _FailedPasswordAttemptWindowStart = value; }
 122:      }
 123:      public int FailedPasswordAnswerAttemptCount
 124:      {
 125:          get { return _FailedPasswordAnswerAttemptCount; }
 126:          set { _FailedPasswordAnswerAttemptCount = value; }
 127:      }
 128:      public DateTime FailedPasswordAnswerAttemptWindowStart
 129:      {
 130:          get { return _FailedPasswordAnswerAttemptWindowStart; }
 131:          set { _FailedPasswordAnswerAttemptWindowStart = value; }
 132:      }
 133:      public string Comment
 134:      {
 135:          get { return _Comment; }
 136:          set { _Comment = value; }
 137:      }
 138:  #endregion
 139:  }
 140:   


这篇文章只是抛砖引玉,你可以创建更强大的功能SP, 或许这是一个思路。

希望对您开发有帮助。


作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。


TAG: