MSSQL Tablosunu C# Class’ına Çevirme V2
Merhabalar, daha önce yayınlamış olduğum MSSQL Tablosunu C# Class’ına Çevirme yazısında zaten size bir MsSql Tablosunu C# class’ına nasıl çevirebileceğimizden bahsetmiştim. Burada eklemeler yaptığım yeni versiyonunu paylaşıyorum. Bu versiyonun amacı önümüzdeki günlerde geliştireceğimiz bir framework için ön hazırlık yapmaktır. Yukarıda önceki makalenin linkini bulabilirsiniz. Burada ise yalnızca kodlar olacak iyi uygulamalar. Unutmadan belirtmek isterim ki bu versiyonda projemize 2 adet using eklememiz gerekiyor. Ek olarak bu versiyonda oluşturduğumuz class’a change propery yani bir değişken yeni bir veri alırsa bunu size notify ediyor, bu event’i kullanmak için tanımladığımız değişkenin içerisindeki PropertyChange eventini += ile yeni bir methoda yönlendirmek olacak. Böylelikle anlık işlem yapabileceğiz 🙂
using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Runtime.CompilerServices;
DECLARE @tableName varchar(100) SET @tableName = 'TABLO ADI BU ALANDA YER ALACAK' DECLARE @primaryKey nvarchar(max) SELECT @primaryKey = column_name FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME AND KU.table_name=@tableName ORDER BY KU.TABLE_NAME, KU.ORDINAL_POSITION print 'public class ' + @tableName + ' : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } ' SET NOCOUNT ON DECLARE @TABLE TABLE(id int identity(1, 1), name varchar(100), typeName nvarchar(100), size int, default_value nvarchar(max), is_nullable bit) INSERT INTO @TABLE (name, typeName, size, default_value, is_nullable) SELECT col.name, 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 '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 + CASE col.is_nullable WHEN 1 THEN '?' ELSE '' END as typeName, col.max_length, CASE WHEN object_definition(col.default_object_id) IS NOT NULL THEN SUBSTRING(object_definition(col.default_object_id), 2, LEN(object_definition(col.default_object_id)) - 2) ELSE '' END AS default_value, col.is_nullable 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) DECLARE @i int DECLARE @rowCount int SELECT @i = MIN(id), @rowCount = MAX(id) FROM @TABLE DECLARE @rowString varchar(MAX) SET @rowString = '' SET NOCOUNT OFF WHILE (@i <= @rowCount) BEGIN SET NOCOUNT ON DECLARE @columnName varchar(100) DECLARE @columnType nvarchar(100) DECLARE @columnSize int DECLARE @defaultValue nvarchar(max) DECLARE @isNullable bit SELECT @columnName = name, @columnType = typeName, @columnSize = size, @defaultValue = default_value, @isNullable = is_nullable FROM @TABLE WHERE id = @i DECLARE @columnValueTable TABLE(name varchar(100)) INSERT INTO @columnValueTable EXEC ('SELECT ' + @columnName + ' FROM ' + @tableName) DECLARE @columnValue varchar(100) SELECT @columnValue = name FROM @columnValueTable IF (@columnValue IS NULL) SET @columnValue = 'NULL' IF (@columnType = 'string?') SET @columnType = 'string' SET @rowString = ' private ' + @columnType + ' _' + @columnName + '; ' SET NOCOUNT OFF PRINT @rowString SET @i = @i + 1 END SELECT @i = MIN(id), @rowCount = MAX(id) FROM @TABLE SET @rowString = '' SET NOCOUNT OFF WHILE (@i <= @rowCount) BEGIN SET NOCOUNT ON SELECT @columnName = name, @columnType = typeName, @columnSize = size, @defaultValue = default_value, @isNullable = is_nullable FROM @TABLE WHERE id = @i DECLARE @columnValueTable2 TABLE(name varchar(100)) INSERT INTO @columnValueTable2 EXEC ('SELECT ' + @columnName + ' FROM ' + @tableName) DECLARE @columnValue2 varchar(100) SELECT @columnValue2 = name FROM @columnValueTable2 IF (@columnValue2 IS NULL) SET @columnValue2 = 'NULL' IF (@columnType = 'string?') SET @columnType = 'string' SET @rowString = CASE WHEN @columnName = @primaryKey THEN ' [Key] ' ELSE '' END + CASE WHEN @isNullable = 0 THEN ' [Required] ' ELSE '' END + CASE WHEN @columnType = 'string' THEN ' [MaxLength(' + CAST(@columnSize / 2 as nvarchar(max)) + ')] ' ELSE '' END + CASE WHEN @defaultValue <> '' THEN ' [Description("' + @defaultValue + '")] ' ELSE '' END + ' public ' + @columnType + ' ' + @columnName + ' { get { return _' + @columnName + '; } set { if(value != _' + @columnName + ') { this._' + @columnName + ' = value; NotifyPropertyChanged(); } } } ' SET NOCOUNT OFF PRINT @rowString SET @i = @i + 1 END print '}'
Bir yanıt yazın
Yorum yapabilmek için giriş yapmalısınız.