17 Ocak 2007
Aspnet_Profile Tablosundan Alanları Sorgulamak
aspnet_Profile.PropertyNames : Profil alanların isim ve pozisyonlarının tutulduğu sütun
aspnet_Profile.PropertyValuesString : Profil değerlerinin tutulduğu sütun
CREATE FUNCTION [dbo].[GetProfileProperty](
@profileName varchar(50),
@PropertyNames varchar(8000),
@PropertyValuesString varchar(8000)
)
RETURNS varchar(500)
AS
BEGIN
DECLARE @MyOutput varchar(1000)
SET @MyOutput=substring (
@PropertyValuesString,
convert(int,(substring(@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 3,
(charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 3)- charindex(@ProfileName,@PropertyNames,1) - len(@ProfileName) - 3))
)) + 1,
convert(int,(substring(@PropertyNames,charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1,
((charindex(':',@PropertyNames,charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1))-(charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1)
))))
)
RETURN @MyOutput
END
Bu fonksiyonu kullanarak,
SELECT dbo.GetProfileProperty('Firma',PropertyNames,PropertyValuesString)
FROM dbo.aspnet_Profile
cümlesiyle tüm kullanıcıların firma bilgisini alabiliriz.
05 Ocak 2007
Tabloda Email Kontrollü Kolon Yaratmak
Önce bir C# fonksiyona ihtiyacımız var. RegEx kullanan basit bir fonksiyon.
public class clsEmailValidator
{
public static int ValidatePostaFormat(string email)
{
string regExPattern = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}[0-9]{1,3})(\]?)$";
System.Text.RegularExpressions.Regex regEx = new System.Text.RegularExpressions.Regex(regExPattern);
if (email.Length != 0 & !regEx.IsMatch(email))
{
return 0;
}
{
return 1;
}
}
}
Daha sonra Sql Server 2005'te bir assembly oluşturalım;
CREATE ASSEMBLY EmailValidator
FROM 'C:\Documents and Settings\harunp\My Documents\Visual Studio 2005\Projects\EmailValidator\EmailValidator\bin\Debug\EmailValidator.dll'
Sonra bu assembly i kullanan bir email validasyon fonksiyonu yaratalım.
CREATE FUNCTION ValidateEmail
(
@email nvarchar(80)
)
RETURNS int
AS EXTERNAL NAME EmailValidator.clsEmailValidator.ValidatePostaFormat
Sonra bu fonksiyonu kullanacağımız bir tablo yaratalım. Tek yapmamız gereken fark email alanını yaratırken bir koşul eklemek.
CREATE TABLE [dbo].[tblUser](
[ad] [nvarchar](80),
[soyad] [nvarchar](80),
[email] [nvarchar](80) CHECK ([dbo].[ValidateEmail]([email])=(1))
)
INSERT INTO tblUser(ad,soyad,email)
VALUES('harun','pekşen','test@test.com')
(1 row(s) affected)
INSERT INTO tblUser(ad,soyad,email)
VALUES('harun','pekşen','testtest.com')
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CK__tblUser__email__412EB0B6". The conflict occurred in database "Test", table "dbo.tblUser", column 'email'.
The statement has been terminated.
Değer email formatında olmadığı için tabloya insert edilemedi. Bu yöntemle geçersiz bir email adresinin veritabanına girişini son noktada kontrol etmiş oluruz.
12 Aralık 2006
Tek Kolonda Tutulan Çoklu Değerler
Böyle bir durumla karşılaşırsak yazacağımız bir Split fonksiyonuyla işimizi kolaylaştırabiliriz.
Alan değerimizin izlenen TV kanalları olduğunu varsayalım. Değerleri de;
1: ATV
2: KANAL D
3: SHOW TV
4: NTV
5: CNN TURK
olsun. Ayırıcı işaret olarak ";" kullandığımızı varsayalım.
--Önce Split fonksiyonunu yazalım;
CREATE FUNCTION [dbo].[Split] (@Str NVARCHAR(500), @Delimiter CHAR(1))
RETURNS @Results TABLE (Rows nvarchar(4000))
AS
BEGIN
DECLARE @Indx INT
DECLARE @Prt NVARCHAR(4000)
SELECT @Indx = 1
IF @Str Is NULL RETURN
WHILE @Indx != 0
BEGIN
SELECT @Indx = CharIndex(@Delimiter, @Str)
IF @Indx != 0
SELECT @Prt = left(@Str, @Indx - 1)
ELSE
SELECT @Prt = @Str
IF (@Prt!='0' and @Prt!='') INSERT INTO @Results(Rows) VALUES (@Prt)
SELECT @Str = right(@Str, Len(@Str) - @Indx)
IF Len(@Str) = 0 BREAK
END
RETURN
END
Daha sonra test için bir kullanıcı tablosu yaratalım,
CREATE TABLE [dbo].[UserInfo](
[userid] [int] NOT NULL,
[Email] [varchar](100) COLLATE Turkish_CI_AS NOT NULL,
[channel] [varchar](100) COLLATE Turkish_CI_AS NOT NULL
)
Sonra bu tabloya test kayıtları ekleyelim
INSERT INTO [dbo].[UserInfo](userid,Email,Channel)
VALUES (887,'test1@test.com','1;0;0;4;5')
INSERT INTO [dbo].[UserInfo](userid,Email,Channel)
VALUES (965,'test2@test.com','1;0;3;0;0')
Daha sonra kanal seçim tablosunu oluşturalım
CREATE TABLE [dbo].[Channels](
[userid] [int] NOT NULL,
[Channel] [int] NOT NULL
)
Yazdığımız Split fonksiyonunu kullanarak kayıtları ekleyelim
DECLARE @channel varchar(200)
DECLARE @userid varchar(200)
DECLARE @cr_channel CURSOR
SET @cr_channel = CURSOR FOR
SELECT channel,userid FROM dbo.UserInfo
OPEN @cr_channel
FETCH NEXT FROM @cr_channel INTO @channel,@userid
WHILE ( @@FETCH_STATUS = 0)
BEGIN
INSERT INTO Channels(userid, channel)
SELECT @userid, * From Split (@channel,';')
FETCH NEXT FROM @cr_channel INTO @channel,@userid
END
Channels tablosunda userid ve Channel olarak satır bazlı kayıtlarımız oluştu. Bu kayıtları artık çok rahat bir şekilde kullanabiliriz.
07 Aralık 2006
Delete Ve Truncate Komutları Arasındaki Fark
DELETE komutunda işlem sonunda satırlar fiziksel olarak silinir ve satır bazlı olarak loglanır. Bu yüzden yüksek miktarda satıra DELETE işlemi sık periyotta uygulandığında log file zamanla büyük boyutlara ulaşacaktır. TRUNCATE komutu da loglama yapar;fakat farklı bir yolla. TRUNCATE komutu işleme tabi tutulan tablodaki kayıtları bulunduğu pagefile ları işaretler. Aslında TRUNCATE işleminde data silinmeyip daha sonra kullanılmak üzere işaretlenmektedir. Bu da TRUNCATE işleminin DELETE işlemine göre çok daha performanslı çalışmasını sağlar.
DELETE komutu Foreign Key veya diğer Constraint lere zarar vermeden kayıtları siler.
Foreign Key Constraint i olan bir tabloya TRUNCATE işlemi uygulanamaz. Önce Constraint lerin silinip, TRUNCATE işleminden sonra tekrar tanımlanması gerekecektir. Ayrıca bu işlemi yapacak olan user ın db_owner,ddl_admin veya owner haklarından birisine sahip olması gerekir.
TRUNCATE işlemi sonunsa Identity alan değerleri ilk değerlerinden tekrar başlar. Örneğin 1'den başlayan Identity değeri olan ve içerisinde 100 satır bulunan bir tablo olduğunu varsayalım. TRUNCATE işlemi sonunda boş tabloya bir satır eklediğimizde alacağı değer 1 dir, fakat DELETE işleminden sonra bu değer 101 olacaktır.
06 Kasım 2006
Sql Server'da Lock Yönetimi
Veritabanı yöneticisi için lock ların yönetilmesi bir zorunluluktur. Çok sayıda lock oluşan sistemlerde çözüm olarak; lockların hangi sayıda oluştuğu, hangi proseslerde daha fazla oluştuğu ve hangi frekansta lock ların oluştuğu izlenmelidir.
Sistemde transaction sayısı fazlaysa veya aynı kaynağa ulaşan uygulama sayısı fazlaysa lock lar oluşacaktır.Lock oluştuğu tespit edilen kaynak üzerinde işlem yapan prosesleri sınırlandırmak bir çözüm olabilir.
İzleme aşamasında sql server 2000 de bulunan sp_lock prosedürü lock ları listelememizi sağlar. Bu prosedür master database deki lock bilgilerinden lock detaylarını bize verir. Her lock için "granted","converting","waiting lock" gibi lock durumlarını görebiliriz.
EXECUTE sp_lock cümlesini çalıştırdığımızda;
spid, dbid, objid, indid, type, resource, mode, ve status kolonlarını görebiliriz. Bu veri aslında bize tam olarak açıklayıcı bir bilgi vermeyecektir.
spid sql server a yapılan bağlantının kimlik numarasıdır.
execute sp_who kullanarak o spid nin hangi user tarafından oluştuğunu görebiliriz.
dbid lock ın oluştuğu database id sini verir.
SELECT * FROM sysdatabases cümlesini kullanarak o database id nin hangi database i gösterdiğini bulabiliriz.
objid database de hangi nesnede lock oluştuğunu gösterir.
Master database inde SELECT * FROM sysobjects cümlesiyle tüm nesne detaylarını görebiliriz.
Bir kaç lock oluştuğunda izlenmesi kolay olabilir ama 1000 civarında lock oluşan bir uygulamada izlemek pek de kolay olmayacaktır. Ayrıca lock ları her listelememizde farklı bir kayıt seti alacağız. Bunun nedeni her an yeni lock ların oluşması ve eski lock ların serbest kalmasıdır.
Eğer aynı id ye sahip çok sayıda lock varsa bu proses büyük transactionlar içerir ve diğer transaction ları da etkiler. Bu durumda
DBCC INPUTBUFFER(spid) cümlesini çalıştırarak EventInfo bilgisini görebiliriz.
Yavaş çalışan sistemlerde çok fazla lock oluşacağını söyleyebiliriz. Lock lar genellikle bir kaynağı uzun süre kullanan yani esir alan uzun sorgulardan veya aynı kaynağı kullanmak zorunda olan iki kritik proses (deadlock) sebebiyle oluşur. Çözüm olarak genelde tercih edilen kill process işlemi bilhassa çok fazla lock oluşan sistemlerde iyi bir çözüm değildir. Tek çözüm lock ları analiz edecek bir sistem geliştirmektir. Bu analiz sonucunda uygulamada çeşitli değişiklikler yapıp lock ları en aza indirmek gerekecektir.
04 Kasım 2006
Yazılımda Konu Uzmanlığı
Yazılımı profosyonel meslek olarak seçenlerin veya seçmeyi düşünenlerin yaşadığı en büyük sıkıntı yeniliklere adapte olamamak denilebilir. Her yıl değişen yeni versiyonlarla birlikte gelen,değişen syntax lara ayak uydurmak,değişen veri tiplerine alışmak gibi sıkıntılara bir de diğer geliştirme ortamlarını takip ederek zaman içerisinde onların da kullanılabileceği ve geçiş yapılabileceği ihtimalini düşünerek değerlendirmek gerekmektedir. Aslında bu bahsettiğimiz sıkıntılar sadece kesin olarak yazılım uzmanlığını seçenler için geçerli. Eğer bu konu da tam olarak net değilse "hangi birine yetişeceğiz" tarzında veryansınlar başlamaktadır. Aslında önce bu konuyu aşmak gerekir. Daha sonra da uzmanlaşılacak bir platform belirlenmesi gerekmektedir. Bu kararı verirken platformun kullanım yüzdesi, gelişim tahmini, geçişin kolaylığı, çalışanların ne kadar kazandıkları gibi kriterleri yaklaşık olarak değerlendirdikten sonra kesinlikle birine odaklanmak gerekmektedir. İşe önce tüm platformlarda aynı derecede uzman olunamayacağı gerçeğinin kabul edilmesiyle başlanmalıdır. Bence tüm teknolojilerin bilinmesi göründüğü kadar büyük bir fayda sağlamayacaktır. Tabii ki platform uzmanlığı diğer teknolojilerin yok sayılması anlamına gelmez. Detaylara inmeden farkları bilmek, artıları ve eksileri bilmek güzel bir durum olacaktır. Platform seçimi kararı aslında bundan sonra çalışılacak işleri, yazılım geliştirirken yaşanılan zorluğu, alınan keyfi, kazanılan maaşı, bir kaç yıl sonraki kariyeri, hobi olarak hangi konuların takip edileceği gibi konuları belirleyecektir. Aslında tüm bunların derecelerini kişinin konusunda ne kadar uzman olduğu etkiler. Uzmanlık da aslında kişinin teknik altyapısı, yeteneği, hevesi, aldığı eğitimler, doğru işlerle ilgilenme oranı ve uzmanlığını pazarlayabilme yeteneğiyle doğru orantılıdır. Aslında daha da önemlisi bu uzmanlığı değişen şartlarda koruyabilmektir. Bir diğer gereksinim database programlama, database yönetimi, uml, sistem analizi, test standartları, dökümantasyon standartları,iş analizi gibi yan konularda uzmanlıktır. Aslında ideal yazılım süreçlerinde tüm bunlar yazılım geliştirici gibi ayrı bir pozisyon ve uzmanlık gerektirmektedir. İdeal şartların genelde uygulanamadığı ülkemizde bunların bir kısmı, bazen hepsi yazılım geliştiriciden beklenmektedir. Zorunluluk olarak yapılan bu konular aslında birer fırsat olarak görülebilir. Yatkın olunulan ve daha çok sevilen konunun uzmanlığı profesyonel olarak bu konudan para kazanma şekline dönüşebilir. Ben de belli bir deneyim süresinden sonra bu tarz uzmanlıklara kayıp, daha az kod yazma pozisyonlarının tercih edilmesini öneriyorum.
Bir kaç madde ile özetleyecek olursak;
* Uzmanlık alanını belirlemek. Odaklanmak. Konusunda en iyi olmak.
* Uzmanlık alanı olamayn diğer teknolojileri takip etmek.
* Esnek olmak. Yeniliğe açık olmak.
* Diğer uzmanların neler yaptığını anlamaya çalışmak.
* Tüm gelişimi uzun ve kısa vadeli ayrı planlarla belirleyip, uygulamasını kontrol etmek.
Sql Server Ce Üzerinde Rda Limitleri
* Büyük – küçük harf duyarlılığı
SQL Server CE veritabanı büyük-küçük harfe duyarlı değildir.
* Triggers
SQL Server CE veritabanı tirgger ları desteklemez, bu yüzden Pull metodu çalıştığında tablo üzerindeki trigger lar tepki vermeyebilir. Değişiklik yapılan tablolarda, SQL Server trigger ları push metoduyla geri gönderilen kayıtlar için çalışır. Trigger mantığında SET NOCOUNT ON şartına gerek duyulabilir. Bu durumda hiç bir kayıt etkilenmeyecektir, çünkü RDA push metodu için hiç bir kaydın etkilenmemesi durumu bir hata oluşturur.
* Tablolar ve kolonlar
Değişiklikleri izlenen tablolarda kullanılabilecek kolon sayısı 253’tür (255 - 2 sistem kolonları). SQL Server CE iki sistem kolonu için yer ayırır: S_BinaryKey ve S_Operation. Bu kolonlar korumalıdır ve RDA tablolar izlenirken kullanılır.
* Hesaplanmış kolonlar
Hesaplanmış kolonlar; bir kolonun değerinin bir veya bir kaç kolona bağlı olark değiştiği kolonlardır. Hesaplanmış kolonlar RDA metodunda desteklenemz . Pull metodu hesaplanmış kolonları içeren veri setlerinde hata almaktadır.
* Şema Limitleri
SQL Server CE kendi tabloları üzeirndeki değişiklikleri izleme özelliğine sahiptir. SQL Server CE tabloları üzerindeki tüm insert, update, delete işlemleri izlenir. Uygulama tüm bu izlenen değişiklikleri Push metoduyla SQL Server veritabanına aktarır.
RDA Pull ve Push metodlarıyla kayıtları izlerken iyimser bir yol izler. Pull metoduyla alınan kayıtlar SQL Server tarafından kilitlenmez. Uygulama Push metoduyla tüm izlediği değişiklikleri koşulsuz olarak SQL Server’a aktarır. Bu durum diğer SQL Server kullanıcılarının yaptığı değişikliklerin kaybolmasına neden olacağı için problem yaratabilir.
Pull ve Push metodları birbirinden farklı olarak bölümlenmiş işlemlerde kullanılmalıdır. Örneğin, izlenen Pull ve Push metodları herbiri tekil listelere sahip saha elemanlarının kullandığı uygulamalarda kullanılabilir.
İzlenen Pull metoduyla oluşturulan SQL Server CE tablosuna aşağıdaki değişiklikleri uygulayabilirsiniz.
- Identity kolonun artış miktarını değiştirmek
- Varolan sınırlamaları eklemek veya silmek.
- Yabancı anahtarları eklemek veya silmek
- İndeksleri eklemek veya silmek
- Tabloyu eklemek veya silmek
İzlenen Pull metodunun işlemi hala devam ederken aşağıdaki değişikliklerin hiç birini yapmayın. Bu değişikliklerin yapılması halinde SQL Server CE tablosunun silinip Pull işleminin yeniden yapılması gerekmektedir.
- Kolon eklemek, silmek veya ismini değiştirmek
- Tablo ismini değiştirmek
- Birincil anahtarı silmek
- Tanımlanan veri tiplerini değiştirmek
Kaynak: msdn.microsoft.com
Çevik Programlama
* Kişilere ve onların iletişimlerine, süreçlerden ve araçlardan
* Yazılımın çalışmasına, detaylı dökümantasyonundan
* Müşterinin sözüne, yapılan sözleşmeden
* Değişime açık olmaya, bir planı takip etmekten
daha fazla önem veriyoruz.
Sağ taraftakilerin değerini bilip sol taraftakilere daha fazla değer veriyoruz.
ve aşağıdaki prnsipleri izler;
* İlk önceliğimiz yazılımı müşteriye daha önce teslim etmek ve yazılımın kalitesini devamlı olarak sürdürerek müşteri memnuniyeti sağlamaktır.,
* Müşteri isteklerindeki değişiklikler development ın sonunda da olsa hoş karşılanır. Atik programlama sayesinde müşteri rakipleri karşısında avantaj sağlar.
* Yazılım versiyonlarını ulaştırma sıklığı, bir kaç haftadan bir kaç aya kadar varan zaman dilimlerinde mümkün olduğu kadar sık olarak tercih edilmelidir.
* Yazılım geliştiriciler ve müşteriler (veya müşteri ihtiyaçlarını yöneten müşteri temsilcileri) proje boyunca her gün bir miktar vakit geçirmelidir.
* Projeye istekli kişilerle başlanmalı, verimli çalışabilecekleri bir ortam yaratılmalı, istekleri yerine getirilmeli ve onlara güvenilmelidir.
* Yazılım geliştiricilere aktarılması gereken bilgiler veya geliştiricilerin kendi arasında birbirine aktarması gereken bilgiler kesinlikle yüz yüze aktarılmalıdır.
* Yazılımın çalışması geliştirme sürecinin birinci ölçütüdür.
* Atik programlama sürekli geliştirmeyi gerektirir. Sponsorlar, geliştiriciler ve kullanıcılar uzun bir süre belli bir hıza sahip olmalıdırlar.
* Teknik kaliteye ve iyi tasarıma sürekli dikkat etmek atikliği arttırır.
* Basitlik yapılmamış işin miktarını maksimize etme sanatıdır.
* En iyi mimariler, analizler ve tasarımlar kendi içerisinde iyi organize olmuş ekiplerden çıkar
* Takım belirli aralıklarla nasıl daha verimli çalışacağını düşünür ve daha sonra bu karara göre hareket eder
Eğer;
Hiç süreciniz ve hiç aracınız yoksa,
Takip edeceğiniz bir planınız yoksa,
Gereksinim analizi iyi yapılamıyorsa,
Geliştiriciler her şeye rağmen yine de motive olmuyorsa,
Müşteriye düşündüklerinizi anlatamıyorsanız,
Müşteri size düşündüklerini anlatamıyorsa,
Yazılım geliştiriciyle diyalog kuramıyorsanız,
Hala takım olamadıysanız,
Çevik Programlama ne yazık ki size bir fayda sağlamayacaktır
Kaynak:http://www.agilemanifesto.org