Ms Sql Tabloyu C# Classına Çevirme

Ms Sql Tabloyu C# Classına Çevirme

Merhabalar, bu yazımda bazılarımız için hayat kurtaran, bazılarımız için ise işleri ciddi manada hızlandıran bir konudan bahsedeceğim. Aslında bu bahsedeceğim konu ile alakalı Entity Framework kullananlar aşinadır zaten. Biz class yazıyoruz onu sistem otomatik INSERT, UPDATE, SELECT e çeviriyor diye. Entity kullanmayanlar için benzer bir kolaylık sağlıyoruz 🙂

Stackoverflow’da bu konu daha önce sorulmuş ve onaylanmış bir cevabı mevcut, ne var ki o onaylanmış cevabı kullandığımız zaman her zaman düzgün sonuç alamıyor, “-e o zaman neden onaylı cevap?” diyebilirsiniz. Eğer ki tablomuzda bulunan kolon sayısı fazla ise o zaman nvarchar(max) veri tipinin sınırlarına ulaşıyor ve bütün alanları alamıyor, ben size daha kesin bir çözüm sunuyorum. Kendi test ettiğim, üzerinde oynamalar yaptığım ve onayladığım bir kodu sizinle paylaşıyorum.

DECLARE @tableName varchar(100)
 
SET @tableName = 'Çevrilecek Tablo adı'
print 'public class ' + @tableName + '
{'
 SET NOCOUNT ON
DECLARE @TABLE TABLE(id int identity(1, 1), name varchar(100), typeName nvarchar(100))
INSERT INTO @TABLE (name, typeName)
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 '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 as typeName 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)
SELECT @columnName = name, @columnType = typeName 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'
 
SET @rowString =  '	public ' + @columnType + ' ' + @columnName + ' { get; set; }
'
SET NOCOUNT OFF
 PRINT @rowString
SET @i = @i + 1
END

-- You can also use SELECT instead of PRINT.
print '}'

Kullanımı oldukça kolay, tablosunu class’a çevirmek istediğimiz veritabanında bu kodu çalıştırıyoruz. Tabi önce sorgumuzda ki tablo adı kısmını düzenliyoruz 🙂

Paylaş :

Bu gönderiyi paylaş

Comment (1)

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.