MSSQL Tablosunu C# Sınıfına Çevirme

MSSQL Tablosunu C# Sınıfına Çevirme

Merhabalar, MSSQL tablosu C# sınıfına çevirme işlemini anlatacağım. Daha önce yayınlamış olduğum MSSQL Tablosunu C# Class’ına Çevirme yazısında zaten size bir MsSql Tablosunu C# sınıfı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 🙂 burada bazı güncellemeler yapıldı varsayılan değerler için. Kendi kullanımınıza göre düzenleyebilirsiniz. DateTime tipi için MSSQL’in kabul ettiği minimum tarih olan 30 Aralık 1899 tarihi bilerek seçildi, C# üzerinde geliştirdiğim Conversion Sınıfında tarih formatını düzgün göstermekte işimize yarıyor. NULL değer atamaktansa 30 aralık 1899 tarihini NULL değer olarak kabul ediyor ve işlerimizi ona göre şekillendiriyoruz. Ben genellikle kolon isimlerimde “create_date” ve “lastup_date” gibi bir kayıt kontrol kolonu kullandığım için bunlarıda otomatik olarak günün tarihi gelmesi için “DateTime.Now” ile değiştiriyoruz. Muhakkak eksik yazdığım başlangıç değerleri olacaktır, ihtiyaçlarınıza göre onları kendiniz eklemelisiniz.

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

DECLARE @startValue nvarchar(max) = ''

SET @startValue = 

CASE @columnType 
	WHEN 'string' THEN ' = ""' 
	WHEN 'double' THEN ' = 0.0'
	WHEN 'decimal' THEN ' = 0.0'
	WHEN 'int' THEN ' = 0'
	WHEN 'Guid' THEN ' = Guid.Empty'
	WHEN 'bool' THEN ' = false'
	WHEN 'short' THEN ' = 0'
	WHEN 'byte' THEN ' = 0'
	WHEN 'DateTime' THEN ' = new DateTime(1899, 12, 30, 0, 0, 0)'
	WHEN 'byte[]' THEN ' = null'
	ELSE ''
END

IF @columnName LIKE '%create_date%' OR @columnName LIKE '%lastup_date%'
BEGIN SET @startValue = ' = DateTime.Now' END

SET @rowString = '	private ' + @columnType + ' _' + @columnName + @startValue +';
'
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 @rowString = REPLACE(@rowString, '[MaxLength(0)]', '')
SET NOCOUNT OFF
 PRINT @rowString
SET @i = @i + 1
END

print '}'
Paylaş :

Bu gönderiyi paylaş

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.