如何从SQL Server的表中生成类?
我不是在谈论使用一些ORM.我只需要创建实体(简单类).就像是:
public class Person
{
public string Name { get;set; }
public string Phone { get;set; }
}
Alex Aza.. 622
将@TableName设置为表的名称.
declare @TableName sysname = 'TableName' declare @Result varchar(max) = 'public class ' + @TableName + ' {' select @Result = @Result + ' public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; } ' from ( select replace(col.name, ' ', '_') ColumnName, column_id ColumnId, case typ.name when 'bigint' then 'long' when 'binary' then 'byte[]' when 'bit' then 'bool' when 'char' then 'string' when 'date' then 'DateTime' when 'datetime' then 'DateTime' when 'datetime2' then 'DateTime' when 'datetimeoffset' then 'DateTimeOffset' when 'decimal' then 'decimal' when 'float' then 'double' when 'image' then 'byte[]' when 'int' then 'int' when 'money' then 'decimal' when 'nchar' then 'string' when 'ntext' then 'string' when 'numeric' then 'decimal' when 'nvarchar' then 'string' when 'real' then 'float' when 'smalldatetime' then 'DateTime' when 'smallint' then 'short' when 'smallmoney' then 'decimal' when 'text' then 'string' when 'time' then 'TimeSpan' when 'timestamp' then 'long' when 'tinyint' then 'byte' when 'uniqueidentifier' then 'Guid' when 'varbinary' then 'byte[]' when 'varchar' then 'string' else 'UNKNOWN_' + typ.name end ColumnType, case when col.is_nullable = 1 and typ.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier') then '?' else '' end NullableSign from sys.columns col join sys.types typ on col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id where object_id = object_id(@TableName) ) t order by ColumnId set @Result = @Result + ' }' print @Result
@AlexAza你应该改变"当'浮动'然后'浮''到"`当'浮'然后'双'时你应该改变"`当'真''然后'双'`"到"何时"真正的'然后'浮动'`."看起来你把这些类型搞糊涂了.相当于SQL浮点数的C#是一个双重而C#相当于一个SQL实数是一个浮点数. (6认同)
对于**Nullable Types**,在Alex的SQL脚本中将此代码添加到`end`和`ColumnType`之间.`+ CASE WHEN col.is_nullable = 1 AND typ.name NOT IN('binary','varbinary','image','text','ntext','varchar','nvarchar','char','nchar ') 然后 '?' ELSE''结束' (5认同)
如何为此添加数据注释以进行验证-例如最大字段长度?:) (2认同)
我已经派生出一个版本来[输出数据库的所有表格作为POCO /模型](https://pastebin.com/NUQVLmCs). (2认同)
CarneyCode.. 68
我无法得到Alex的答案在Sql Server 2008 R2上工作.所以,我用相同的基本原则重写了它.它现在允许模式,并且已经对列属性映射进行了一些修复(包括将可为空的日期类型映射到可以为空的C#值类型).这是Sql:
DECLARE @TableName VARCHAR(MAX) = 'NewsItem' -- Replace 'NewsItem' with your table name DECLARE @TableSchema VARCHAR(MAX) = 'Markets' -- Replace 'Markets' with your schema name DECLARE @result varchar(max) = '' SET @result = @result + 'using System;' + CHAR(13) + CHAR(13) IF (@TableSchema IS NOT NULL) BEGIN SET @result = @result + 'namespace ' + @TableSchema + CHAR(13) + '{' + CHAR(13) END SET @result = @result + 'public class ' + @TableName + CHAR(13) + '{' + CHAR(13) SET @result = @result + '#region Instance Properties' + CHAR(13) SELECT @result = @result + CHAR(13) + ' public ' + ColumnType + ' ' + ColumnName + ' { get; set; } ' + CHAR(13) FROM (SELECT c.COLUMN_NAME AS ColumnName, CASE c.DATA_TYPE WHEN 'bigint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int64?' ELSE 'Int64' END WHEN 'binary' THEN 'Byte[]' WHEN 'bit' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'bool?' ELSE 'bool' END WHEN 'char' THEN 'string' WHEN 'date' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime2' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetimeoffset' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END WHEN 'decimal' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'float' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Single?' ELSE 'Single' END WHEN 'image' THEN 'Byte[]' WHEN 'int' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'int?' ELSE 'int' END WHEN 'money' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'nchar' THEN 'string' WHEN 'ntext' THEN 'string' WHEN 'numeric' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'nvarchar' THEN 'string' WHEN 'real' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Double?' ELSE 'Double' END WHEN 'smalldatetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'smallint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int16?' ELSE 'Int16' END WHEN 'smallmoney' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'text' THEN 'string' WHEN 'time' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END WHEN 'timestamp' THEN 'Byte[]' WHEN 'tinyint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END WHEN 'uniqueidentifier' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Guid?' ELSE 'Guid' END WHEN 'varbinary' THEN 'Byte[]' WHEN 'varchar' THEN 'string' ELSE 'Object' END AS ColumnType, c.ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = @TableName AND ISNULL(@TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA) t ORDER BY t.ORDINAL_POSITION SET @result = @result + CHAR(13) + '#endregion Instance Properties' + CHAR(13) SET @result = @result + '}' + CHAR(13) IF (@TableSchema IS NOT NULL) BEGIN SET @result = @result + CHAR(13) + '}' END PRINT @result
它生成C#,如下所示:
using System; namespace Markets { public class NewsItem { #region Instance Properties public Int32 NewsItemID { get; set; } public Int32? TextID { get; set; } public String Description { get; set; } #endregion Instance Properties } }
使用EF,Linq to Sql,甚至Scaffolding可能是一个想法; 然而,有时像这样的编码就派上用场了.坦率地说,我不喜欢使用EF导航属性,它生成的代码在19,200个单独的数据库调用中填充1000行网格.这可以在单个数据库调用中实现.尽管如此,它可能只是您的技术架构师不希望您使用EF等.所以,你必须恢复到这样的代码......顺便说一下,使用DataAnnotations等属性装饰每个属性也是一个想法,但我保持严格的POCO.
编辑 固定为TimeStamp和Guid?
将@TableName设置为表的名称.
declare @TableName sysname = 'TableName' declare @Result varchar(max) = 'public class ' + @TableName + ' {' select @Result = @Result + ' public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; } ' from ( select replace(col.name, ' ', '_') ColumnName, column_id ColumnId, case typ.name when 'bigint' then 'long' when 'binary' then 'byte[]' when 'bit' then 'bool' when 'char' then 'string' when 'date' then 'DateTime' when 'datetime' then 'DateTime' when 'datetime2' then 'DateTime' when 'datetimeoffset' then 'DateTimeOffset' when 'decimal' then 'decimal' when 'float' then 'double' when 'image' then 'byte[]' when 'int' then 'int' when 'money' then 'decimal' when 'nchar' then 'string' when 'ntext' then 'string' when 'numeric' then 'decimal' when 'nvarchar' then 'string' when 'real' then 'float' when 'smalldatetime' then 'DateTime' when 'smallint' then 'short' when 'smallmoney' then 'decimal' when 'text' then 'string' when 'time' then 'TimeSpan' when 'timestamp' then 'long' when 'tinyint' then 'byte' when 'uniqueidentifier' then 'Guid' when 'varbinary' then 'byte[]' when 'varchar' then 'string' else 'UNKNOWN_' + typ.name end ColumnType, case when col.is_nullable = 1 and typ.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier') then '?' else '' end NullableSign from sys.columns col join sys.types typ on col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id where object_id = object_id(@TableName) ) t order by ColumnId set @Result = @Result + ' }' print @Result
我无法得到Alex的答案在Sql Server 2008 R2上工作.所以,我用相同的基本原则重写了它.它现在允许模式,并且已经对列属性映射进行了一些修复(包括将可为空的日期类型映射到可以为空的C#值类型).这是Sql:
DECLARE @TableName VARCHAR(MAX) = 'NewsItem' -- Replace 'NewsItem' with your table name DECLARE @TableSchema VARCHAR(MAX) = 'Markets' -- Replace 'Markets' with your schema name DECLARE @result varchar(max) = '' SET @result = @result + 'using System;' + CHAR(13) + CHAR(13) IF (@TableSchema IS NOT NULL) BEGIN SET @result = @result + 'namespace ' + @TableSchema + CHAR(13) + '{' + CHAR(13) END SET @result = @result + 'public class ' + @TableName + CHAR(13) + '{' + CHAR(13) SET @result = @result + '#region Instance Properties' + CHAR(13) SELECT @result = @result + CHAR(13) + ' public ' + ColumnType + ' ' + ColumnName + ' { get; set; } ' + CHAR(13) FROM (SELECT c.COLUMN_NAME AS ColumnName, CASE c.DATA_TYPE WHEN 'bigint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int64?' ELSE 'Int64' END WHEN 'binary' THEN 'Byte[]' WHEN 'bit' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'bool?' ELSE 'bool' END WHEN 'char' THEN 'string' WHEN 'date' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime2' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetimeoffset' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END WHEN 'decimal' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'float' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Single?' ELSE 'Single' END WHEN 'image' THEN 'Byte[]' WHEN 'int' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'int?' ELSE 'int' END WHEN 'money' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'nchar' THEN 'string' WHEN 'ntext' THEN 'string' WHEN 'numeric' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'nvarchar' THEN 'string' WHEN 'real' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Double?' ELSE 'Double' END WHEN 'smalldatetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'smallint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int16?' ELSE 'Int16' END WHEN 'smallmoney' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'text' THEN 'string' WHEN 'time' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END WHEN 'timestamp' THEN 'Byte[]' WHEN 'tinyint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END WHEN 'uniqueidentifier' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Guid?' ELSE 'Guid' END WHEN 'varbinary' THEN 'Byte[]' WHEN 'varchar' THEN 'string' ELSE 'Object' END AS ColumnType, c.ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = @TableName AND ISNULL(@TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA) t ORDER BY t.ORDINAL_POSITION SET @result = @result + CHAR(13) + '#endregion Instance Properties' + CHAR(13) SET @result = @result + '}' + CHAR(13) IF (@TableSchema IS NOT NULL) BEGIN SET @result = @result + CHAR(13) + '}' END PRINT @result
它生成C#,如下所示:
using System; namespace Markets { public class NewsItem { #region Instance Properties public Int32 NewsItemID { get; set; } public Int32? TextID { get; set; } public String Description { get; set; } #endregion Instance Properties } }
使用EF,Linq to Sql,甚至Scaffolding可能是一个想法; 然而,有时像这样的编码就派上用场了.坦率地说,我不喜欢使用EF导航属性,它生成的代码在19,200个单独的数据库调用中填充1000行网格.这可以在单个数据库调用中实现.尽管如此,它可能只是您的技术架构师不希望您使用EF等.所以,你必须恢复到这样的代码......顺便说一下,使用DataAnnotations等属性装饰每个属性也是一个想法,但我保持严格的POCO.
编辑 固定为TimeStamp和Guid?
VB版
declare @TableName sysname = 'myTableName' declare @prop varchar(max) PRINT 'Public Class ' + @TableName declare props cursor for select distinct ' public property ' + ColumnName + ' AS ' + ColumnType AS prop from ( select replace(col.name, ' ', '_') ColumnName, column_id, case typ.name when 'bigint' then 'long' when 'binary' then 'byte[]' when 'bit' then 'boolean' when 'char' then 'string' when 'date' then 'DateTime' when 'datetime' then 'DateTime' when 'datetime2' then 'DateTime' when 'datetimeoffset' then 'DateTimeOffset' when 'decimal' then 'decimal' when 'float' then 'float' when 'image' then 'byte[]' when 'int' then 'integer' when 'money' then 'decimal' when 'nchar' then 'char' when 'ntext' then 'string' when 'numeric' then 'decimal' when 'nvarchar' then 'string' when 'real' then 'double' when 'smalldatetime' then 'DateTime' when 'smallint' then 'short' when 'smallmoney' then 'decimal' when 'text' then 'string' when 'time' then 'TimeSpan' when 'timestamp' then 'DateTime' when 'tinyint' then 'byte' when 'uniqueidentifier' then 'Guid' when 'varbinary' then 'byte[]' when 'varchar' then 'string' end ColumnType from sys.columns col join sys.types typ on col.system_type_id = typ.system_type_id where object_id = object_id(@TableName) ) t order by prop open props FETCH NEXT FROM props INTO @prop WHILE @@FETCH_STATUS = 0 BEGIN print @prop FETCH NEXT FROM props INTO @prop END close props DEALLOCATE props PRINT 'End Class'
有点晚了但我已经创建了一个Web工具来帮助从SQL结果,SQL表和SQL SP创建C#(或其他)对象.
sql2object.com
这可以非常安全,您必须键入所有属性和类型.
如果无法识别类型,将选择默认值.
我想给我2美分
0)QueryFirst https://marketplace.visualstudio.com/items?itemName=bbsimonbb.QueryFirst Query-first是一个visual studio扩展,用于在C#项目中智能地使用SQL.使用提供的.sql模板开发查询.当您保存文件时,Query-first运行您的查询,检索模式并生成两个类和一个接口:一个包装类,包含方法Execute(),ExecuteScalar(),ExecuteNonQuery()等,其相应的接口和POCO封装一系列结果.
1)Sql2Objects 从查询结果(但不是DAL)开始创建类
2)https://docs.microsoft.com/en-us/ef/ef6/resources/tools
3)https://visualstudiomagazine.com/articles/2012/12/11/sqlqueryresults-code-generation.aspx
4)http://www.codesmithtools.com/product/generator#features
如果您使用像Dapper这样的简单ORM,那么这些都很棒.
如果您使用.Net,则可以使用WriteXmlSchema方法在运行时使用任何DataSet生成XSD文件.http://msdn.microsoft.com/en-us/library/xt7k72x8(v=vs.110).aspx
像这样:
using (SqlConnection cnn = new SqlConnection(mConnStr)) { DataSet Data = new DataSet(); cnn.Open(); string sql = "SELECT * FROM Person"; using (SqlDataAdapter Da = new SqlDataAdapter(sql, cnn)) { try { Da.Fill(Data); Da.TableMappings.Add("Table", "Person"); Data.WriteXmlSchema(@"C:\Person.xsd"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } cnn.Close();
从那里,您可以使用xsd.exe从Developer Command Prompt创建一个可序列化XML的类. http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx
像这样:
xsd C:\Person.xsd /classes /language:CS
要打印出NULLABLE属性,请使用此属性.
它为CASE
声明块的Alex Aza脚本添加了一些修改.
declare @TableName sysname = 'TableName' declare @result varchar(max) = 'public class ' + @TableName + ' {' select @result = @result + ' public ' + ColumnType + ' ' + ColumnName + ' { get; set; } ' from ( select replace(col.name, ' ', '_') ColumnName, column_id, case typ.name when 'bigint' then 'long' when 'binary' then 'byte[]' when 'bit' then 'bool' when 'char' then 'string' when 'date' then 'DateTime' when 'datetime' then 'DateTime' when 'datetime2' then 'DateTime' when 'datetimeoffset' then 'DateTimeOffset' when 'decimal' then 'decimal' when 'float' then 'float' when 'image' then 'byte[]' when 'int' then 'int' when 'money' then 'decimal' when 'nchar' then 'char' when 'ntext' then 'string' when 'numeric' then 'decimal' when 'nvarchar' then 'string' when 'real' then 'double' when 'smalldatetime' then 'DateTime' when 'smallint' then 'short' when 'smallmoney' then 'decimal' when 'text' then 'string' when 'time' then 'TimeSpan' when 'timestamp' then 'DateTime' when 'tinyint' then 'byte' when 'uniqueidentifier' then 'Guid' when 'varbinary' then 'byte[]' when 'varchar' then 'string' else 'UNKNOWN_' + typ.name end + CASE WHEN col.is_nullable=1 AND typ.name NOT IN ( 'binary', 'varbinary', 'image', 'text', 'ntext', 'varchar', 'nvarchar', 'char', 'nchar') THEN '?' ELSE '' END AS [ColumnType] from sys.columns col join sys.types typ on col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id where object_id = object_id(@TableName) ) t order by column_id set @result = @result + ' }' print @result
我尝试使用上面的建议,并在此过程中改进了解决方案.
让我们假设您使用实现PropertyChanged事件的基类(在本例中为ObservableObject),您可以执行类似这样的操作.我可能会在我的博客sqljana.wordpress.com上写一篇博文
请替换前三个变量的值:
--These three things have to be substituted (when called from Powershell, they are replaced before execution) DECLARE @Schema VARCHAR(MAX) = N'&Schema' DECLARE @TableName VARCHAR(MAX) = N'&TableName' DECLARE @Namespace VARCHAR(MAX) = N'&Namespace' DECLARE @CRLF VARCHAR(2) = CHAR(13) + CHAR(10); DECLARE @result VARCHAR(max) = ' ' DECLARE @PrivateProp VARCHAR(100) = @CRLF + CHAR(9) + CHAR(9) + 'private_ ;'; DECLARE @PublicProp VARCHAR(255) = @CRLF + CHAR(9) + CHAR(9) + 'public ' + @CRLF + CHAR(9) + CHAR(9) + '{ ' + @CRLF + CHAR(9) + CHAR(9) + ' get { return _ ; } ' + @CRLF + CHAR(9) + CHAR(9) + ' set ' + @CRLF + CHAR(9) + CHAR(9) + ' { ' + @CRLF + CHAR(9) + CHAR(9) + ' _ = value;' + @CRLF + CHAR(9) + CHAR(9) + ' base.RaisePropertyChanged();' + @CRLF + CHAR(9) + CHAR(9) + ' } ' + @CRLF + CHAR(9) + CHAR(9) + '}' + @CRLF; DECLARE @RPCProc VARCHAR(MAX) = @CRLF + CHAR(9) + CHAR(9) + 'public event PropertyChangedEventHandler PropertyChanged; ' + @CRLF + CHAR(9) + CHAR(9) + 'private void RaisePropertyChanged( ' + @CRLF + CHAR(9) + CHAR(9) + ' [CallerMemberName] string caller = "" ) ' + @CRLF + CHAR(9) + CHAR(9) + '{ ' + @CRLF + CHAR(9) + CHAR(9) + ' if (PropertyChanged != null) ' + @CRLF + CHAR(9) + CHAR(9) + ' { ' + @CRLF + CHAR(9) + CHAR(9) + ' PropertyChanged( this, new PropertyChangedEventArgs( caller ) ); ' + @CRLF + CHAR(9) + CHAR(9) + ' } ' + @CRLF + CHAR(9) + CHAR(9) + '}'; DECLARE @PropChanged VARCHAR(200) = @CRLF + CHAR(9) + CHAR(9) + 'protected override void AfterPropertyChanged(string propertyName) ' + @CRLF + CHAR(9) + CHAR(9) + '{ ' + @CRLF + CHAR(9) + CHAR(9) + ' System.Diagnostics.Debug.WriteLine("' + @TableName + ' property changed: " + propertyName); ' + @CRLF + CHAR(9) + CHAR(9) + '}'; SET @result = 'using System;' + @CRLF + @CRLF + 'using MyCompany.Business;' + @CRLF + @CRLF + 'namespace ' + @Namespace + @CRLF + '{' + @CRLF + ' public class ' + @TableName + ' : ObservableObject' + @CRLF + ' {' + @CRLF + ' #region Instance Properties' + @CRLF SELECT @result = @result + REPLACE( REPLACE(@PrivateProp , ' ', ColumnName) , ' ', ColumnType) + REPLACE( REPLACE(@PublicProp , ' ', ColumnName) , ' ', ColumnType) FROM ( SELECT c.COLUMN_NAME AS ColumnName , CASE c.DATA_TYPE WHEN 'bigint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int64?' ELSE 'Int64' END WHEN 'binary' THEN 'Byte[]' WHEN 'bit' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Boolean?' ELSE 'Boolean' END WHEN 'char' THEN 'String' WHEN 'date' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime2' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetimeoffset' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END WHEN 'decimal' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END WHEN 'float' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Single?' ELSE 'Single' END WHEN 'image' THEN 'Byte[]' WHEN 'int' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int32?' ELSE 'Int32' END WHEN 'money' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END WHEN 'nchar' THEN 'String' WHEN 'ntext' THEN 'String' WHEN 'numeric' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END WHEN 'nvarchar' THEN 'String' WHEN 'real' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Double?' ELSE 'Double' END WHEN 'smalldatetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'smallint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int16?' ELSE 'Int16'END WHEN 'smallmoney' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END WHEN 'text' THEN 'String' WHEN 'time' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END WHEN 'timestamp' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'tinyint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END WHEN 'uniqueidentifier' THEN 'Guid' WHEN 'varbinary' THEN 'Byte[]' WHEN 'varchar' THEN 'String' ELSE 'Object' END AS ColumnType , c.ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = @TableName AND ISNULL(@Schema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA ) t ORDER BY t.ORDINAL_POSITION SELECT @result = @result + @CRLF + CHAR(9) + '#endregion Instance Properties' + @CRLF + --CHAR(9) + @RPCProc + @CRLF + CHAR(9) + @PropChanged + @CRLF + CHAR(9) + '}' + @CRLF + @CRLF + '}' --SELECT @result PRINT @result
基类基于Josh Smith的文章来自http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/
我将类重命名为ObservableObject,并使用CallerMemberName属性利用了ac#5功能
//From http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/ // //Jana's change: Used c# 5 feature to bypass passing in the property name using [CallerMemberName] // protected void RaisePropertyChanged([CallerMemberName] string propertyName = "") using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; namespace MyCompany.Business { ////// Implements the INotifyPropertyChanged interface and /// exposes a RaisePropertyChanged method for derived /// classes to raise the PropertyChange event. The event /// arguments created by this class are cached to prevent /// managed heap fragmentation. /// [Serializable] public abstract class ObservableObject : INotifyPropertyChanged { #region Data private static readonly DictionaryeventArgCache; private const string ERROR_MSG = "{0} is not a public property of {1}"; #endregion // Data #region Constructors static ObservableObject() { eventArgCache = new Dictionary (); } protected ObservableObject() { } #endregion // Constructors #region Public Members /// /// Raised when a public property of this object is set. /// [field: NonSerialized] public event PropertyChangedEventHandler PropertyChanged; ////// Returns an instance of PropertyChangedEventArgs for /// the specified property name. /// /// /// The name of the property to create event args for. /// public static PropertyChangedEventArgs GetPropertyChangedEventArgs(string propertyName) { if (String.IsNullOrEmpty(propertyName)) throw new ArgumentException( "propertyName cannot be null or empty."); PropertyChangedEventArgs args; // Get the event args from the cache, creating them // and adding to the cache if necessary. lock (typeof(ObservableObject)) { bool isCached = eventArgCache.ContainsKey(propertyName); if (!isCached) { eventArgCache.Add( propertyName, new PropertyChangedEventArgs(propertyName)); } args = eventArgCache[propertyName]; } return args; } #endregion // Public Members #region Protected Members ////// Derived classes can override this method to /// execute logic after a property is set. The /// base implementation does nothing. /// /// /// The property which was changed. /// protected virtual void AfterPropertyChanged(string propertyName) { } ////// Attempts to raise the PropertyChanged event, and /// invokes the virtual AfterPropertyChanged method, /// regardless of whether the event was raised or not. /// /// /// The property which was changed. /// protected void RaisePropertyChanged([CallerMemberName] string propertyName = "") { this.VerifyProperty(propertyName); PropertyChangedEventHandler handler = this.PropertyChanged; if (handler != null) { // Get the cached event args. PropertyChangedEventArgs args = GetPropertyChangedEventArgs(propertyName); // Raise the PropertyChanged event. handler(this, args); } this.AfterPropertyChanged(propertyName); } #endregion // Protected Members #region Private Helpers [Conditional("DEBUG")] private void VerifyProperty(string propertyName) { Type type = this.GetType(); // Look for a public property with the specified name. PropertyInfo propInfo = type.GetProperty(propertyName); if (propInfo == null) { // The property could not be found, // so alert the developer of the problem. string msg = string.Format( ERROR_MSG, propertyName, type.FullName); Debug.Fail(msg); } } #endregion // Private Helpers } }
这是你们想要更多的部分.我构建了一个Powershell脚本来为SQL数据库中的所有表生成.它基于一个名为Chad Miller的Invoke-SQLCmd2 cmdlet的Powershell大师,可以从这里下载:http://gallery.technet.microsoft.com/ScriptCenter/7985b7ef-ed89-4dfd-b02a-433cc4e30894/
拥有该cmdlet后,为所有表生成的Powershell脚本变得简单(请使用您的特定值替换变量).
. C:\MyScripts\Invoke-Sqlcmd2.ps1 $serverInstance = "MySQLInstance" $databaseName = "MyDb" $generatorSQLFile = "C:\MyScripts\ModelGen.sql" $tableListSQL = "SELECT name FROM $databaseName.sys.tables" $outputFolder = "C:\MyScripts\Output\" $namespace = "MyCompany.Business" $placeHolderSchema = "&Schema" $placeHolderTableName = "&TableName" $placeHolderNamespace = "&Namespace" #Get the list of tables in the database to generate c# models for $tables = Invoke-Sqlcmd2 -ServerInstance $serverInstance -Database $databaseName -Query $tableListSQL -As DataRow -Verbose foreach ($table in $tables) { $table1 = $table[0] $outputFile = "$outputFolder\$table1.cs" #Replace variables with values (returns an array that we convert to a string to use as query) $generatorSQLFileWSubstitutions = (Get-Content $generatorSQLFile). Replace($placeHolderSchema,"dbo"). Replace($placeHolderTableName, $table1). Replace($placeHolderNamespace, $namespace) | Out-String "Ouputing for $table1 to $outputFile" #The command generates .cs file content for model using "PRINT" statements which then gets written to verbose output (stream 4) # ...capture the verbose output and redirect to a file (Invoke-Sqlcmd2 -ServerInstance $serverInstance -Database $databaseName -Query $generatorSQLFileWSubstitutions -Verbose) 4> $outputFile }