Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Veritabanı tablosundan class oluşturma
#1
Merhaba,

Yeni projelerimizden birisinde oluşan ihtiyaca binaen oluşturulan bir çözüm yöntemini sizlerle paylaşmak istiyorum.

Kısaca bahsetmek gerekirse;

ORM (Object-relational-mapping) yani nesne ilişkisel işaretleme prensibine başvurduğumuz çatı ve yapılar bulunuyor. .Net tabanında geliştirilen bu projede çok hızlı tablo-sınıf üretimi yapmak gerekiyordu. SQL Server ve Oracle veritabanlarında oluşturulan tablolar ve tabloların veri tiplerine göre yazılan bir sorgu ile C# kod çıktısı ürettim. Siz de ihtiyaçlarınız için dilediğiniz dil, yapı, kod ve kod bloklarını üretebilirsiniz.

Kullanıcılar isminde bir tablo oluşturalım.


CREATE TABLE [dbo].[Kullanicilar](
[Id] [int] IDENTITY(1,1) NOT NULL,
[AdiSoyadi] [nvarchar](100) NOT NULL,
[KullaniciAdi] [nvarchar](50) NOT NULL,
[KullaniciSifre] [nvarchar](20) NOT NULL,
[Durumu] [tinyint] NOT NULL,
[OlusturmaTarihi] [datetime] NOT NULL,
CONSTRAINT [PK_Kullanicilar] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO


Şimdi bu Kullanıcılar tablosunun kolonlarını ve veri tiplerini alıp C#'ta sınıf olarak oluşturalım.

declare @TableName sysname = 'Kullanicilar'
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



Örnek Çıktı:

public class Kullanicilar
{
   public int Id { get; set; }

   public string AdiSoyadi { get; set; }

   public string KullaniciAdi { get; set; }

   public string KullaniciSifre { get; set; }

   public byte Durumu { get; set; }

   public DateTime OlusturmaTarihi { get; set; }

}

Daha fazlası için tıklayın
Cevapla
#2
Eline sağlık hocam, Benzer bir şey yazmayı düşünüyordum benden önce davranmışsın Wink
Cevapla
#3
Gerekli kodu veritabanının içinden doğrudan almak oldukça hoş fikir Abdullah kardeşim. İleride değer atama kodları da eklenebilir belki.

Ben de uzun yıllardır tablo yapısını record ile tutuyorum, ama sadece gerekli alanları. Aksi halde veritabanında en ufak değişiklikte sürekli bunu güncellemek sıkıcı.

TUye = record
  Ad:string;
  Soyad:string;
  ...
end;
PUye = ^TUye;

Sabit projelerde ise tüm alanları almak mümkün. Buna karşın PHP'deki anahtarlı dizilerin benzeri olarak TDictionary sınıfı kullanılırsa tüm veri alanlarını yazılımın içine gömmeye gerek kalmaz.

for sira=1 to sorgu.fieldcount
    Dict.Add(sorgu.fieldname[sıra], sorgu.Fields[sira].asString);
showmesaj( Dict['Uye'] );

Bir de bu tür durumlar için genellikle veritabanında özel sorgular oluşturup koddan doğrudan tablo yerine bu sorgulara erişmeyi tercih ettiğim olur.
Cevapla
#4
Çok teşekkürler.Elinize sağlık.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Fastreport İçindekiler Sayfası Oluşturma [ÇÖZÜLDÜ] bydelphi 1 181 18-03-2024, Saat: 12:11
Son Yorum: bydelphi
  server programinda hani veritabani dogru olur. sadikacar60 4 302 30-01-2024, Saat: 21:06
Son Yorum: sadikacar60
  COZULDU veritabani prg yerine ne kullanabilirim. sadikacar60 8 694 29-01-2024, Saat: 18:41
Son Yorum: sadikacar60
  SQL VeriTabanı Kopyalama Hk. glagher 4 575 10-09-2023, Saat: 14:18
Son Yorum: glagher
  Veritabanı FireDAC, Zeos, UniDAC kıyaslaması nguzeller 0 331 08-07-2023, Saat: 00:28
Son Yorum: nguzeller



Konuyu Okuyanlar: 1 Ziyaretçi