SQL Server 2005 - Hızlı El Kitabı
Skip Navigation Links.

ÖRNEK UYGULAMA(END POINT,CLR,XML,SCHEMA)

 

Bir veri tabanı yapıp orada insanların insanlar hakkındaki görüşlerini tutup bunlarıda diğer insanlarla paylaşmak istiyorum.Bir tablo oluşturmalıyım ve bu tabloya herkes kayıt girebilmeli.Ben uygulama geliştirmeyecem,sadece alt yapıyı hazırlayacam ve insanlar hangi dilde yazarlarsa yazsınlar benim bu veri tabanıma kayıt girebilecekler.Yalnız herkes kendi kafasına göre veri giremeyecek.Gorus adında bir tablom olacak ve bu tabloda Id,Icerik,Tarih bilgileri yer alacak.Kısıtlamalar şunlardır;

 

·         Id identity olacak.

·         Icerik XML dökümanı olacak ve XSD ile kontrol edilecek.XML dökümanı formatı şu şekilde olacak;

 

<Kayit>

    <Ad>Ahmet</Ad>

    <Arkadas>Mehmet</Arkadas>

    <Gorus>Mehmet iyidir.</Gorus>

    <Yer>İngilizce kursundan</Yer>

</Kayit>

 

 

·         Tarih üzerinde Default contraint olacak.

 

Her 100 kayıtta bir belirtilen bir mail adresine mail atacak.

 

Tablo  & XML Schema:

 

CREATE TABLE Gorus

(

      Id          INT IDENTITY(1,1) NOT NULL,

      Icerik      XML NOT NULL,

      Tarih SMALLDATETIME NOT NULL,

      CONSTRAINT DF_Gorus_Tarih  DEFAULT (GETDATE()),

      CONSTRAINT [PK_Gorus] PRIMARY KEY(Id)

)

 

CREATE XML SCHEMA COLLECTION GorusSchema As

'<schema xmlns="http://www.w3.org/2001/XMLSchema">

<element name="Kayit">

      <complexType>

            <sequence>

                  <element name="Ad" type="string"/>

                  <element name="Arkadas" type="string"/>

                  <element name="Gorus" type="string"/>

                  <element name="Yer" type="string"/>

            </sequence>

    </complexType>

</element>

</schema>'

 

ALTER TABLE Gorus

ALTER COLUMN Icerik XML(GorusSchema)

 

 

User Defined Function:

 

public partial class UserDefinedFunctions {

 

    [SqlFunction]

    public static SqlString MailGonder(SqlInt32 sayi) {

        if (sayi % 100 == 0) {

            SmtpClient smtp = new SmtpClient("mail.ttnet.net.tr");

            smtp.Credentials = new NetworkCredential("iksite@ttnet.net.tr",

                                                     "123456");

            MailAddress from = new MailAddress("iksite@ttnet.net.tr");

            MailAddress to = new MailAddress("nurettinsimsek@yahoo.com");

            MailMessage msg = new MailMessage(from, to);

 

            msg.Subject = "Görüş Sayısı";

            msg.Body = "Toplam Görüş sayısı:<b>"+sayi+"</b>";

            msg.IsBodyHtml = true;

 

            smtp.Send(msg);

        }

        return "";

    }

};

 

 

Görüş eklemek için Store Procedure:

 

CREATE PROCEDURE GorusEkle(

      @icerik NVARCHAR(MAX)

)

AS

BEGIN

      DECLARE @count INT;

      INSERT INTO Gorus(Icerik) VALUES(@icerik)

 

      SELECT @count = COUNT(*) FROM Gorus

      SELECT dbo.MailGonder(@count)

END

 

 

Dış dünyaya açılması için End Point:

 

CREATE ENDPOINT GorusEkleEndPoint

STATE=STARTED

AS HTTP(PATH='/sql/GorusEkle',

            AUTHENTICATION=(INTEGRATED),

            PORTS=(CLEAR))

FOR SOAP(

             WEBMETHOD 'GorusEkle'

             (NAME='Gorusler.dbo.GorusEkle'),

             BATCHES=ENABLED,

             WSDL=DEFAULT,

             SCHEMA=STANDARD,

             DATABASE='Gorusler',

             NAMESPACE='http://tempUri.org/')

 

 

 

Uygulama:

 

Bir başka kişinin Windows uygulaması gerçekleştirdiğini farzedelim.Projesine Add Web reference diyerek End Point’imizi ekleyecek ve Ardından gerekli arayüzleri oluşturktan sonra Button Click eventi için şu metodu gerçekleştirecektir;

 

private void btnGorusEkle_Click(object sender, EventArgs e) {

    GorusEkleEndPoint proxy = new GorusEkleEndPoint();

    proxy.Credentials = CredentialCache.DefaultCredentials;

   

    proxy.GorusEkle(txtGorus.Text);

 

   /*

    * txtGorus.Text=@"<Kayit>

    *                     <Ad>Ahmet</Ad>

    *                     <Arkadas>Mehmet</Arkadas>

    *                     <Gorus>Mehmet iyidir.</Gorus>

    *                     <Yer>İngilizce kursundan</Yer>

    *                 </Kayit>"

    * 

    */

}