17 Ocak 2007

Aspnet_Profile Tablosundan Alanları Sorgulamak

Membership kontrolleri ASP.net 2.0 la gelen yeniliklerden birisi. Kullanıcı ile ilgili bir çok modül hazır olarak bulunmakta. Varsayılan alanlar haricinde, kullandığımız özel alanlar aspnet_Profile tablosunda tek bir sütunda tutulur ve aspnet_User tablosuyla UserId alanından ilişkilendirilmiştir. Bir asp.net web sayfasında kullanacaksak problem yok, database den direk bu kayıtları görmemiz gerekirse işimiz pek de kolay değil. Bu tarz bir ihtiyaçta aşağıdaki fonksiyon kullanılabilir.

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

Eğer tablonuzda email alanı varsa ve siz her ihtimale karşı son noktada önlem almak istiyorsanız bir kaç adımda bunu halledeblirsiniz. Sql Server 2005 ve CLR kullanarak.

Ö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.