SQL (Structured Query Language), veritabanı yönetim sistemlerinde verileri yönetmek, sorgulamak ve işlemek için yaygın olarak kullanılan bir dildir. SQL fonksiyonl...
MSSQL İle Otomatik Tablonun C# Sınıfını Oluşturmak
Projelerde yeni geliştireceğimiz modüller için veri tabanına yeni tablolar eklememiz gerekiyor. Durum böyle olunca oluşturduğumuz tablonun c# tarafında sınıfını oluşturmamız gerekiyor. Bu durumda da tablodan alanları ve veri tiplerini bakarak sınıfı oluşturmak durumunda kalıyoruz. Bunun yerine SQL kodu ile istediğimiz tablonun alanları ve veri tipleri ile beraber sınıfını görüntüleyebiliyoruz. Sınıflarınızı oluştururken büyük kolaylık sağlayacağını düşünüyorum.
SQL Kodu
DECLARE @TableName SYSNAME = 'TableName' 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
Uygulama
TableName alanına hangi tablonun c# sınıfını oluşturmak istiyorsanız onu yazmanız yeterli. Sonrasında Execute ederek sonucu alabilirsiniz. Bu sayede sınıflarını çok hız bir şekilde oluşturabileceksiniz. Örnek olarak Customers tablosu için ilgili kodu çalıştırdığımızda aşağıdaki gibi sonuç dönecektir.
Otomatik Procedure Üzerinden Tablonun Sınıfını Oluşturmak
İstenilen tablonun sınıfını tablo olarak çıktı veren procedure'ü bir kere çalıştırıp sonrasında tekrar tekrar kolayca kullanabilirsiniz.
CREATE PROCEDURE dbo.GenerateClassFromTable @TableName3 NVARCHAR(128), @ClassDefinition NVARCHAR(MAX) OUTPUT AS BEGIN DECLARE @TableName SYSNAME = @TableName3 DECLARE @Result VARCHAR(MAX) = 'public class ' + @TableName + '{'
SELECT @Result = @Result + ' public ' + ColumnType + NullableSign + ' ' + REPLACE((SELECT STRING_AGG(UPPER(SUBSTRING(s.word, 1, 1)) + REPLACE(LOWER(SUBSTRING(s.word, 2, LEN(s.word))), 'ı', 'i'), ' ') AS CumleBasHarfleriBuyuk FROM (SELECT value AS word FROM STRING_SPLIT(ColumnName, ' ')) AS s) , ' ', '') + ' { get; set; }' FROM (SELECT REPLACE(col.name, '_', ' ') ColumnName, col.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
SET @Result = @Result + '}' SET @ClassDefinition = @Result END;
Kullanımı
Aşağıdaki SQL sorgusu ile 'TableName' yazan alana istediğiniz tablonun adını yazıp ilgili tabloya ait sınıf tanımını elde edebilirsiniz.
DECLARE @ClassDef NVARCHAR(MAX)
EXEC dbo.GenerateClassFromTable 'TableName', @ClassDef OUTPUT
SELECT @ClassDef AS ClassDefinition
Örnek Çıktısı
Umarım faydalı olur. İyi çalışmalar dilerim.
Kaynak:
https://stackoverflow.com/questions/5873170/generate-class-from-database-table
Yorum yapabilmek için giriş yapmalısınız. Giriş yapmak için tıklayınız.