Veritabanı tablosundan class oluşturma

30.10.2018

 

Veritabanı tamamlanan projelerinizde eğer Entity Framework gibi ORM yapılarına başvuruyorsanız, ihtiyacınız olan varlık sınıflarınızı kendi usulünüze göre kolaylıkla oluşturabilirsiniz.

public class Kisi 
{
public string Adi { get;set; }
public string Telefonu { get;set; }
}

Yukarıdaki örnekte gözüken Kişi tablosu ve içindeki Adı ile Telefonu alanlarını veritabanından otomatik olarak çekebileceğiniz küçük bir sorgu var.

SQL'de tanımlı tüm veri tiplerinin C# karşılıklarıyla ve sizin oluşturacağınız maskeye göre getirilmesini sağlayan örnek bir sorgu;

/* Oluşturulacak sınıfın tablo ismini buraya yazın */ 
declare @TableName sysname = 'Kisi'
select 'public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; } ' as Prop 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

Yukarıdaki örnek sınıf için bu kodun çıktısı şöyle olacaktır;

public string Adi { get;set; }
public string Telefonu { get;set; }

 

Bonus

Oluşturacağınız tabloya ait diğer belirteçleri de ekleyip print yada select ile çıktısını üretebilirsiniz.

/* Oluşturulacak sınıfın tablo ismini buraya yazın */ 
declare @TableName sysname = 'Kisi'
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

Yukarıdaki örnek sınıf için bu kodun çıktısı da şöyle olacaktır;

public class Kisi  
{
public string Adi { get;set; }
public string Telefonu { get;set; }
}