Yandex Metrica
MSSQL İle Otomatik Tablonun C# Sınıfını Oluşturmak - Yasin Sunmaz

Yasin Sunmaz

Kodladıkça değişen bir dünya...

MSSQL İle Otomatik Tablonun C# Sınıfını Oluşturmak

25.07.2022 yasinsunmaz 1357 0

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.

MSSQL İle Otomatik Tablonun C# Sınıfını Oluşturmak

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ı

SQL Sınıf Oluşturma

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.

Diğer Yazılar

SQL Server Synonym Nedir ve Nasıl Kullanılır?

09.01.2026 yasinsunmaz 252 0

Bu yazımda SQL Server'da oldukça faydalı olan synonym yapısını inceleyeceğiz. Veritabanı projelerinde zamanla tablo isimleri uzar, şema yapıları deği...

SQL Server Schema Kullanımı

10.12.2025 yasinsunmaz 270 0

Bu yazımda SQL Server'da oldukça faydalı olan schema yapısını inceleyeceğiz. SQL Server’da şema yapısı özellikle orta ve büyük ö...

SQL Server'da SELECT INTO ve INSERT INTO SELECT Kullanımı

31.05.2025 yasinsunmaz 853 0

Bu yazımda, SQL Server'da oldukça sık kullanılan ve günlük veri işlemlerinde hayat kurtaran iki komutu inceleyeceğiz: SELECT INTO ve INSERT INTO SELECT. Bu ...

SQL Server'da LAG() ve LEAD() Kullanımı

23.05.2025 yasinsunmaz 659 0

Bu yazımda SQL Server'da oldukça faydalı olan LAG() ve LEAD() fonksiyonlarını inceleyeceğiz. Bu fonksiyonlar, bir satırdaki veriye bakarken, o satırın öncesindeki v...

SQL Fonksiyonları: Veritabanlarında Güçlü ve Esnek İşlemler

09.06.2023 yasinsunmaz 1701 0

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...