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 1024 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 Fonksiyonları: Veritabanlarında Güçlü ve Esnek İşlemler

09.06.2023 yasinsunmaz 300 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...

SQL'e Dair Her Şey OneSQL'de, Ne Ararsanız Bulabileceksiniz

03.06.2023 yasinsunmaz 252 0

Veri tabanı yöneticilerinin yanında zaman zaman yazılımcıların da SQL'i aktif olarak kullanması gerekebiliyor. SQL'i belli başlı şekillder kullanıp işlemlerimizi ...

SQL Server Offset Fetch Kullanımı

06.03.2023 yasinsunmaz 637 0

Merhabalar uzun zamandır yazı yazamadım. Ülke olarak zor zamanlar geçirmekteyiz. Herkese çok geçmiş olsun diyerek kısa bir yazı ile tekrar buradayım. SQL ...

SQL Server Sequence Kullanımı

14.01.2023 yasinsunmaz 1241 0

Veritabanında yeni keşfettiğim Sequence özelliğini sizlerle paylaşmak isterim. Squence genel olarak belirli değerler arasında numeric ve sıralı sayılar üretir. ...

SQL Server OUTPUT Kullanımı Silinen Kaydın Bilgilerini Geriye Döndürme

11.01.2023 yasinsunmaz 368 0

Bu yazımda SQL Server'da OUTPUT ile DELETED komutunun yapısını inceleyeceğiz. Kayıtlar üzerinde yapılan silme işlemlerinde, kaydın bilgilerin...