MSSQL Tablosunu C# Class’ına Çevirme V2

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 '}'

Bu gönderiyi paylaş

Bir yanıt yazın