Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi
Ön Sipariş Talebinde Bulunan Üyelerimiz
Sipariş Talebinde Bulunan Üyelerimiz

Konuyu Paylaş : facebook gplus twitter

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 Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
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.
WWW
Cevapla
#4
Çok teşekkürler.Elinize sağlık.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Aynı türden iki class'ı nasıl klonlarız? uparlayan 20 889 15-09-2018, Saat: 10:41
Son Yorum: ismailkocacan
  EFatura xml oluşturma ile ilgili kütüphane bilen? witalihakko 8 553 09-08-2018, Saat: 16:19
Son Yorum: witalihakko
  UDL Dosya Oluşturma Bay_Y 6 330 01-08-2018, Saat: 13:24
Son Yorum: Bay_Y
  Veritabanı hakkında mehmetalpgozbasi 4 402 19-06-2018, Saat: 12:57
Son Yorum: mehmetalpgozbasi
  Veritabanı güncelleme malitutuncu 9 596 19-06-2018, Saat: 09:50
Son Yorum: malitutuncu



Konuyu Okuyanlar: 1 Ziyaretçi