MSSQL Tablosunu C# Sınıfına Çevirme
Merhabalar, MSSQL tablosu C# sınıfına çevirme işlemini anlatacağım. Daha önce yayınlamış olduğum MSSQL Tablosunu C# Class’ına Çevirme yazısında zaten size bir MsSql Tablosunu C# sınıfına nasıl çevirebileceğimizden bahsetmiştim. Burada eklemeler yaptığım yeni versiyonunu paylaşıyorum. Bu versiyonun amacı önümüzdeki günlerde geliştireceğimiz bir framework için ön hazırlık yapmaktır. Yukarıda önceki makalenin linkini bulabilirsiniz. Burada ise yalnızca kodlar olacak iyi uygulamalar. Unutmadan belirtmek isterim ki bu versiyonda projemize 2 adet using eklememiz gerekiyor. Ek olarak bu versiyonda oluşturduğumuz class’a change propery yani bir değişken yeni bir veri alırsa bunu size notify ediyor, bu event’i kullanmak için tanımladığımız değişkenin içerisindeki PropertyChange eventini += ile yeni bir methoda yönlendirmek olacak. Böylelikle anlık işlem yapabileceğiz 🙂 burada bazı güncellemeler yapıldı varsayılan değerler için. Kendi kullanımınıza göre düzenleyebilirsiniz. DateTime tipi için MSSQL’in kabul ettiği minimum tarih olan 30 Aralık 1899 tarihi bilerek seçildi, C# üzerinde geliştirdiğim Conversion Sınıfında tarih formatını düzgün göstermekte işimize yarıyor. NULL değer atamaktansa 30 aralık 1899 tarihini NULL değer olarak kabul ediyor ve işlerimizi ona göre şekillendiriyoruz. Ben genellikle kolon isimlerimde “create_date” ve “lastup_date” gibi bir kayıt kontrol kolonu kullandığım için bunlarıda otomatik olarak günün tarihi gelmesi için “DateTime.Now” ile değiştiriyoruz. Muhakkak eksik yazdığım başlangıç değerleri olacaktır, ihtiyaçlarınıza göre onları kendiniz eklemelisiniz.
using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Runtime.CompilerServices;
DECLARE @tableName varchar(100) SET @tableName = 'TABLO ADI BU ALANDA YER ALACAK' DECLARE @primaryKey nvarchar(max) SELECT @primaryKey = column_name FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME AND KU.table_name=@tableName ORDER BY KU.TABLE_NAME, KU.ORDINAL_POSITION print 'public class ' + @tableName + ' : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } ' SET NOCOUNT ON DECLARE @TABLE TABLE(id int identity(1, 1), name varchar(100), typeName nvarchar(100), size int, default_value nvarchar(max), is_nullable bit) INSERT INTO @TABLE (name, typeName, size, default_value, is_nullable) SELECT col.name, 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 'double' 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 + CASE col.is_nullable WHEN 1 THEN '' ELSE '' END as typeName, col.max_length, CASE WHEN object_definition(col.default_object_id) IS NOT NULL THEN SUBSTRING(object_definition(col.default_object_id), 2, LEN(object_definition(col.default_object_id)) - 2) ELSE '' END AS default_value, col.is_nullable 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) DECLARE @i int DECLARE @rowCount int SELECT @i = MIN(id), @rowCount = MAX(id) FROM @TABLE DECLARE @rowString varchar(MAX) SET @rowString = '' SET NOCOUNT OFF WHILE (@i <= @rowCount) BEGIN SET NOCOUNT ON DECLARE @columnName varchar(100) DECLARE @columnType nvarchar(100) DECLARE @columnSize int DECLARE @defaultValue nvarchar(max) DECLARE @isNullable bit SELECT @columnName = name, @columnType = typeName, @columnSize = size, @defaultValue = default_value, @isNullable = is_nullable FROM @TABLE WHERE id = @i IF (@columnType = 'string?') SET @columnType = 'string' DECLARE @startValue nvarchar(max) = '' SET @startValue = CASE @columnType WHEN 'string' THEN ' = ""' WHEN 'double' THEN ' = 0.0' WHEN 'decimal' THEN ' = 0.0' WHEN 'int' THEN ' = 0' WHEN 'Guid' THEN ' = Guid.Empty' WHEN 'bool' THEN ' = false' WHEN 'short' THEN ' = 0' WHEN 'byte' THEN ' = 0' WHEN 'DateTime' THEN ' = new DateTime(1899, 12, 30, 0, 0, 0)' WHEN 'byte[]' THEN ' = null' ELSE '' END IF @columnName LIKE '%create_date%' OR @columnName LIKE '%lastup_date%' BEGIN SET @startValue = ' = DateTime.Now' END SET @rowString = ' private ' + @columnType + ' _' + @columnName + @startValue +'; ' SET NOCOUNT OFF PRINT @rowString SET @i = @i + 1 END SELECT @i = MIN(id), @rowCount = MAX(id) FROM @TABLE SET @rowString = '' SET NOCOUNT OFF WHILE (@i <= @rowCount) BEGIN SET NOCOUNT ON SELECT @columnName = name, @columnType = typeName, @columnSize = size, @defaultValue = default_value, @isNullable = is_nullable FROM @TABLE WHERE id = @i IF (@columnType = 'string?') SET @columnType = 'string' SET @rowString = CASE WHEN @columnName = @primaryKey THEN ' [Key] ' ELSE '' END + CASE WHEN @isNullable = 0 THEN ' [Required] ' ELSE '' END + CASE WHEN @columnType = 'string' THEN ' [MaxLength(' + CAST(@columnSize / 2 as nvarchar(max)) + ')] ' ELSE '' END + CASE WHEN @defaultValue <> '' THEN ' [Description("' + @defaultValue + '")] ' ELSE '' END + ' public ' + @columnType + ' ' + @columnName + ' { get { return _' + @columnName + '; } set { if(value != _' + @columnName + ') { this._' + @columnName + ' = value; NotifyPropertyChanged(); } } } ' SET @rowString = REPLACE(@rowString, '[MaxLength(0)]', '') SET NOCOUNT OFF PRINT @rowString SET @i = @i + 1 END print '}'
Bir yanıt yazın