283

Click here to load reader

Yazilim Proje BilgeAdam

Embed Size (px)

Citation preview

Page 1: Yazilim Proje BilgeAdam

Uygulamalı Yazılım Projeleri

Okan Tekeli

Editör C. Banu Üçüncüoğlu

YAZILIM UZMANLIĞI

Page 2: Yazilim Proje BilgeAdam

Uygulamalı Yazılım ProjeleriOkan Tekeli

Editör: C. Banu Üçüncüoğlu

Kapak Tasarımı: Melih Sancar

Grafik Tasarım: Tuna Erkan

Grafik Uygulama: Soner Işık

Genel Yayın Yönetmeni: Mehmet Çömlekçi

1. Basım: Şubat 2008

Rev: 00

Bilge Adam Yayınları: 22

Eğitim Yayınları Dizisi:22

ISBN: 978-605-5987-20-6

Copyright © 2007, Bilge Adam Bilgisayar ve Eğitim Hizmetleri San. ve Tic. A.Ş.

Eserin tüm yayın hakları Bilge Adam Bilgisayar ve Eğitim Hizmetleri San. ve Tic. A.Ş.’ye aittir. Yayınevinden yazılı izin alınmadan kısmen ya da tamamen alıntı yapılamaz, hiçbir şekilde kopya edilemez, çoğaltılamaz ve tekrar yayımlanamaz. Bilge Adam’ın öğrencilerine ücretsiz armağanıdır, para ile satılamaz.

Bilge Adam Bilgisayar ve Eğitim Hizmetleri San. ve Tic. A.Ş.

19 Mayıs Mahallesi, 19 Mayıs Caddesi, UBM Plaza, No: 59-61, Kat: 4-7; Şişli, İstanbul

Telefon: (212) 272 76 00 – (212) 217 05 55 Faks: (212) 272 76 01

www.bilgeadam.com - [email protected]

Page 3: Yazilim Proje BilgeAdam

İçindekilerProje 1: herkesburada.com ��������������������������������������������������������������������������������������������������������3

Görüşmeler ...............................................................................................................................3

Ahmet Becerikli (Proje Sahibi) ���������������������������������������������������������������������������������������3

Uygulama Analizi �����������������������������������������������������������������������������������������������������������3

Uygulama Tasarımı ..................................................................................................................4

Veritabanı Tasarımı ��������������������������������������������������������������������������������������������������������4

Arayüz Tasarımı �������������������������������������������������������������������������������������������������������������5

Proje 2: Otobüs Otomasyonu �������������������������������������������������������������������������������������������������107

Genel Bakış ..........................................................................................................................107

Görüşmeler ...........................................................................................................................107

Özgür Kolukısa (Genel Müdür) ����������������������������������������������������������������������������������107

Selçuk Huysuz (Müşteri Hizmetleri Müdürü) ��������������������������������������������������������������107

Baki Çokbilmiş (Personel Sorumlusu) ������������������������������������������������������������������������107

Vildan Parasever (Muhasebe Sorumlusu) �����������������������������������������������������������������108

Uygulama Tasarımı ..............................................................................................................108

Veritabanı Tasarımı ����������������������������������������������������������������������������������������������������108

Arayüz Tasarımı ���������������������������������������������������������������������������������������������������������122

Uygulama �������������������������������������������������������������������������������������������������������������������166

Proje 3: DVDDukkani.com�������������������������������������������������������������������������������������������������������169

Görüşmeler ...........................................................................................................................169

Hüsamettin Beceriksiz (Proje Sahibi) �������������������������������������������������������������������������169

Uygulama Tasarımı ..............................................................................................................169

Veritabanı Tasarımı ����������������������������������������������������������������������������������������������������169

Arayüz Tasarımı ���������������������������������������������������������������������������������������������������������172

Ek - A: Teknik Terimler Sözlüğü���������������������������������������������������������������������������������������������237

Page 4: Yazilim Proje BilgeAdam

ÖnsözYazılan bu proje kitabı, eğitiminiz boyunca göreceğiniz konuların toplu bir şekilde uygulamalarını yapabileceğiniz, size temel konularda pratik kazandırmayı hedefleyen, yol gösteren projelerden oluşuyor. Amacımız sizi oyuna hazır birer oyuncu olarak çıkarmak. Bu kitaptaki projeler içerisinde bir projeye başlanacağı zaman “Nereden başlamalı, nasıl ilerlemeli?” sorularına cevap bulacak-sınız.

Elinizdeki bu projeler derste işlenmeyecek, konu bitiminde sizlere taşın altına elinizi koymanız için yol gösterecek. Proje kitabı temelde eğitim odaklı ilerlemekte, verilen senaryolara destek amaçlı yazıldı. İlgili konu bittiği zaman projeyi adım adım takip ederek tamamlamanız, kitapta yazılmayıp sizden yapmanız istenen bölümleri yapmanız, verilen uyarı ve ipuçlarını kullanmanız sizlere proje yapmakta pratik kazandıracak.Yapılan bu projeler ile birlikte, sizlere verilen örnek senaryoları tamamlamanız, bir proje içerisindeki sorunları çözmenizde ve resmi daha en başından görebil-menizde büyük katkı sağlayacaktır. Kitaptaki projeleri tamamladıktan sonra örnek senaryoları bitirmeniz, eğitiminiz sonunda sizlere iş hayatına hazır birer yazılım uzmanı olma yolunda büyük katkı sağlayacaktır.

Umarım sizler için yararlı bir çalışma olur. İyi Çalışmalar.

Okan Tekeli

Page 5: Yazilim Proje BilgeAdam

1 Proje 1: herkesburada.com

Page 6: Yazilim Proje BilgeAdam

1 Proje 1:

herkesburada.com Görüşmeler

Uygulama Tasarımı

Page 7: Yazilim Proje BilgeAdam

Proje 1: herkesburada.com GörüşmelerAhmet Becerikli (Proje Sahibi)Yapmak istediğimiz web uygulaması sayesinde üyelerimizin site üzerinden arkadaşlıklar kurma-larını, birbirlerinin albümlerini görebilmelelerini ve mesaj atmalarını istiyoruz. Şu andaki mevcut internet sitelerindeki üye kayıt sayfaları kullanıcılardan detaylı bilgiler istiyor fakat bizim sitemize üye olurken sadece kullanıcının e-posta, şifre bilgisi ve rumuz girip üye olsun daha sonradan kendi profil bilgilerini düzenlesin. Sitemizde her sayfaya ancak üye olan kullanıcı erişebilir, üye olmayan kullanıcının herhangi bir işlem yapmasını istemiyoruz.

Üye profili olarak ise Tablo 1.1‘de verilen bilgileri girmesini istiyoruz.

İstediğim zaman eğitim durumu, ilgi alanı, şehir, ülke, meslek ve takım tanımlamalarını yapabil-meliyim. Profil bilgilerini kimlerin görebileceğini kullanıcı belirlesin. İsterse herkes görür, isterse sadece arkadaşları görebilir.

Üyeler kendi profil resimleri haricinde farklı albümler oluşturabilsin ama bu albümleri herkes göremesin, profil görüntülemedeki gibi sadece arkadaşlar veya herkes görebilsin deme imkanı olmalı.

Üyeler birbirlerine özel mesaj atabilsinler. Mesaj atarken eğer mesaj atacağı üye kullanıcının ar-kadaşı ise kullanıcı adının veya kime kısmının yazılacağı yer otomatik tamamlansın, eğer arkadaş değil ise tamamlanmasın. Burada teklif dediğimiz bir sistem olmalı. Arkadaşlık teklifi sonrasında iki kullanıcı arkadaş olabilecek ve albüm, profil gibi bilgilere erişmeye başlayacak. Çoğu arka-daşlık sitesinde bulunan titreşim gönderme ya da çiçek ısmarlama gibi uygulamalar istemiyoruz sadece mesaj göndersin yeter. Kullanıcılar arkadaş listelerindeki online arkadaşları ile chat yapa-bilsin istiyoruz. Bazı internet sitelerinde kullanıcılar kendi ana sayfalarını özelleştirebiliyor. Bizim sitemizde de kullanıcılar sayfalarında istedikleri bölümleri göstersin, istemediklerini göstermesin. Farklı tema seçenekleri olsun. Bir de bazı siteler kullanıcı işlem yaparken ekranda kalıyor hiç gelip gitmiyor, tıpkı Windows uygulaması gibi hemen işlem yapıyor, bizim sitemiz de o şekilde olsun.

Uygulamada 2 rol istiyoruz. Bunlardan biri admin diğeri ise standart. Admin grubu uygulama içe-risinde kullanıcı rol değiştirme, şifre resetleme ve yönetmesini istediğimiz bilgileri yönetme gibi işlemleri yapacak. Standart rolü ise bildiğimiz üye olacak.

Uygulama AnaliziProjeye başlamadan önce bir analiz yapılacak olursa;

Uygulama rol bazlı olacak. Uygulama içerisinde kullanıcılar istediği yerleri özelleştirebileceği için web part kullanılacak ve Windows uygulaması gibi hızlı tepki verebilmek için ajax tekno-lojisi kullanılacak.

1.

Tablo 1.1: Müşteri İhtiyaçları TablosuAd Hakkında

Soyad Rumuz

Doğum Tarihi Dinlediği Müzik

Cinsiyet Meslek

Eğitim Durumu Okuduğu Kitaplar

Bulunduğu Şehir Tuttuğu Takım

Bulunduğu Ülke Yaptığı Spor

Hobileri Sigara İçer miFobileri Alkol Kullanır mı

Page 8: Yazilim Proje BilgeAdam

Kullanıcılar arası mesajlaşma sistemi olacak.

Kullanıcılar sadece onayladıkları kullanıcılar ile mesajlaşabilecek

Chat uygulaması olacak.

Kullanıcı bazlı fotoğraf galerisi olacak.

Tartışma grupları oluşturulabilecek, gerektiğinde mesajlar mail atılacak.

Uygulama TasarımıVeritabanı Tasarımı

Asp.Net membership alt yapısı kullanılacağı için veritabanı sunucunuzu açın.

HerkesBuradaDb isminde veritabanı oluşturun.

Başlat > Programlar > Visual Studio 2008 > Visual Studio Tools < Visual Studio 2008 Com-mand Prompt aracını çalıştırın.

Aspnet_regsql komutunu çalıştırın. Çıkan sihir-bazdan HerkesBuradaDb veritabanı seçin ve ya-pılandırın.

Veritabanının üyelik sistemini kullanacağı tablolar oluşturulduktan sonra HerkesBuradaDb ve-ritabanını açın. Şekil 1.2 ile Şekil 1.9 arasındaki tablolaları aspnet_regsql aracı ile oluşturulan membership tablolarına ek olarak oluşturun.

2.

3.

4.

5.

6.

Uygulama kısayolu programlar menüsünde buluna-mıyorsa Başlat > Çalıştır > “C:\Program Files\Mic-rosoft Visual Studio 9.0\VC\” komutunu yürütün.

Şekil 1.1: Membership veritabanı oluşturmak.

Şekil 1.2: Sehirler tablosu. Şekil 1.3: Takimlar tablosu.

Şekil 1.4: Albumler tablosu. Şekil 1.5: ArkadasListesi tablosu.

� Proje 1

Page 9: Yazilim Proje BilgeAdam

Oluşturulan tablolardaki ilişkileri yapılandırın.

Arayüz TasarımıVisual Studio programını açın. New > Web Site > şablonunu seçin. Proje adını HerkesBuradaWe-bUI şeklinde verin. Dil olarak C# seçin. Version olarak ise .Net Framework 3.5 seçin.

Uygulama oluşturulduktan sonra Solution Explorer penceresinden web.config dosyasını açın. Asp.Net membership altyapısından yararlanabilmek için configuration düğümü içerisinde (sys-tem.web düğümü hemen üzerine) connectionStrings düğümü ekleyin. Mevcut ConnectionS-tring düğümü silinmeli ve daha sonra aşağıdaki düğüm eklenmeli (Liste 1.1).

Şekil 1.6: EgitimDurumlari tablosu. Şekil 1.7: Fotograflar.

Şekil 1 8: Mesajlar tablosu. Şekil 1.9: Meslekler tablosu.

Tüm tablolardaki primary key sütunlarınının identity specification‘ı Yes yapılmalı ve identitty increment ve seed 1 olarak belirtilmelidir.

Kaynak Tablo Kaynak Sütun Hedef Tablo Hedef Sütün

Albumler KullaniciId aspnet_Users UserIdArkadasListesi Kim aspnet_Users UserId

ArkadasListesi Kimin aspnet_Users UserIdFotograflar AlbumId Albumler AlbumId

Şekil 1.10 : Yeni web sitesi oluşturma ekranı.

�herkesburada.com

Page 10: Yazilim Proje BilgeAdam

<connectionStrings>

<clear/>

<addname=”LocalSqlServer”connectionString=”server=.;database=HerkesBuradaDb;userid=dbUser;password=123”/>

</connectionStrings>

Liste 1.1: Web.config connectionStrings tanımlaması.

Uygulamayı yapılandırmak için Asp.Net Configuration aracını açın. Bu aracı açmak için Web Site > Asp.Net Configuration menüsünü takip edebilirsiniz.

Açılan Asp.Net Web Application Administration sitesinden security sekmesine gelin. Şekil 1.11 haricinde bir çıktı görünüyorsa, hatayı okuyarak sorunu giderin. Oluşabilecek muhtemel hatalar;

Web.config dosyası içerisinde connection string’in yanlış yazılması ve yazım hatası (“;” kul-lanmayı unutmak).

Sql Server veritabanına bağlantı kurulamaması.

Bağlanılmak istenen veritabanı sunucusunun çalışmıyor olması.

Sorunsuz bağlantı sağdıktan sonra sırası ile;

Security sekmesi altındaki Users bölümü içerisinden Select authentication type link’ine tıkla-yın.

From Internet seçeneği seçin. Done butonuna tıklayın.

Security Sekmesi içerisinden Roles bölümünden Enable Roles link’ine tıklayın.

Security Sekmesi içerisinden Roles bölümünden Create or Manage roles link’ine tıklayın.

Admin ve Standart olarak 2 adet rol ekleyin.

1.

2.

3.

4.

5.

Şekil 1.11: Asp.Net Web Administration Application.

� Proje 1

Page 11: Yazilim Proje BilgeAdam

Internet Explorer penceresini kapatıp uygulamaya dönün.

Uygulamaya geri dönüldüğü zaman web.config dosyasında yapılan değişiklikler yüzünden Visual Studio dosya değişiklik uyarısı verecektir. Çıkan uyarıya Yes to All diyerek onaylayın.

Solution Explorer penceresinden uygulama üzerinde sağ tıklayın. New Folder menüsünü işa-ret edin. Klasör ismini admin olarak verin.

Asp.Net Configuration aracını çalıştırın. Solution Expolorer penceresi üzerindeki en sağda bulunan ikona tıklayarak açabilirsiniz. (Şekil 1.12)

Security sekmesinden Access Rules bölümünden Create access rules link’ine tıklayın.

Select a directory for this rule bölümden admin klasörünü seçin. Rule applies to bölümünden Role radio button kon-trolünü seçin. Karşısındaki dropdownlist’ten Admin seçin.

Permission bölünden Allow seçeneğini seçin ve OK butonuna tıklayın.

Security sekmesinden Access Rules bölümünden Create access rules link’ine tıklayın.

Select a directory for this rule bölümden admin klasörünü seçin Rule applies to bölümünden All users radio button kontrolünü seçin. Permission bölünden Deny seçeneğini seçin.

OK butonsuna tıklayın ve web administration tool’u kapatın.

Bu adımları bitirdikten sonra Solution Explorer penceresinden admin klasörü üzerinde sağ tık-layın, Refresh Folder menüsünü seçin. Klasör içerisinde bir web.config olduğu görünecek. Bu dosyaya izin verilen ve yasaklanan gruplar eklendi.

Bu aşamaya kadar uygulama içerisine 2 rol tanımlandı. Tanımlanan bu rollerden admin rol grubu-na, uygulama içerisindeki admin klasörüne erişimine izin verildi, diğer tüm kullanıcılara kapatıldı. Bir web uygulaması içerisinde klasöre erişim izni verirken ilk önce erişimine izin verilecekleri (allow) daha sonra yasaklanacak kullanıcı veya rolleri atayın. İlk önce tüm kullanıcılara yasak-lanırsa, daha sonradan izin verilen kullanıcılar bile erişemeyecek. Yanlış kullanıma örnek olarak;

<authorization>

<denyusers=”*”/>

<allowroles=”Admin”/>

</authorization>

Liste 1.2: Yanlış tanımlanmış authorization düğümü.

Standart olarak membership altyapısı içerisinde kullanıcıların kullanacakları şifre formatı en az 7 karakter olmalı ve bunlardan biri alfa numeric karakter (#,@,? gibi.) olmalı. Uygulama içerisinde bu ayarı değiştirmek için web.config dosyasında membership ayarlarını kendiniz belirleyin. Web.config dosyasına system.web düğümü içerisine Liste 1.3’deki kodu ekleyin.

<membership>

<providers>

<clear/>

<addname=”AspNetSqlMembershipProvider”

type=”System.Web.Security.SqlMembershipProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”

connectionStringName=”LocalSqlServer”

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

Şekil 1.12: Asp.Net Configuration Tool’u çalıştırmak.

�herkesburada.com

Page 12: Yazilim Proje BilgeAdam

enablePasswordRetrieval=”false”

enablePasswordReset=”true”

requiresQuestionAndAnswer=”true”

applicationName=”/”

requiresUniqueEmail=”false”

passwordFormat=”Hashed”

maxInvalidPasswordAttempts=”5”

minRequiredPasswordLength=”5”

minRequiredNonalphanumericCharacters=”0”

passwordAttemptWindow=”10”

passwordStrengthRegularExpression=””/>

</providers>

</membership>

Liste 1.3: Web.config dosyasında ezilmiş membership bilgileri.

Bu ayardan sonra web uygulaması için şifre uzunluğu en az 5 karakter olacak ve alfa numeric ka-rakter zorunluluğu olmayacak. Web uygulanmasının admin rolüne sahip kullanıcısını tanımlamak için Asp.Net Configuration aracını çalıştırarak security sekmesinden Users bölümü içerisindeki Create User link’ine tıklayın. Admin kullanıcı isminde bir kullanıcı tanımlayın.

Kullanıcı bilgilerini tutmak için (Ad, Soyad, Doğum Tarihi) profile kullanın. Profile tanımlaması için web.config içerisinde profile düğümünü ezin. Müşterinin istediği kullanıcı bilgilerini tanımlayın.

<profile>

<properties>

<groupname=”KisiselBilgiler”>

<addname=”Ad”type=”System.String”/>

<addname=”Soyad”type=”System.String”/>

<addname=”DogumTarihi”type=”System.DateTime”/>

<addname=”Cinsiyet”type=”System.Boolean”/>

<addname=”YasadigiSehirId”type=”System.String”/>

</group>

<addname=”EgitimDurumId”type=”System.String”/>

<addname=”Hobileri”type=”System.String”/>

<addname=”Fobileri”type=”System.String”/>

<addname=”Hakkinda”type=”System.String”/>

<addname=”MeslekId”type=”System.String”/>

<addname=”OkuduguKitaplar”type=”System.String”/>

<addname=”TuttuguTakimId”type=”System.String”/>

Admin kullanıcısı oluş-turulurken Admin rolü seçili olmalı.

� Proje 1

Page 13: Yazilim Proje BilgeAdam

<addname=”YaptigiSporlar”type=”System.String”/>

<addname=”SigaraKullanirMi”type=”System.Boolean”/>

<addname=”AlkolKullanirMi”type=”System.Boolean”/>

<addname=”ProfilYetki”type=”System.Boolean”defaultValue=”true”/>

<addname=”ProfilResmi”type=”System.String”defaultValue=”resimyok.jpg”/>

</properties>

</profile>

Liste 1.4: web.config profile tanımlaması.

Güvenlik için web.config dosyasında kullanılacak authentication tanımlamasını yapın. Standart olarak web.config içerisinde bu düğüm bulunur. Authentication düğümünü Liste 1.5’teki şekilde yapılandırın.

<authenticationmode=”Forms”>

<formsdefaultUrl=”~/kullanici/default.aspx”></forms>

</authentication>

Liste 1.5: web.config authentication düğümü.

Uygulama içerisinde theme dışındaki stilleri tanımlamak için Style isminde bir klasör oluşturun ve içine Genel.css isminde stylesheet ekleyin. Eklenen dosyanın içeriğini temizleyin. Eklenen bu stil belgesi içerisine Liste 1.6’da belirtilen stili tanımlayın.

*

{

font-family:Tahoma,Arial,Helvetica;

}

#SayfaAna

{

width:70%;

text-align:left;

border:1pxsolid#89a5e0;

border-top:none;

}

.AnaIcerik

{

width:100%;

height:100%;

text-align:left;

Profile düğümü System.Web içe-risinde yer alır.

�herkesburada.com

Page 14: Yazilim Proje BilgeAdam

}

#Menu

{

background-color:#89a5e0;

height:30px;

width:100%;

}

#Baslik

{

background-color:#3b5998;

}

#Icerik

{

padding:10px20px;

}

#SonBlum

{

text-align:center;

font-weight:bold;

color:Gray;

text-decoration:none;

margin-top:10px;

}

body

{

margin:0auto0auto;

padding:0;

color:#000000;

text-align:center;

}

.SolMenu

{

width:20%;

float:left;

}

.KullaniciIcerik

10 Proje 1

Page 15: Yazilim Proje BilgeAdam

{

width:79%;

float:right;

font-size:small;

font-family:Verdana;

}

.KullaniciIcerika

{

font-size:small;

}

a,a:link,a:visited,a:active

{

color:#000;

text-decoration:none;

}

a:hover

{

text-decoration:underline;

}

#Menu,#Menua

{

color:#fff;

font-size:18px;

font-weight:bold;

text-decoration:none;

}

#Menu.Separator

{

font-size:18px;

}

#Menu.Text

{

font-size:14px;

}

img

{

border:none;

11herkesburada.com

Page 16: Yazilim Proje BilgeAdam

}

p

{

margin-top:0;

}

h1,h2,h3

{

margin:0;

margin-bottom:2px;

}

h1

{

font-size:16px;

}

h2

{

font-size:15px;

color:#de4d52;

}

h3

{

font-size:13px;

}

Liste 1.6: Genel.css.

Uygulama içerisine SiteResimleri isminde bir klasör ekleyin ve size verilen proje materyalleri içe-risindeki SiteResimleri klasörü içindekileri bu klasöre kopyalayın. Tasarım tanımlandıktan sonra her sayfada kullanılacak olan sayfanın en üstünde görünecek menüyü tanımlayın. Bu menu kulla-nıcının rolüne göre değişiklik göstereceği için Login View kontrolü kullanın. Bilindiği gibi bu kontrol üye girişi yapan ve yapmayan kişilere göre veya farklı rollere göre görünüm kazanır. Uygulamaya Controls isminde bir klasör oluşturun ve içine UstMenu isminde bir Web User Control ekleyin. (Liste 1.7)

<%@ControlLanguage=”C#”AutoEventWireup=”true”CodeFile=”UstMenu.ascx.cs”Inherits=”Controls_Menu”%>

<tablecellpadding=”0”cellspacing=”0”style=”width:700px;height:30px;”>

<tr>

<tdstyle=”width:500px;vertical-align:middle;”>

&nbsp;

12 Proje 1

Page 17: Yazilim Proje BilgeAdam

<aid=”A1”href=”~/”runat=”Server”>AnaSayfa</a><spanclass=”Separator”>|</span>&nbsp;

<asp:LoginViewrunat=”server”ID=”lv1”>

<AnonymousTemplate>

<a id=”A4” href=”~/Login.aspx” runat=”Server”>Giriş</a>

</AnonymousTemplate>

<LoggedInTemplate>

<asp:LinkButtonID=”lnkLogout”runat=”server”OnClick=”lnkLogout_Click” >Çıkış</asp:LinkButton>

</LoggedInTemplate>

<RoleGroups>

<asp:RoleGroupRoles=”Admin”>

<ContentTemplate>

<asp:LinkButtonID=”lnkLogout”runat=”server”OnClick=”lnkLogout_Click” >Çıkış</asp:LinkButton>

<spanclass=”Separator”>|</span><aid=”A5”href=”../Admin/default.aspx”runat=”Server”>

Yönetim</a>

</ContentTemplate>

</asp:RoleGroup>

</RoleGroups>

</asp:LoginView>

</td>

<tdstyle=”width:200px;text-align:right;vertical-align:middle;”>

</td>

</tr>

</table>

Liste 1. 7: Ustmenu.ascx html tasarımı.

Oluşturulan üst menü kullanıcıların giriş yapmalarını sağlayacak, eğer admin rol grubunda ise bu gruba ait özel bir link çıkartmayı sağlayacak.

lv1 ismindeki Login View kontrolü içinde standart haricinde bir de admin rolündeki kullanıcılar için bir template oluşturulmuştur. Admin rolüne sahip kullanıcılar, admin klasörüne yönlendirilecek.

Çıkış butonuna tıklandığı zaman çıkış yapabilmek için lnkLogout button kontrolünün Click olayın-da kullanıcı çıkış işlemini yaptırın. (Web User Control’ün kod dosyası - Liste 1.8.)

protectedvoidlnkLogout_Click(objectsender,EventArgse)

{

FormsAuthentication.SignOut();

Session.Clear();

Response.Redirect(“~/default.aspx”);

}

Liste 1.8: lnkLogout linkbutton kontrolü Click olayı.

13herkesburada.com

Page 18: Yazilim Proje BilgeAdam

Uygulamanın tasarımda tek bir arayüz kullanabilmek için Ajax Master Page ekleyin ve ismini her-kesburada.master olarak belirleyin ve Liste 1.9’da belirtilen tasarımı yapın.

<%@MasterLanguage=”C#”AutoEventWireup=”true”CodeFile=”herkesburada.master.cs”Inherits=”herkesburada”%>

<%@RegisterSrc=”Controls/UstMenu.ascx”TagName=”Menu”TagPrefix=”uc1”%>

<!DOCTYPEhtmlPUBLIC“-//W3C//DTDXHTML1.0Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<htmlxmlns=”http://www.w3.org/1999/xhtml”>

<headid=”Head1”runat=”server”>

<title>HerkesBurada</title>

<linkhref=”Style/Genel.css”rel=”stylesheet”type=”text/css”/>

</head>

<body>

<formid=”form1”runat=”server”>

<divid=”SayfaAna”>

<divid=”Baslik”>

<imgsrc=”~/SiteResimleri/Logo.gif”runat=”server”id=”imgLogo”alt=”HerkesBurada”/></div>

<divid=”Menu”>

<uc1:MenuID=”Menu1”runat=”server”/>

<asp:ScriptManagerID=”ScriptManager1”runat=”server”>

</asp:ScriptManager>

</div>

<divid=”Icerik”>

<asp:ContentPlaceHolderID=”AnaIcerik”runat=”server”>

</asp:ContentPlaceHolder>

</div>

</div>

<divid=”SonBolum”>

<!--Dahasonradanburayacopyrightbilgilerigelebilir.-->

</div>

</form>

</body>

</html>

Liste 1.9: herkesburada.master dosyası tasarımı.

Herkesburada.master master sayfasının UstMenu.ascx user control’ü eklenmiş ekran görüntüsü Şekil 1.13’de belirtilmiştir.

14 Proje 1

Page 19: Yazilim Proje BilgeAdam

Bu aşamadan sonra uygulamaya eklenecek tüm Ajax Web Form’larını herkesburada.master dosyasından türetin. Yeni bir Ajax Web Form ek-lerken master page seçtirip herkesburada.master dosyasını seçin. Kul-lanıcıların kayıt olabilmelelerini sağlamak için kayit.aspx isminde bir Ajax Web Form ekleyin.

kayit.aspx içerisine bir fieldset ekleyin. Eklenecek fieldset’i Content Place Holder içerisine ekleyi unutmayın.

<fieldsetstyle=”width:320px;height:260px”>

<legend>YeniÜye?</legend>

</fieldset>

Eklenen bu fieldset içerisine Create User Wizard kontrolü ekleyin. ID özelliğini KullaniciKayit ola-rak değiştirin. Özelliklerinde Türkçeleştirilebilen tüm özellikleri Türkçeleştirin. Örneğin Password-LabelText özelliğini Şifre olarak değiştirin. Ek olarak Tablo 1.2’deki özellikleri atayın.

Kayit.aspx formunun tasarımı Şekil 1.14’deki gibidir.

Uygulama içerisinde 2 rol kullanılacak. Kayıt olan kullanıcının Standart rol grubuna alınması için kayıt esnasında kayıt olan kullanıcıyı bu gruba dahil edin. Bunun için CreateUserWizard kontro-lünün CreatedUser olayında kullanıcıyı standart rol grubuna alın.

protectedvoidKullaniciKayit_CreatedUser(objectsender,EventArgse)

{

Şekil 1.13: herkesburada.master sayfa tasarımı.

Web Form eklerken master page seçtirme-yi unutmayın.

Tablo 1.2: CreateUserWizard Kontrolünde Değiştirikecek ÖzelliklerÖzellik DeğerContinueDestinationPageUrl ~/kullanici/default.aspx

Şekil 1.14: Kayit.aspx sayfası.

15herkesburada.com

Page 20: Yazilim Proje BilgeAdam

MembershipUseruser=Membership.GetUser(KullaniciKayit.UserName);

Roles.AddUserToRole(KullaniciKayit.UserName,“Standart”);

Membership.UpdateUser(user);

}

Liste 1.10: Kayıt olan kullanıcıyı standart rol grubuna alma kodu.

Kayıt olan kullanıcının giriş yapmasını sağlayacak olan Login.aspx sayfası için uygulamaya Web Form ekleyin ve ismini login.aspx olarak belirleyin. Kayit.aspx sayfasındaki gibi fieldset ekleyin ve içerisine Login kontrolü atın. Türkçeleştirilebilen özellikleri Türkçeleştirin ve ek olarak Tablo 1.3‘deki özellikleri atayın.

Login.aspx sayfasının çıktısı Şekil 1.15‘de gösterilmiştir.

Uygulamaya sifrehatirlat.aspx isimli bir tane Web Form ekleyin. Sayfadaki Content’e Password-Recovery kontrol ekliyin. Türkçeleştirilebilen özellikleri Türkçeleştirin. Sifrehatirlat.aspx sayfasının görüntüsü Şekil 1.16’da gösterilmiştir.

Tablo 1.3: Login.aspx Sayfası Üzerindeki Login Kontrolüne Eklenecek ÖzelliklerÖzellik Değer

CreateUserText Beni de aranıza alınCreateUserUrl ~/kayit.aspx

PasswordRecoveryText Şifremi UnuttumPasswordRecoveryUrl ~/sifrehatirlat.aspx

Şekil 1.15: Login.aspx sayfasının tasarım görünümü.

Şekil 1.16: SifreHatirlat.aspx sayfasının tasarım görünümü.

16 Proje 1

Page 21: Yazilim Proje BilgeAdam

Bir ziyaretçi web sitesine ilk girdiği zaman kullanıcıyı karşılayacak olan default.aspx sayfasını uygulamaya ekleyin.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”Default.aspx.cs”Inherits=”_Default”Title=”Herkesburada.com”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<center><asp:PanelID=”Panel1”runat=”server”CssClass=”AnaIcerik”Height=”100%”Width=”70%”>

<p>

&nbsp;</p>

<p>

<fontstyle=”font-size:small;color:gray;font-family: Verdana”>&nbsp;Album ouşturun,

arkadaşlarınız ile mesajlaşın, yeni arkadaşlar bulun,profilgüncelleyinvealbumlere

göz atın.&nbsp;</font></p>

<center>

<asp:ButtonID=”btnKaydol”runat=”server”BackColor=”Green”Font-Names=”Verdana”Font-Size=”Small”

ForeColor=”White” Text=”Aramıza Katıl” OnClick=”btnKaydol_Click”/>

</center>

</asp:Panel></center>

</asp:Content>

Liste 1.11: Default.aspx html tasarım görünümü.

btnKaydol button kontrolünün Click olayında giriş sayfasına yönlendirme yapın. Load olayında ise eğer kullanıcı giriş yapmışsa Kullanici klasörüne yönlendirin.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(User.Identity.IsAuthenticated)

Response.Redirect(@”~\kullanici\default.aspx”);

}

protectedvoidbtnKaydol_Click(objectsender,EventArgse)

{

Response.Redirect(“login.aspx”);

}

Liste 1.12: Default.aspx kod satırı.

17herkesburada.com

Page 22: Yazilim Proje BilgeAdam

Web sitesinde oluşabilecek hataları kullanıcıya daha güzel ve anlaşılır göstermek için hata say-faları yapın. Hata isminde bir klasör ekleyin. 404 hata kodu internet sitelerinde bulunamayan sayfaları, 403 nolu hata kodu ise erişilmeye yasak sayfaları belirtir. Bir web uygulamasında olu-şabilecek en sık hatalar 404 ve 403 hatalarıdır. Bu hatalar için ayrı birer sayfa, diğer tüm hatalar için ise tek bir sayfa yapabilirsiniz. Bu klasöre 404.aspx isminde bir Web Form ekleyin. Aradığınız sayfaya ulaşılamıyor hatasını kullanıcıya gösterin.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”404.aspx.cs”Inherits=”Hata_404”Title=”UntitledPage”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<fontcolor=”Red”>

<center>

&nbsp;</center>

<center>

&nbsp;</center>

<center>

Hata oluştu ve yöneticiye bildirildi.

<br/>

Aradığınız sayfaya ulaşılamıyor.

</center></font>

</asp:Content>

Liste 1.13: 404.aspx hata sayfası html tasarımı.

Aynı şekilde 403.aspx sayfası ekleyin ve “Bu sayfaya erişim izniniz yok” mesajı verdirin. Bu ha-talar haricinde oluşabilecek her hata için genel bir generic hata sayfası yapın ve ismini hata.aspx verin.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”hata.aspx.cs”Inherits=”Hata_hata”Title=”UntitledPage”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<fontcolor=”Red”>

<center>

&nbsp;</center>

<center>

Şekil 1.17: Default.aspx sayfa tasarım görünümü.

18 Proje 1

Page 23: Yazilim Proje BilgeAdam

&nbsp;</center>

<center>

Hata oluştu ve yöneticiye bildirildi.

<br/>

İşleminizi tekrar deneyin.

</center></font>

</asp:Content>

Liste 1.14: Hata.aspx sayfası html tasarımı.

Web.config dosyasını açıp oluşturulan hata sayfalarını tanıtın. Artık IIS kendi hata mesajları yeri-ne sizin özelleştirdiğiniz hata sayfalarını (custom error page) gösterecek.

<customErrorsmode=”RemoteOnly”defaultRedirect=”~/Hata/hata.aspx”>

<errorredirect=”~/Hata/404.aspx”statusCode=”404”/>

<errorredirect=”~/Hata/403.aspx”statusCode=”403”/>

</customErrors>

Liste 1.15: Web.Config CustomErrors düğümü.

Giriş yapan kullanıcıların erişeceği sayfaları Kullanıcı klasörü altında toplamak için uygulamaya Kullanici klasörü ekleyin. Eklenen klasöre ilk olarak web.config dosyası ekleyin ve sadece giriş yapmış kullanıcıların bu klasöre erişmesine izin verin.

<?xmlversion=”1.0”encoding=”utf-8”?>

<configuration>

<system.web>

<authorization>

<allowroles=”Standart”/>

<allowroles=”Admin”/>

<denyusers=”?”/>

</authorization>

</system.web>

</configuration>

Liste 1.16: Kullanıcı klasörü içerisindeki web.config dosyası.

Controls klasörü içerisine her sayfada görünecek olan sol menu için KullaniciSolMenu.ascx is-minde Web User Control ekleyin. Bu menüde kullanıcının profil resmi, sayfalarda gezinmesini sağlayacak Menu kontrolü ve kullanıcı aramasını sağlayacak arama bölümü olacak.

<%@ControlLanguage=”C#”AutoEventWireup=”true”CodeFile=”KullaniciSolMenu.ascx.cs”Inherits=”Controls_KullaniciSolMenu”%>

<fieldsetstyle=”height:auto;width:auto”>

<legend><fontstyle=”font-size:smaller”>Bilgilerim</font></legend>

<br/>

19herkesburada.com

Page 24: Yazilim Proje BilgeAdam

<ahref=”profilresmi.aspx”title=”ResminiziGuncelleyin”><center><asp:ImageID=”imgUser”runat=”server”AlternateText=”UyeResminiz”GenerateEmptyAlternateText=”True”/></center></a><br/>

<font style=”font-size:x-small”>&nbsp; Hoşgeldin</font>

<asp:LoginNameID=”LoginName1”runat=”server”Font-Names=”Verdana”Font-Size=”X-Small”

ForeColor=”Blue”/>

</fieldset>

<br/>

<asp:MenuID=”Menu1”runat=”server”BackColor=”#E3EAEB”DynamicHorizontalOffset=”2”

Font-Names=”Verdana”Font-Size=”Small”ForeColor=”#666666”Height=”115px”StaticSubMenuIndent=”10px”

Width=”158px”>

<StaticMenuItemStyleHorizontalPadding=”5px”VerticalPadding=”2px”/>

<DynamicHoverStyleBackColor=”#666666”ForeColor=”White”/>

<DynamicMenuStyleBackColor=”#E3EAEB”/>

<StaticSelectedStyleBackColor=”#1C5E55”/>

<DynamicSelectedStyleBackColor=”#1C5E55”/>

<DynamicMenuItemStyleHorizontalPadding=”5px”VerticalPadding=”2px”/>

<Items>

<asp:MenuItem Text=”Mesajlarım” Value=”Mesajlarım” NavigateUrl=”~/Kullanici/mesajlarim.aspx”></asp:MenuItem>

<asp:MenuItem Text=”Arkadaşlarım” Value=”Arkadaşlarım” NavigateUrl=”~/Kullanici/arkadaslarim.aspx”></asp:MenuItem>

<asp:MenuItemText=”Albumlerim”Value=”Albumlerim”NavigateUrl=”~/Kullanici/albumlerim.aspx”></asp:MenuItem>

<asp:MenuItemText=”Bilgilerim”Value=”Bilgilerim”NavigateUrl=”~/Kullanici/bilgiler.aspx”></asp:MenuItem>

</Items>

<StaticHoverStyleBackColor=”#666666”ForeColor=”White”/>

</asp:Menu>

<br/>

<fieldsetstyle=”height:auto;width:auto”>

<legend><fontstyle=”font-size:smaller”>ÜyeAra</font></legend>

<asp:TextBoxID=”txtRumuz”runat=”server”Width=”125px”></asp:TextBox><br/>

&nbsp;<asp:ButtonID=”btnAra”runat=”server”Text=”Ara”/><br/>

<asp:HyperLinkID=”HyperLink1”runat=”server”Font-Size=”Small”ForeColor=”Blue”

NavigateUrl=”~/kullanici/detayliarama.aspx”>Detaylı Arama</asp:HyperLink><br/></fieldset>

&nbsp;<br/>

<br/>

20 Proje 1

Page 25: Yazilim Proje BilgeAdam

KullaniciSolMenu.ascx kontrolünde en üstte bir fieldset tanımlandı ve içerisine kullanıcının resimini gösterebilmek için Image kontrolü ek-lendi. Hemen altında karşılama mesajı olarak Hoşgeldiniz yazıldı ve LoginName kontrolü eklendi.

Orta bölümde kullanıcıların sayfalarda gezinmelerini sağlamak için Menu kontrolü eklendi ve ge-rekli sayfaları link verildi. En altta ise kullanıcıların site içerisinde arama yapmalarını sağlamak için arama bölümü yapıldı. Kullanıcı ilk oturum açtığında Profile bilgilerinden ProfilResmini belirtme-miş olacak. Eğer kendisi resim belirtmemiş ise otomatik olarak resimyok.jpg dosyası kullanıcının resmi yerine gösteriyoruz. Kullanıcı resimlerini depolomak için uygulama içerisine UyeResimleri klasörü ekleyin. Bu klasör sitedeki kullanıcıların resimlerini tutucak, dolayısıyla resimler daha dü-zenli tutulmuş olacak. Klasör içerisine resimyok.jpg resmini ekleyin. Bu resim profil bilgisini dol-durmamış kullanıcının resminde gösterilecek. Bundan sonra oluşturulacak her sayfada bu menu kullanılacak.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(String.IsNullOrEmpty(Profile.ProfilResmi))

imgUser.ImageUrl=Server.MapPath(“~/UyeResimleri/resimyok.jpg”);

else

imgUser.ImageUrl=Server.MapPath(“~/UyeResimleri/”)+Profile.ProfilResmi;

}

Liste 1.17: Default.aspx Page_Load olayı.

Kullanıcı klasörüne default.aspx isminde bir Web Form ekleyin.

Oluşan sayfanın kullanıcıya hoş görünebilmesi için Content’i tasarımsal olarak ikiye bölün, yani div kullanarak şekillendirin. Solda oluşan div içerisine biraz önce oluşturduğunuz KullaniciSolMe-nu.ascx kontrolünü ekleyin.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”Default.aspx.cs”Inherits=”Kullanici_Default”Title=”ÜyeAnaSayfa”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

</div>

</asp:Content>

Liste 1.18: Default.aspx sayfası html tasarımı.

LoginName kontrolü otu-rum açan kullanıcının otu-rum adını almayı sağlar.

Eklenen her sayfayı herkesburada.master sayfasından türetin.

21herkesburada.com

Page 26: Yazilim Proje BilgeAdam

Bundan sonraki her sayfada aynı taslağı kullanın. Eklenen her sayfayı Liste 1.18‘de belirtidiği gibi 2 parçaya bölün ve sol tarafa KullaniciMenu.ascx kontrolünü ekleyin.

Kullanici klasörü içerisine Mesajlarim.aspx isminde bir Web Form Ekleyin. Kullanıcının gelen ve giden mesajlarının liste-leneceği sayfası olacak. Sayfayı default.aspx’teki gibi iki div içerisine bölün.

<%@RegisterAssembly=”AjaxControlToolkit”Namespace=”AjaxControlToolkit”TagPrefix=”cc1”%>

<%@RegisterSrc=”~/Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<scriptlanguage=”javascript”type=”text/javascript”>

functionYeniMesajGoster()

{

window.open(‘yenimesaj.aspx’,’yenimesaj’,’width=350,height=250’);

}

</script>

Şekil 1.18: Kullanici/default.aspx sayfa tasarım görüntüsü.

Default.aspx sayfasının en üstünde be-lirtilen declaration haricindeki tüm kod-ları koplayalıp yapıştırabilirsiniz.

22 Proje 1

Page 27: Yazilim Proje BilgeAdam

<divclass=”KullaniciIcerik”>

<br/>

<asp:LinkButtonID=”lnkYeniMesaj”OnClientClick=”YeniMesajGoster();returnfalse;”runat=”server”ForeColor=”Blue”Width=”67px”>YeniMesaj</asp:LinkButton><br/>

<asp:UpdatePanelID=”UpdatePanel1”runat=”server”>

<ContentTemplate>

<br/>

<cc1:TabContainerID=”TabContainer1”runat=”server”ActiveTabIndex=”0”Width=”625px”>

<cc1:TabPanelID=”TabPanel1”runat=”server”HeaderText=”TabPanel1”>

<ContentTemplate>

<asp:GridViewID=”gelenMesajlar”runat=”server”AllowPaging=”True”AllowSorting=”True”

AutoGenerateColumns=”False”BackColor=”White”BorderColor=”#CCCCCC”BorderStyle=”None”

BorderWidth=”1px”CellPadding=”4”DataKeyNames=”MesajId,OkunduMu”DataSourceID=”SqlDataSource1”

EmptyDataText=”Gelen Mesajınız bulunmuyor...” ForeColor=”Black”GridLines=”Horizontal”

Width=”100%”OnRowDeleting=”gelenMesajlar_RowDeleting”OnRowDataBound=”gelenMesajlar_RowDataBound”>

<FooterStyleBackColor=”#CCCC99”ForeColor=”Black”/>

<Columns>

<asp:HyperLinkFieldDataNavigateUrlFields=”UserName”DataNavigateUrlFormatString=”~/kullanici/profildetay.aspx?user={0}”

DataTextField=”UserName”HeaderText=”G&#246;nderen”/>

<asp:HyperLinkFieldDataNavigateUrlFields=”MesajId”DataNavigateUrlFormatString=”~/kullanici/mesajoku.aspx?mesaj={0}”

DataTextField=”Baslik”HeaderText=”Konu”/>

<asp:BoundFieldDataField=”Tarih”DataFormatString=”{0:d}”HeaderText=”Tarih”HtmlEncode=”False”

SortExpression=”Tarih”/>

<asp:TemplateFieldShowHeader=”False”>

<ItemTemplate>

<asp:LinkButtonID=”LinkButton1”OnClientClick=”return confirm(‘Mesajı silmek istediğinizden eminmisiniz?’)”runat=”server”CausesValidation=”False”CommandName=”Delete”

Text=”Sil”></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

23herkesburada.com

Page 28: Yazilim Proje BilgeAdam

</Columns>

<SelectedRowStyleBackColor=”#CC3333”Font-Bold=”True”ForeColor=”White”/>

<PagerStyleBackColor=”White”ForeColor=”Black”HorizontalAlign=”Right”/>

<HeaderStyleBackColor=”#333333”Font-Bold=”True”ForeColor=”White”/>

</asp:GridView>

</ContentTemplate>

<HeaderTemplate>

Gelen Mesajlarım

</HeaderTemplate>

</cc1:TabPanel>

<cc1:TabPanelID=”TabPanel2”runat=”server”HeaderText=”TabPanel2”>

<ContentTemplate>

<asp:GridViewID=”gidenMesajlar”runat=”server”AllowPaging=”True”AllowSorting=”True”

AutoGenerateColumns=”False”BackColor=”White”BorderColor=”#CCCCCC”BorderStyle=”None”

BorderWidth=”1px”CellPadding=”4”DataKeyNames=”MesajId”DataSourceID=”SqlDataSource2”

EmptyDataText=”Giden mesajınız bulunmuyor...”ForeColor=”Black”GridLines=”Horizontal”

OnRowDeleting=”gidenMesajlar_RowDeleting”Width=”100%”>

<FooterStyleBackColor=”#CCCC99”ForeColor=”Black”/>

<Columns>

<asp:BoundFieldDataField=”UserName”HeaderText=”Kime”SortExpression=”Kimden”/>

<asp:BoundFieldDataField=”Baslik”HeaderText=”Başlık” SortExpression=”Baslik” />

<asp:BoundFieldDataField=”Tarih”DataFormatString=”{0:d}”HeaderText=”Tarih”HtmlEncode=”False”

SortExpression=”Tarih”/>

<asp:TemplateFieldShowHeader=”False”>

<ItemTemplate>

<asp:LinkButtonID=”LinkButton1”runat=”server”CausesValidation=”False”CommandName=”Delete”

OnClientClick=”returnconfirm(‘Mesajı silmek istediğinden emin misiniz?’)” Text=”Sil”></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

24 Proje 1

Page 29: Yazilim Proje BilgeAdam

</Columns>

<SelectedRowStyleBackColor=”#CC3333”Font-Bold=”True”ForeColor=”White”/>

<PagerStyleBackColor=”White”ForeColor=”Black”HorizontalAlign=”Right”/>

<HeaderStyleBackColor=”#333333”Font-Bold=”True”ForeColor=”White”/>

</asp:GridView>

<asp:SqlDataSourceID=”SqlDataSource2”runat=”server”ConflictDetection=”CompareAllValues”

ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”DeleteCommand=”DELETEFROM[Mesajlar]WHERE[MesajId]=@original_MesajIdAND[Kimden]=@original_KimdenAND[Kime]=@original_KimeAND[Baslik]=@original_BaslikAND[MesajIcerik]=@original_MesajIcerikAND[Tarih]=@original_Tarih“

InsertCommand=”INSERTINTO[Mesajlar]([MesajId],[Kimden],[Kime],[Baslik],[MesajIcerik],[Tarih],[OkunduMu])VALUES(@MesajId,@Kimden,@Kime,@Baslik,@MesajIcerik,@Tarih)”

OldValuesParameterFormatString=”original_{0}”SelectCommand=”SELECT[MesajId],[UserName],[Baslik],[MesajIcerik],[Tarih]&#13;&#10;FROM[Mesajlar]m&#13;&#10;InnerJoinaspnet_Usersaona.UserId=m.Kime&#13;&#10;WHERE([Kimden]=@KimdenAndGondericiyeGosterme=’False’)ORDERBY[Tarih]”

UpdateCommand=”UPDATE[Mesajlar]SET[Kimden]=@Kimden,[Kime]=@Kime,[Baslik]=@Baslik,[MesajIcerik]=@MesajIcerik,[Tarih]=@TarihWHERE[MesajId]=@original_MesajIdAND[Kimden]=@original_KimdenAND[Kime]=@original_KimeAND[Baslik]=@original_BaslikAND[MesajIcerik]=@original_MesajIcerikAND[Tarih]=@original_Tarih”>

<InsertParameters>

<asp:ParameterName=”MesajId”Type=”Object”/>

<asp:ParameterName=”Kimden”Type=”Object”/>

<asp:ParameterName=”Kime”Type=”Object”/>

<asp:ParameterName=”Baslik”Type=”String”/>

<asp:ParameterName=”MesajIcerik”Type=”String”/>

<asp:ParameterName=”Tarih”Type=”DateTime”/>

</InsertParameters>

<SelectParameters>

<asp:SessionParameterName=”Kimden”SessionField=”UserId”/>

</SelectParameters>

25herkesburada.com

Page 30: Yazilim Proje BilgeAdam

<UpdateParameters>

<asp:ParameterName=”Kimden”Type=”Object”/>

<asp:ParameterName=”Kime”Type=”Object”/>

<asp:ParameterName=”Baslik”Type=”String”/>

<asp:ParameterName=”MesajIcerik”Type=”String”/>

<asp:ParameterName=”Tarih”Type=”DateTime”/>

<asp:ParameterName=”OkunduMu”Type=”Boolean”/>

<asp:ParameterName=”original_MesajId”Type=”Object”/>

<asp:ParameterName=”original_Kimden”Type=”Object”/>

<asp:ParameterName=”original_Kime”Type=”Object”/>

<asp:ParameterName=”original_Baslik”Type=”String”/>

<asp:ParameterName=”original_MesajIcerik”Type=”String”/>

<asp:ParameterName=”original_Tarih”Type=”DateTime”/>

</UpdateParameters>

<DeleteParameters>

<asp:ParameterName=”original_MesajId”Type=”Object”/>

<asp:ParameterName=”original_Kimden”Type=”Object”/>

<asp:ParameterName=”original_Kime”Type=”Object”/>

<asp:ParameterName=”original_Baslik”Type=”String”/>

<asp:ParameterName=”original_MesajIcerik”Type=”String”/>

<asp:ParameterName=”original_Tarih”Type=”DateTime”/>

</DeleteParameters>

</asp:SqlDataSource>

</ContentTemplate>

<HeaderTemplate>

Giden Mesajlarım

</HeaderTemplate>

</cc1:TabPanel>

</cc1:TabContainer><br/>

26 Proje 1

Page 31: Yazilim Proje BilgeAdam

<asp:SqlDataSourceID=”SqlDataSource1”runat=”server”ConflictDetection=”CompareAllValues”

ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”

DeleteCommand=”DELETEFROM[Mesajlar]WHERE[MesajId]=@original_MesajIdAND[Kimden]=@original_KimdenAND[Kime]=@original_KimeAND[Baslik]=@original_BaslikAND[MesajIcerik]=@original_MesajIcerikAND[Tarih]=@original_Tarih“

InsertCommand=”INSERTINTO[Mesajlar]([MesajId],[Kimden],[Kime],[Baslik],[MesajIcerik],[Tarih])VALUES(@MesajId,@Kimden,@Kime,@Baslik,@MesajIcerik,@Tarih)”

OldValuesParameterFormatString=”original_{0}”SelectCommand=”SELECT[MesajId],[UserName],[Baslik],[MesajIcerik],[Tarih],OkunduMu&#13;&#10;FROM[Mesajlar]m&#13;&#10;InnerJoinaspnet_Usersaona.UserId=m.Kimden&#13;&#10;WHERE([Kime]=@KimeAndAliciyaGosterme=’False’)ORDERBYOkunduMu,[Tarih]&#13;&#10;”

UpdateCommand=”UPDATE[Mesajlar]SET[Kimden]=@Kimden,[Kime]=@Kime,[Baslik]=@Baslik,[MesajIcerik]=@MesajIcerik,[Tarih]=@TarihWHERE[MesajId]=@original_MesajIdAND[Kimden]=@original_KimdenAND[Kime]=@original_KimeAND[Baslik]=@original_BaslikAND[MesajIcerik]=@original_MesajIcerikAND[Tarih]=@original_TarihAND[OkunduMu]=@original_OkunduMu”>

<DeleteParameters>

<asp:ParameterName=”original_MesajId”Type=”Object”/>

<asp:ParameterName=”original_Kimden”Type=”Object”/>

<asp:ParameterName=”original_Kime”Type=”Object”/>

<asp:ParameterName=”original_Baslik”Type=”String”/>

<asp:ParameterName=”original_MesajIcerik”Type=”String”/>

<asp:ParameterName=”original_Tarih”Type=”DateTime”/>

</DeleteParameters>

<UpdateParameters>

<asp:ParameterName=”Kimden”Type=”Object”/>

<asp:ParameterName=”Kime”Type=”Object”/>

<asp:ParameterName=”Baslik”Type=”String”/>

<asp:ParameterName=”MesajIcerik”Type=”String”/>

<asp:ParameterName=”Tarih”Type=”DateTime”/>

27herkesburada.com

Page 32: Yazilim Proje BilgeAdam

<asp:ParameterName=”original_MesajId”Type=”Object”/>

<asp:ParameterName=”original_Kimden”Type=”Object”/>

<asp:ParameterName=”original_Kime”Type=”Object”/>

<asp:ParameterName=”original_Baslik”Type=”String”/>

<asp:ParameterName=”original_MesajIcerik”Type=”String”/>

<asp:ParameterName=”original_Tarih”Type=”DateTime”/>

<asp:ParameterName=”original_OkunduMu”/>

</UpdateParameters>

<SelectParameters>

<asp:SessionParameterName=”Kime”SessionField=”UserId”Type=”Object”/>

</SelectParameters>

<InsertParameters>

<asp:ParameterName=”MesajId”Type=”Object”/>

<asp:ParameterName=”Kimden”Type=”Object”/>

<asp:ParameterName=”Kime”Type=”Object”/>

<asp:ParameterName=”Baslik”Type=”String”/>

<asp:ParameterName=”MesajIcerik”Type=”String”/>

<asp:ParameterName=”Tarih”Type=”DateTime”/>

</InsertParameters>

</asp:SqlDataSource>

</ContentTemplate>

</asp:UpdatePanel>

&nbsp;&nbsp;<br/>

<br/>

</div>

</asp:Content>

Liste 1.19: Mesajlarim.aspx html tasarımı.

Eklenen bu formun en üst kısmında bir link button kontrolü bulunur. Bu link butonuna tıklandığı zaman yeni bir pencerede popup olarak yeni mesaj gönderme sayfası açılacak. Bu link’in hemen altında bir update panel bulunur. Update panel içerisinde Tab Container kontrolü bulunur. Tab Container kontrolü içerisinde 2 adet tab oluşturuldu ve bu tab’lardan birinde gelen mesajlar, diğe-rinde ise giden mesajlar listelendi. Gelen mesaj eğer okunmamış ise mesajın bulunduğu satırın stili değiştirilecek. Bunun için gelenMesajlar grid view kontrolünün RowDataBound olayında me-sajın okunup okunmadığı bilgisini alıp gerekli değişikliği yapın.

28 Proje 1

Page 33: Yazilim Proje BilgeAdam

protectedvoidgelenMesajlar_RowDataBound(objectsender,GridViewRowEventArgse)

{

if(e.Row.RowType!=DataControlRowType.DataRow)

return;

boolneymis=Convert.ToBoolean(gelenMesajlar.DataKeys[e.Row.RowIndex][“OkunduMu”]);

if(!neymis)

{

e.Row.BackColor=Color.Brown;

e.Row.ForeColor=Color.White;

}

}

Liste 1.20: Mesajlarim.aspx gelenMesajlar RowDataBound olayı.

Giden ve gelen mesajlarda silinme işleminde değişik bir sistem kullanılır. Bir mesaj geldiği zaman veritabanında tek bir satıra kayıt girilecek. Mesajı gönderen kişi gelen mesajlarından mesajı sil dediği zaman aslında bana gösterme demiş olacak. Mesaj gelen kişi gelen mesajı sil dediği za-man aslında bana gösterme demiş olacak. Eğer mesaj gerçekten silinirse gönderen veya alan kişi mesajı sildiği zaman diğer kişi mesajı görememiş olacak. O yüzden bir kullanıcı mesajı sil dediği zaman aslında o kullanıcıya mesajın gösterilip gösterilmeyeceği belirtilecek. Bu yüzden gelen ve giden mesajlar için silinme olayında gerekli mesajları güncelleyin.

protectedvoidgelenMesajlar_RowDeleting(objectsender,GridViewDeleteEventArgse)

{

GuidmesajId=newGuid(gelenMesajlar.DataKeys[e.RowIndex].Value.ToString());

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“UpdatemesajlarsetAliciyaGosterme=‘True’WhereMesajId=@MesajId”,con);

cmd.Parameters.AddWithValue(“@MesajId”,mesajId);

try

{

con.Open();

cmd.ExecuteNonQuery();

}

catch(SqlExceptionex)

{

throwex;

}

finally

29herkesburada.com

Page 34: Yazilim Proje BilgeAdam

{

con.Close();

}

SqlDataSource1.DataBind();

}

protectedvoidgidenMesajlar_RowDeleting(objectsender,GridViewDeleteEventArgse)

{

GuidmesajId=newGuid(gidenMesajlar.DataKeys[e.RowIndex].Value.ToString());

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“UpdatemesajlarsetGondericiyeGosterme=‘True’WhereMesajId=@MesajId”,con);

cmd.Parameters.AddWithValue(“@MesajId”,mesajId);

try

{

con.Open();

cmd.ExecuteNonQuery();

}

catch(SqlExceptionex)

{

throwex;

}

finally

{

con.Close();

}

SqlDataSource2.DataBind();

}

Liste 1.21: Mesajlarim.aspx gelen ve giden mesajların silinme olayı.

Mesajı alan kişi ve gönderen kişi birlikte silinme istediğinde bulunursa mesaj gerçekten veritaba-nından silinir. Bu yüzden veritabanı üzerine bu işlemi yapacak trigger’ı oluşturun. Liste 1.22’de belirtilmiştir.

USEherkesburadadb

GO

CREATETRIGGERMesajSilici

ONMesajlar

ForUpdate

30 Proje 1

Page 35: Yazilim Proje BilgeAdam

AS

BEGIN

Declare@MesajIduniqueidentifier

Select@MesajId=MesajIdFromInserted

DeleteFromMesajlarWhereGondericiyeGosterme=‘True’

AndAliciyaGosterme=’True’AndMesajId=@MesajId

END

Liste 1.22: MesajSilici trigger kodu.

Mesajlarim.aspx sayfası tasarımı Şekil 1.19’da belirtilmiştir.

Yeni mesaj gönderebilmek için Kullanici klasörü içerisine yenimesaj.aspx isimli bir sayfa ekleyin fakat bu sayfayı eklerken master page seçmeyin.

<%@PageLanguage=”C#”AutoEventWireup=”true”CodeFile=”yenimesaj.aspx.cs”Inherits=”Kullanici_yenimesaj”%>

<%@RegisterAssembly=”AjaxControlToolkit”Namespace=”AjaxControlToolkit”TagPrefix=”cc1”%>

<!DOCTYPEhtmlPUBLIC“-//W3C//DTDXHTML1.0Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<htmlxmlns=”http://www.w3.org/1999/xhtml”>

<headrunat=”server”>

<title>YeniMesajGönder</title>

Şekil 1.19: Mesajlarim.aspx sayfa tasarım görünümü.

31herkesburada.com

Page 36: Yazilim Proje BilgeAdam

<linkhref=”../Style/Genel.css”rel=”stylesheet”type=”text/css”/>

</head>

<bodystyle=”margin-left:0;margin-top:0”>

<formid=”form1”runat=”server”>

<divstyle=”text-align:left”>

<tablewidth=”300”>

<tr>

<tdstyle=”width:55px”>

</td>

<tdcolspan=”2”>

<asp:ScriptManagerID=”ScriptManager1”runat=”server”>

</asp:ScriptManager>

<cc1:AutoCompleteExtenderEnableCaching=”false”

id=”AutoCompleteExtender1”

MinimumPrefixLength=”2”runat=”server”

servicemethod=”GetCompletionList”

targetcontrolid=”txtKime”

UseContextKey=”true”

></cc1:AutoCompleteExtender>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:55px”>

Kime:

</td>

<tdstyle=”width:69px”>

<asp:TextBoxID=”txtKime”runat=”server”></asp:TextBox></td>

<tdstyle=”width:69px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:55px”>

Konu:

</td>

<tdcolspan=”3”>

32 Proje 1

Page 37: Yazilim Proje BilgeAdam

<asp:TextBoxID=”txtBaslik”runat=”server”Width=”100%”></asp:TextBox></td>

</tr>

<tr>

<tdstyle=”width:55px;height:18px”valign=”top”>

Mesaj:

</td>

<tdcolspan=”3”style=”height:18px”>

<asp:TextBoxID=”txtMesaj”runat=”server”Height=”107px”TextMode=”MultiLine”Width=”100%”></asp:TextBox></td>

</tr>

<tr>

<tdstyle=”width:55px”>

</td>

<tdstyle=”width:69px”>

<asp:ButtonID=”btnGonder”runat=”server”Text=”Gönder”OnClick=”btnGonder_Click”/>

</td>

<tdstyle=”width:69px”>

<asp:ButtonID=”btnIptal”runat=”server”Text=”İptal” CausesValidation=”False” OnClientClick=”javascript:window.close();”/></td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:55px;height:18px”>

</td>

<tdstyle=”width:69px;height:18px”>

&nbsp;</td>

<tdstyle=”width:69px;height:18px”>

</td>

<tdstyle=”width:100px;height:18px”>

</td>

</tr>

</table>

</div>

</form>

</body>

</html>

Liste 1.23: Yenimesaj.aspx.

33herkesburada.com

Page 38: Yazilim Proje BilgeAdam

Yeni mesaj göndermek için sayfaya bir scriptmanager ve bir autocompleteextender konrolü eklendi. Eğer mesaj gönderilecek kişi kullanıcının arkadaşı ise otomatik olarak textbox altında çıkacak. Kullanıcı mesajı gidecek kişinin ismini yazdığı zaman tamamlama olmayacak. Mesaj gönderilecek kişi, mesajı gönderen kişinin arkadaşı olup olmadığını öğrenebilmesi için veritabanı üzerinde ArkadasListem isminde bir stored procedure oluşturun. Arkadaş listesi tek bir tabloda tanımlanıyor.

CREATEproc[ArkadasListem]

(

@UserIduniqueidentifier

)

As

SELECTaspnet_Users.UserName,KiminAsKullaniciId

FROMArkadasListesiINNERJOINaspnet_Users

ONArkadasListesi.Kimin=aspnet_Users.UserIdWHEREArkadasListesi.OnaylandiMi=

‘True’And(ArkadasListesi.Kim=@UserId)

Union

SELECTaspnet_Users.UserName,KimAsKullaniciId

FROMArkadasListesiINNERJOINaspnet_Users

ONArkadasListesi.Kim=aspnet_Users.UserIdWHEREArkadasListesi.OnaylandiMi=

‘True’And(ArkadasListesi.Kimin=@UserId)

Liste 1.24: ArkadasListem StoredProcedure’ü.

Mesaj gönderileceği zaman mesajı gönderecek kişi, alacak mesajı göndereceği kişinin adını ya-zar. Veritabanı ise bir mesajı kaydedebilmesi için kullanıcının ID bilgisine ihtiyaç duyacaktır. Ve-ritabanı üzerinde kullanıcının adını parametre olarak alan ve ID’sini döndüren function’ı yazın. (Liste 1.25)

CREATEfunctionKullaniciIdAl

(

@UserNamenvarchar(50)

)

returnsuniqueidentifier

As

begin

Declare@userIduniqueidentifier

Select@UserId=UserIdFromaspnet_UsersWhere[UserName]=@username

return@userId

end

Liste 1.25: KullanıcıIdAl function tanımlaması.

34 Proje 1

Page 39: Yazilim Proje BilgeAdam

Yenimesaj.aspx sayfasına geri dönüp arkadaş listesini döndürecek metodu tanımlayın.

publicstaticList<string>uyeler=newList<string>();

[System.Web.Services.WebMethodAttribute(),System.Web.Script.Services.ScriptMethodAttribute()]

publicstaticstring[]GetCompletionList(stringprefixText,intcount,stringcontextKey)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“ArkadasListem”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@UserId”,Membership.GetUser(HttpContext.Current.User.Identity.Name).ProviderUserKey);

SqlDataAdapterda=newSqlDataAdapter(cmd);

DataTabledt=newDataTable();

da.Fill(dt);

uyeler.Clear();

foreach(DataRowdrindt.Rows)

{

if(dr[“UserName”].ToString().StartsWith(prefixText))

uyeler.Add(dr[“UserName”].ToString());

}

returnuyeler.ToArray();

}

Liste 1.26: Kullanıcının arkadaş listesini otomatik dolduran metod.

Arkadaş listesini doldurduktan sonra yeni mesaj göndermek için btnGonder button kontrolünün Click olayında yeni mesaj gönderme kodlarını yazın.

protectedvoidbtnGonder_Click(objectsender,EventArgse)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“Insertintomesajlar(Kimden,Kime,MesajIcerik,Baslik,Tarih)values(@Kimden,dbo.KullaniciIdAl(@Kime),@MesajIcerik,@Baslik,@Tarih)”,con);

cmd.Parameters.AddWithValue(“@Kimden”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

cmd.Parameters.AddWithValue(“@Kime”,txtKime.Text);

cmd.Parameters.AddWithValue(“@MesajIcerik”,txtMesaj.Text);

cmd.Parameters.AddWithValue(“@Baslik”,txtBaslik.Text);

cmd.Parameters.AddWithValue(“@Tarih”,DateTime.Now);

35herkesburada.com

Page 40: Yazilim Proje BilgeAdam

inti=0;

try

{

con.Open();

i=cmd.ExecuteNonQuery();

}

catch(SqlExceptionex)

{

throwex;

}

finally

{

con.Close();

}

if(i==1)

{

Response.Redirect(“~/kullanici/mesajgonderildi.aspx”);

}

}

Liste 1.27: btnGonder button kontrolü Click olayı.

Mesaj gönderildikten sonra kullanıcıya mesajın gittiğine dair mesajı gönderilecek ve tekrar mesaj göndermek isteyip istemediğini sorulacak mesajgonderildi.aspx sayfasını Kullanici klasörüne ek-leyin ve master page seçtirmeyin.

<%@PageLanguage=”C#”AutoEventWireup=”true”CodeFile=”mesajgonderildi.aspx.cs”Inherits=”Kullanici_mesajgonderildi”%>

<!DOCTYPEhtmlPUBLIC“-//W3C//DTDXHTML1.0Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<htmlxmlns=”http://www.w3.org/1999/xhtml”>

<headrunat=”server”>

Şekil 1.20: YeniMesaj.aspx sayfa tasarım görünümü.

36 Proje 1

Page 41: Yazilim Proje BilgeAdam

<title>MesajGönderildi</title>

<linkhref=”~/Style/Genel.css”rel=”stylesheet”type=”text/css”/>

</head>

<body>

<formid=”form1”runat=”server”>

<div>

<br/>

<asp:LabelID=”Label1”runat=”server”Font-Size=”Medium”ForeColor=”Red” Text=”Mesajınız Gönderildi...”></asp:Label><br />

<br/>

<asp:LinkButtonID=”LinkButton1”runat=”server”OnClick=”lnkYeniMesaj_Click”>YeniMesaj</asp:LinkButton>

<asp:HyperLinkID=”HyperLink1”runat=”server”NavigateUrl=”javascript:window.close();”>Kapat</asp:HyperLink></div>

</form>

</body>

</html>

Liste 1.28: Mesajgonderildi.aspx sayfası html tasarımı.

Yeni Mesaj button kontrolünün Click olayında yenimesaj.aspx sayfasına yönlendirme yapın.

protectedvoidlnkYeniMesaj_Click(objectsender,EventArgse)

{

Response.Redirect(“~/kullanici/yenimesaj.aspx”);

}

Liste 1.29: lnkYeniMesaj button kontrol Click olayı.

Mesaj gönderme ve gelen/giden mesajları görüntüleme tamamlandıktan sonra mesajoku.aspx sayfasını Kullanici klasörüne ekleyin.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”mesajoku.aspx.cs”Inherits=”Kullanici_mesajoku”Title=”UntitledPage”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

Şekil 1.21: MesajGonderildi.aspx tasarım görünümü.

Bu aşamadan sonra eklenen tüm sayfaları herkesbu-rada.master sayfasından türetin ve default.aspx sayfa-sındaki şekilde sol ve sağ taraf olacak şekilde bölün.

37herkesburada.com

Page 42: Yazilim Proje BilgeAdam

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<asp:LabelID=”lblGonderen”runat=”server”ForeColor=”Blue”Text=”Gönderen:“></asp:Label>

derki;

<br/>

<br/>

<asp:LabelID=”lblBaslik”runat=”server”Font-Bold=”True”Text=”Selamlar”></asp:Label><br/>

<br/>

<asp:LabelID=”lblMesaj”runat=”server”Text=”Label”></asp:Label>&nbsp;<br/>

<br/>

<asp:ButtonID=”btnSil”runat=”server”OnClick=”btnSil_Click”Text=”Sil”/>

<asp:ButtonID=”btnYanitla”runat=”server”OnClick=”btnYanitla_Click” Text=”Yanıtla” /></div>

</asp:Content>

Liste 1.30: Mesajoku.aspx html tasarımı.

Mesajı okutmak için mesajoku.aspx sayfasının code bölümüne Liste 1.31‘deki kodları yazın.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(!Page.IsPostBack)

{

MesajOku();

}

}

voidMesajOku()

{

if(Request.QueryString[“mesaj”]!=null)

{

try

{

Guidg=newGuid(Request.QueryString[“mesaj”]);

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“Selectm.*,[UserName]FromMesajlarmInnerjoinaspnet_Usersaona.UserId=m.KimdenWhereMesajId=@MesajIdAndKime=@Kime”,con);

38 Proje 1

Page 43: Yazilim Proje BilgeAdam

cmd.Parameters.AddWithValue(“@MesajId”,g);

cmd.Parameters.AddWithValue(“@Kime”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

try

{

con.Open();

SqlDataReaderrdr=cmd.ExecuteReader();

if(rdr.Read())

{

lblBaslik.Text=rdr[“Baslik”].ToString();

lblGonderen.Text=rdr[“UserName”].ToString();

lblMesaj.Text=rdr[“MesajIcerik”].ToString();

SqlCommandcmdGuncelle=newSqlCommand(“UpdatemesajlarSetOkunduMu=’True’WhereMesajId=@MesajId”,con);

cmdGuncelle.Parameters.AddWithValue(“@MesajId”,newGuid(Request.QueryString[“mesaj”]));

cmdGuncelle.ExecuteNonQuery();

}

else

{

Response.Redirect(“~/kullanici/default.aspx”);

}

}

catch(SqlExceptionex)

{

throwex;

}

finally{con.Close();}

}

catch(FormatExceptionex)

{

Response.Redirect(“mesajlarim.aspx”);

}

}

}

Liste 1.31: MesajOku.aspx Page_Load olayı ve MesajOku metodu.

39herkesburada.com

Page 44: Yazilim Proje BilgeAdam

Okunan mesajı cevaplamak ve silmek için btnSil ve btnCevapla button kontrol Click olaylarına Liste 1.32‘deki kodu ekleyin.

protectedvoidbtnSil_Click(objectsender,EventArgse)

{

if(Request.QueryString[“mesaj”]!=null)

{

try

{

Guidg=newGuid(Request.QueryString[“mesaj”]);

}

catch{return;}

}

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“UpdatemesajlarsetAliciyaGosterme=‘True’WhereMesajId=@MesajId”,con);

cmd.Parameters.AddWithValue(“@MesajId”,newGuid(Request.QueryString[“mesaj”]));

inti=0;

try

{

con.Open();

i=cmd.ExecuteNonQuery();

}

catch(SqlExceptionex)

{

throwex;

}

finally

{

con.Close();

}

if(i>0)Response.Redirect(“~/kullanici/mesajlarim.aspx”);

}

protectedvoidbtnYanitla_Click(objectsender,EventArgse)

{

Session[“cevap”]=“Cvp:”+lblBaslik.Text+“|”+lblGonderen.Text;;

Response.Redirect(“~/kullanici/cevapla.aspx”);

}

Liste 1.32: btnSil ve btnYanitla button kontrolü Click olayı.

40 Proje 1

Page 45: Yazilim Proje BilgeAdam

MesajOku.aspx tasarım görünümü Şekil 1.22‘de gösterilmiştir.

btnYanitla button kontrolüne tıklandığı zaman yönlendirilecek olan cevapla.aspx sayfasını Kulla-nici klasörüne ekleyin. Sayfayı eklerken masterpage seçtirmeyi unutmayın.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”cevapla.aspx.cs”Inherits=”Kullanici_cevapla”Title=”UntitledPage”%>

<%@RegisterAssembly=”AjaxControlToolkit”Namespace=”AjaxControlToolkit”TagPrefix=”cc1”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<divstyle=”text-align:left”>

<tablestyle=”width:423px”>

<tr>

<tdstyle=”width:55px”>

</td>

<tdstyle=”width:69px”>

</td>

Şekil 1.22: MesajOku.aspx tasarım görünümü.

41herkesburada.com

Page 46: Yazilim Proje BilgeAdam

<tdstyle=”width:69px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:55px”>

Kime:

</td>

<tdstyle=”width:69px”>

<asp:TextBoxID=”txtKime”runat=”server”></asp:TextBox></td>

<tdstyle=”width:69px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:55px”>

Konu:

</td>

<tdcolspan=”3”>

<asp:TextBoxID=”txtBaslik”runat=”server”Width=”100%”></asp:TextBox></td>

</tr>

<tr>

<tdstyle=”width:55px;height:18px”valign=”top”>

Mesaj:

</td>

<tdcolspan=”3”style=”height:18px”>

<asp:TextBoxID=”txtMesaj”runat=”server”Height=”107px”TextMode=”MultiLine”Width=”100%”></asp:TextBox></td>

</tr>

<tr>

<tdstyle=”width:55px”>

</td>

<tdstyle=”width:69px”>

<asp:ButtonID=”btnGonder”runat=”server”Text=”Gönder”OnClick=”btnGonder_Click”/>

</td>

<tdstyle=”width:69px”>

<asp:ButtonID=”btnIptal”runat=”server”Text=”İptal” OnClick=”btnIptal_Click” /></td>

42 Proje 1

Page 47: Yazilim Proje BilgeAdam

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:55px;height:18px”>

</td>

<tdstyle=”height:18px”colspan=”3”>

&nbsp;<cc1:AutoCompleteExtenderID=”AutoCompleteExtender1”runat=”server”ServiceMethod=”GetCompletionList”

UseContextKey=”True”TargetControlID=”txtKime”>

</cc1:AutoCompleteExtender>

</td>

</tr>

</table>

</div>

</div>

</asp:Content>

Liste 1.33: Cevapla.aspx sayfası html tasarımı.

Bu sayfada mesaj gönderilecek kişi kullanıcının arkadaşıysa, mesaj gönderilecek kişinin adı oto-matik tamamlanacaktır. Cevapla.aspx.cs dosyasına Liste 1.34’de belirtilen metodu aynen yazın.

Sayfa ilk yüklendiğinde mesaja cevap yazılacağı için session’dan gelen konu bilgisini ilgili textbox kontrolüne yazdırın ve btnGonder butonuna tıklandığı zaman mesajı gönderme kodunu yazın.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(!Page.IsPostBack)

{

if(Session[“cevap”]!=null)

{

txtBaslik.Text=Session[“cevap”].ToString().Split(‘|’)[0];

txtKime.Text=Session[“cevap”].ToString().Split(‘|’)[1];

}

}

}

protectedvoidbtnGonder_Click(objectsender,EventArgse)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

43herkesburada.com

Page 48: Yazilim Proje BilgeAdam

SqlCommandcmd=newSqlCommand(“Insertintomesajlar(Kimden,Kime,MesajIcerik,Baslik,Tarih)values(@Kimden,dbo.KullaniciIdAl(@Kime),@MesajIcerik,@Baslik,@Tarih)”,con);

cmd.Parameters.AddWithValue(“@Kimden”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

cmd.Parameters.AddWithValue(“@Kime”,txtKime.Text);

cmd.Parameters.AddWithValue(“@MesajIcerik”,txtMesaj.Text);

cmd.Parameters.AddWithValue(“@Baslik”,txtBaslik.Text);

cmd.Parameters.AddWithValue(“@Tarih”,DateTime.Now);

inti=0;

try

{

con.Open();

i=cmd.ExecuteNonQuery();

}

catch(SqlExceptionex)

{

throwex;

}

finally

{

con.Close();

}

if(i==1)

{

Response.Redirect(“~/kullanici/mesajlarim.aspx”);

}

}

protectedvoidbtnIptal_Click(objectsender,EventArgse)

{

Response.Redirect(“~/kullanici/mesajlarim.aspx”);

}

Liste 1.34: Cevapla.aspx sayfası Page_Load ve btnGonder button Click olayları.

Cevapla.aspx sayfası tasarım görünümü Şekil 1.23’de gösterilmiştir.

�� Proje 1

Page 49: Yazilim Proje BilgeAdam

Bu aşamaya kadar yapılanları test etmek için uygulamayı çalıştırın ve kayıt olun. Kendi kendinize yeni bir mesaj gönderin. Gönderdiğiniz mesaj gelen mesajlarda ve giden mesajlarda görünüyor ise, gelen mesajlardaki görünüm okunmamış mesaj olarak görünüyor ve mesaj okuduktan sonra okundu olarak işaretleniyorsa şu ana kadar yapılanlar çalışıyor demektir. Aksi bir durum var ise yazdığınız kodları test edin.

Kullanıcıların kişisel bilgilerini ve profil bilgilerini girebilecekleri bilgiler.aspx sayfasını Kullanici kla-sörüne ekleyin. Bu sayfadaki bazı bilgiler veritabanından, diğer bilgiler ise web.config dosyasında tanımlanan profile üzerinden alınacaktır.

Şekil 1.23: Cevapla.aspx sayfa tasarım görünümü.

Şekil 1.24: Bilgiler.aspx sayfa tasarım görünümü.

��herkesburada.com

Page 50: Yazilim Proje BilgeAdam

Bilgiler.aspx sayfası üzerindeki Şehir, Eğitm Durumu, Meslek ve Tuttuğu Takım bilgisi veritaba-nından alınıyor. Diğer bilgiler ise profile’dan alınıyor.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”bilgiler.aspx.cs”Inherits=”Kullanici_bilgiler”Title=”UntitledPage”%>

<%@RegisterAssembly=”System.Web.Extensions,Version=3.5.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”

Namespace=”System.Web.UI”TagPrefix=”asp”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<tablestyle=”width:100%”>

<tr>

<tdstyle=”width:280px”>

</td>

<tdstyle=”width:530px”>

</td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px;height:26px;”>

Ad:</td>

<tdstyle=”width:530px;height:26px;”>

<asp:TextBoxID=”txtAd”runat=”server”Width=”100%”></asp:TextBox></td>

<tdstyle=”width:494px;height:26px;”>

</td>

</tr>

<tr>

<tdstyle=”width:280px;height:26px;”>

Soyad:</td>

<tdstyle=”width:530px;height:26px;”>

<asp:TextBoxID=”txtSoyad”runat=”server”Width=”100%”></asp:TextBox></td>

<tdstyle=”width:494px;height:26px;”>

</td>

�� Proje 1

Page 51: Yazilim Proje BilgeAdam

</tr>

<tr>

<tdstyle=”width:280px”>

Doğum Tarihi :</td>

<tdstyle=”width:530px”>

<asp:TextBoxID=”txtDogumTarihi”runat=”server”Width=”100%”></asp:TextBox></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px;height:24px;”>

Cinsiyet</td>

<tdstyle=”width:530px;height:24px”>

<asp:DropDownListID=”drpCinsiyet”runat=”server”>

<asp:ListItemValue=”True”>Bay</asp:ListItem>

<asp:ListItemValue=”False”>Bayan</asp:ListItem>

</asp:DropDownList></td>

<tdstyle=”width:494px;height:24px;”>

</td>

</tr>

<tr>

<tdstyle=”width:280px;height:1px;”>

Yaşadınız Şehir :

</td>

<tdstyle=”width:530px;height:1px;”>

<asp:DropDownListID=”drpYasadiginizSehir”runat=”server”DataSourceID=”SqlDataSource1”DataTextField=”SehirAdi”DataValueField=”SehirId”>

</asp:DropDownList></td>

<tdstyle=”width:494px;height:1px;”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

Eğitim Durumu :

</td>

<tdstyle=”width:530px”>

<asp:DropDownListID=”drpEgitimDurumu”runat=”server”DataSourceID=”SqlDataSource2”DataTextField=”EgitimDurumAdi”DataValueField=”EgitimDurumId”>

</asp:DropDownList></td>

<tdstyle=”width:494px”>

</td>

��herkesburada.com

Page 52: Yazilim Proje BilgeAdam

</tr>

<tr>

<tdstyle=”width:280px;height:24px”>

Meslek:

</td>

<tdstyle=”width:530px;height:24px”>

<asp:DropDownListID=”drpMeslek”runat=”server”DataSourceID=”SqlDataSource3”DataTextField=”MeslekAdi”DataValueField=”MeslekId”>

</asp:DropDownList></td>

<tdstyle=”width:494px;height:24px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

Fobileriniz:

</td>

<tdstyle=”width:530px”>

<asp:TextBoxID=”txtFobi”runat=”server”TextMode=”MultiLine”Width=”100%”></asp:TextBox></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

Hobileriniz:

</td>

<tdstyle=”width:530px”>

<asp:TextBoxID=”txtHobi”runat=”server”TextMode=”MultiLine”Width=”100%”></asp:TextBox></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px;height:40px;”>

Kendinizi Anlatın :

</td>

<tdstyle=”width:530px;height:40px;”>

<asp:TextBoxID=”txtHakkinda”runat=”server”TextMode=”MultiLine”Width=”100%”></asp:TextBox></td>

<tdstyle=”width:494px;height:40px;”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

�� Proje 1

Page 53: Yazilim Proje BilgeAdam

Okuduğunuz Kitaplar :</td>

<tdstyle=”width:530px”>

<asp:TextBoxID=”txtOkuduguKitaplar”runat=”server”TextMode=”MultiLine”Width=”100%”></asp:TextBox></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

Tuttuğunuz Takım :

</td>

<tdstyle=”width:530px”>

<asp:DropDownListID=”drpTakim”runat=”server”DataSourceID=”SqlDataSource4”DataTextField=”TakimAdi”DataValueField=”TakimId”>

</asp:DropDownList></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px;height:40px;”>

Yaptığınız Sporlar</td>

<tdstyle=”width:530px;height:40px;”>

<asp:TextBoxID=”txtYaptigiSporlar”runat=”server”TextMode=”MultiLine”Width=”100%”></asp:TextBox></td>

<tdstyle=”width:494px;height:40px;”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

Sigara kullanırmısınız ? :</td>

<tdstyle=”width:530px”>

<asp:DropDownListID=”drpSigara”runat=”server”>

<asp:ListItemValue=”True”>Evet</asp:ListItem>

<asp:ListItem Value=”False”>Hayır</asp:ListItem>

</asp:DropDownList></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

Alkol kullanırmısınız ?&nbsp; :</td>

<tdstyle=”width:530px”>

��herkesburada.com

Page 54: Yazilim Proje BilgeAdam

<asp:DropDownListID=”drpAlkol”runat=”server”>

<asp:ListItemValue=”True”>Evet</asp:ListItem>

<asp:ListItem Value=”False”>Hayır</asp:ListItem>

</asp:DropDownList></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

Profilimi Arkadaşlarım Görsün</td>

<tdstyle=”width:530px”><asp:DropDownListID=”drpYetki”runat=”server”>

<asp:ListItemValue=”True”>Evet</asp:ListItem>

<asp:ListItem Value=”False”>Hayır</asp:ListItem>

</asp:DropDownList></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”valign=”top”>

</td>

<tdstyle=”width:530px”>

&nbsp;</td>

<tdstyle=”width:494px”valign=”top”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

</td>

<tdstyle=”width:530px”>

<asp:ButtonID=”btGuncelle”runat=”server”OnClick=”btGuncelle_Click”Text=”Güncelle”/></td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:280px”>

</td>

<tdstyle=”width:530px”>

</td>

<tdstyle=”width:494px”>

</td>

</tr>

</table>

50 Proje 1

Page 55: Yazilim Proje BilgeAdam

<asp:SqlDataSourceID=”SqlDataSource1”runat=”server”ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”

SelectCommand=”SELECT[SehirId],[SehirAdi]FROM[Sehirler]”></asp:SqlDataSource>

<asp:SqlDataSourceID=”SqlDataSource2”runat=”server”ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”

SelectCommand=”SELECT[EgitimDurumId],[EgitimDurumAdi]FROM[EgitimDurumlari]”>

</asp:SqlDataSource>

<asp:SqlDataSourceID=”SqlDataSource3”runat=”server”ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”

SelectCommand=”SELECT[MeslekId],[MeslekAdi]FROM[Meslekler]”></asp:SqlDataSource>

<asp:SqlDataSourceID=”SqlDataSource4”runat=”server”ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”

SelectCommand=”SELECT[TakimId],[TakimAdi]FROM[Takimlar]ORDERBY[TakimAdi]”></asp:SqlDataSource>

</div>

</asp:Content>

Liste 1.35: Bilgiler.aspx sayfası html görünümü.

Sayfa ilk yüklendiğinde profil bilgilerinin görüntülenmesini, guncelle butonuna tıklandığı zaman profil bilgilerinin güncelleneceği Liste 1.36‘daki kodu Liste.aspx.cs dosyasına yazın.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(!Page.IsPostBack)

{

BilgileriGoster();

}

}

voidBilgileriGoster()

{

txtAd.Text=Profile.KisiselBilgiler.Ad;

txtSoyad.Text=Profile.KisiselBilgiler.Soyad;

txtDogumTarihi.Text=Profile.KisiselBilgiler.DogumTarihi.ToShortDateString();

drpCinsiyet.SelectedValue=Profile.KisiselBilgiler.Cinsiyet.ToString();

// Eğitim Durumu

if(!string.IsNullOrEmpty(Profile.EgitimDurumId))

{

drpEgitimDurumu.SelectedValue=Profile.EgitimDurumId;

}

51herkesburada.com

Page 56: Yazilim Proje BilgeAdam

//Takimlar

if(!string.IsNullOrEmpty(Profile.TuttuguTakimId))

{

drpTakim.SelectedValue=Profile.TuttuguTakimId;

}

// Şehir

if(!string.IsNullOrEmpty(Profile.KisiselBilgiler.YasadigiSehirId))

{

drpYasadiginizSehir.SelectedValue=Profile.KisiselBilgiler.YasadigiSehirId;

}

//Meslek

if(!string.IsNullOrEmpty(Profile.MeslekId))

{

drpMeslek.SelectedValue=Profile.MeslekId;

}

txtYaptigiSporlar.Text=Profile.YaptigiSporlar;

txtFobi.Text=Profile.Fobileri;

txtHobi.Text=Profile.Hobileri;

txtOkuduguKitaplar.Text=Profile.OkuduguKitaplar;

txtHakkinda.Text=Profile.Hakkinda;

drpAlkol.SelectedValue=Profile.AlkolKullanirMi.ToString();

drpSigara.SelectedValue=Profile.SigaraKullanirMi.ToString();

drpYetki.SelectedValue=Profile.ProfilYetki.ToString();

}

protectedvoidbtGuncelle_Click(objectsender,EventArgse)

{

Profile.KisiselBilgiler.Ad=txtAd.Text;

Profile.AlkolKullanirMi=Convert.ToBoolean(drpAlkol.SelectedValue);

Profile.SigaraKullanirMi=Convert.ToBoolean(drpSigara.SelectedValue);

Profile.Fobileri=txtFobi.Text;

52 Proje 1

Page 57: Yazilim Proje BilgeAdam

Profile.Hobileri=txtHobi.Text;

Profile.OkuduguKitaplar=txtOkuduguKitaplar.Text;

Profile.Hakkinda=txtHakkinda.Text;

Profile.KisiselBilgiler.Soyad=txtSoyad.Text;

Profile.KisiselBilgiler.DogumTarihi=Convert.ToDateTime(txtDogumTarihi.Text);

Profile.KisiselBilgiler.Cinsiyet=Convert.ToBoolean(drpCinsiyet.SelectedValue);

Profile.YaptigiSporlar=txtYaptigiSporlar.Text;

Profile.KisiselBilgiler.YasadigiSehirId=drpYasadiginizSehir.SelectedValue;

Profile.MeslekId=drpMeslek.SelectedValue;

Profile.TuttuguTakimId=drpTakim.SelectedValue;

Profile.EgitimDurumId=drpEgitimDurumu.SelectedValue;

Profile.ProfilYetki=Convert.ToBoolean(drpYetki.SelectedValue);

}

Liste 1.36: Bilgiler.aspx sayfası kod görünümü.

Kendi kullanıcı bilgilerinizi girip bilgiler.aspx sayfasının durumunu test edin. Profil bilgilerinde kul-lanıcının kendi resmini güncellemesini ve değiştirmesini sağlamak için Kullanici klasörü içerisine profilresmi.aspx sayfası ekleyin. Default.aspx‘te yapıldığı gibi sayfayı div’lere bölün. KullaniciSol-Menu.ascx User Control içerisindeki Image kontrolüne link verilmişti. Bu link’e tıklandığı zaman eklenen sayfaya yönlendirilecektir. ProfilResmi.aspx sayfasına gerekli Label ve FileUpload kon-trolünü ekleyin.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”profilresmi.aspx.cs”Inherits=”Kullanici_profilresmi”Title=”UntitledPage”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<br/>

<tablestyle=”width:100%”>

<tr>

<tdrowspan=”5”style=”width:100px”>

<center><asp:ImageID=”imgUser”runat=”server”AlternateText=”Profilresminiz”/></center></td>

<tdstyle=”width:100px”>

53herkesburada.com

Page 58: Yazilim Proje BilgeAdam

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdcolspan=”3”>

YeniResimSeç</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdcolspan=”2”>

<asp:FileUploadID=”FileUpload1”runat=”server”Width=”345px”/></td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

<asp:ButtonID=”btnGuncelle”runat=”server”OnClick=”btnGuncelle_Click”Text=”Güncelle”/></td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

�� Proje 1

Page 59: Yazilim Proje BilgeAdam

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

</div>

</asp:Content>

Liste 1.37: ProfilResmi.aspx html tasarımı.

Gerekli html tasarımı yapıldıktan sonra Şekil 1.25‘deki görüntüyü elde edeceksiniz.

��herkesburada.com

Page 60: Yazilim Proje BilgeAdam

Kullanıcılardan gelecek resimler farklı formatlarda olabilir. Örneğin bir kullanıcı kendi resmini *.gif uzantısı ile gönderirken, diğer kullanıcı *.jpg olarak gönderebilir. Bu sorun için elinizde 2 alternatif vardır. Bunlardan ilki kullanıcının gönderdiği dosyanın uzantısını alıp dosyayı uzantısı ile kay-detmek, diğeri ise sabit bir uzantı ismi vermektir. Bu uygulama içerisinde kullanıcı resimleri için *.uyeresim olarak bir uzantı kullanılır. Herhangi bir resim formatında olduğu sürece sabit bir for-mat sorun çıkarmayacaktır. Bunun haricinde karşılaşılacak olduğunuz sorun ise resimlerin isimle-ridir. Kullanıcıların göndereceği resimlerin isimlerini çakışmayacak şekilde yeniden adlandırmanız gereklidir, bunun da en iyi yolu GUID kullanmaktır. btnGuncelle button kontrol Click olayına Liste 1.38‘deki kodu yazın.

protectedvoidbtnGuncelle_Click(objectsender,EventArgse)

{

stringresimAdi=Guid.NewGuid().ToString();

try

{

FileUpload1.SaveAs(Server.MapPath(“~/UyeResimleri/”)+resimAdi+“.uyeResim”);

Profile.ProfilResmi=resimAdi+“.uyeResim”;

Response.Redirect(“profilresmi.aspx”);

}

catch(HttpExceptionex)

{

throwex;

}

}

Liste 1.38: btnGuncelle button Click olayı.

Şekil 1.25: ProfilResmi.aspx sayfa tasarım görünümü.

�� Proje 1

Page 61: Yazilim Proje BilgeAdam

Form ilk yüklendiğinde mevcut resmi gösterebilmek için ProfilResmi.aspx sayfasının Load olayın-da mevcut resmi gösterin.

protectedvoidPage_Load(objectsender,EventArgse)

{

imgUser.ImageUrl=Server.MapPath(“~/UyeResimleri/”)+Profile.ProfilResmi;

}

Liste 1.39: ProfilResmi.aspx Page Load olayı.

Arkadaşların profil bilgilerinin ve albümlerinin görüleceği ve mesaj göndermeyi sağlayacak olan arkadaslarim.aspx sayfasını Kullanici klasörüne ekleyin ve Default.aspx sayfasındaki gibi 2 par-çaya bölün. Müşterinin istediğine göre arkadaş olabilmek için bir kişi diğerine arkadaşlık teklif edecek yani kontaklarına eklemek için izin istemiş olacak. Teklif etme işlemi ilerleyen bölümlerde yapılacak. İlk önce kullanıcıya kendine gelen teklifleri gösterecek olarak kontroller eklenecek. Daha sonra kullanıcı listesini gösterecek olan DataList kontrolü eklenecek. Bu kontrol ile arkadaş-lara mesaj gönderimi, Profil görüntüleme ve Album görüntüleme yapılabilecek.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”arkadaslarim.aspx.cs”Inherits=”Kullanici_arkadaslarim” Title=”Arkadaşlarım” %>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<br/>

&nbsp;<asp:LinkButtonID=”LinkButton2”runat=”server”ForeColor=”Blue”OnClick=”LinkButton2_Click”>GelenTeklifler</asp:LinkButton>

<asp:LinkButtonID=”lnkTeklifSayisi”runat=”server”ForeColor=”Red”OnClick=”lnkTeklifSayisi_Click”></asp:LinkButton><br/>

<br/>

<asp:UpdatePanelID=”UpdatePanel1”runat=”server”>

<ContentTemplate>

<asp:DataListid=”dtArkadaslar”runat=”server”ForeColor=”#333333”OnItemCommand=”dtArkadaslar_ItemCommand”Width=”632px”DataSourceID=”SqlDataSource1”CellPadding=”4”>

<FooterStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”></FooterStyle>

��herkesburada.com

Page 62: Yazilim Proje BilgeAdam

<AlternatingItemStyleBackColor=”White”ForeColor=”#284775”></AlternatingItemStyle>

<ItemStyleBackColor=”#F7F6F3”ForeColor=”#333333”></ItemStyle>

<SelectedItemStyleBackColor=”#E2DED6”Font-Bold=”True”ForeColor=”#333333”></SelectedItemStyle>

<HeaderStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”></HeaderStyle>

<ItemTemplate>

<tablestyle=”width:100%”>

<tr>

<tdrowspan=”2”style=”width:100px”>

<imgsrc=’<%#ResimAdres(DataBinder.Eval(Container.DataItem,“UserName”).ToString())%>’alt=’<%#Eval(“UserName”).ToString()%>resmi’/>

</td>

<tdstyle=”width:100px”>

</td>

<tdrowspan=”3”style=”width:100px”valign=”top”>

<asp:LinkButtonID=”LinkButton3”runat=”server”ForeColor=”Blue”CommandName=”MesajGonder”CommandArgument=’<%#Eval(“UserName”)%>’>MesajGönder</asp:LinkButton><br/>

<asp:LinkButtonID=”LinkButton4”runat=”server”ForeColor=”Blue”CommandName=”Sil”CommandArgument=’<%#Eval(“KullaniciId”)%>’OnClientClick=”returnconfirm(‘Arkadaşını silmekten emin misiniz ?’)”>Sil</asp:LinkButton><br/>

<asp:LinkButtonID=”LinkButton1”runat=”server”

CommandName=”AlbumGoruntule”ForeColor=”Blue”CommandArgument=’<%#DataBinder.Eval(Container.DataItem,“UserName”)%>’>AlbumGörüntüle</asp:LinkButton><br/>

<asp:LinkButtonID=”LinkButton5”runat=”server”CommandArgument=’<%#DataBinder.Eval(Container.DataItem,“UserName”)%>’

CommandName=”ProfilGoruntule”ForeColor=”Blue”>ProfilGörüntüle</asp:LinkButton></td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

�� Proje 1

Page 63: Yazilim Proje BilgeAdam

</tr>

<tr>

<tdstyle=”width:100px”>

&nbsp;<asp:LabelID=”UserNameLabel”runat=”server”Text=’<%#Eval(“UserName”)%>’></asp:Label></td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

<br/>

<br/>

</ItemTemplate>

</asp:DataList><asp:SqlDataSourceid=”SqlDataSource1”runat=”server”SelectCommandType=”StoredProcedure”SelectCommand=”ArkadasListem”ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”>

<SelectParameters>

<asp:SessionParameterName=”UserId”SessionField=”UserId”/>

</SelectParameters>

</asp:SqlDataSource>

</ContentTemplate>

</asp:UpdatePanel>

</div>

</asp:Content>

Liste 1.40: Arkadaslarim.aspx html tasarım görüntüsü.

Sayfanın görsel çıktısı Şekil 1.26’da verilmiştir.

Şekil 1.26: Arkadaslarim.aspx sayfa çıktısı.

��herkesburada.com

Page 64: Yazilim Proje BilgeAdam

Arkadaslarim.aspx sayfası ilk yüklendiği zaman sayfa üzerinde kullanıcıya gelen cevaplanmamış teklif sayılarını göstermek için TeklifSayisi() metodunu yazın ve ekrana teklif sayısını yaz-dırın.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(!Page.IsPostBack)

{

TeklifSayisi();

}

}

voidTeklifSayisi()

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“SelectCount(Kim)FromArkadasListesiwherekim=@UserIdandOnaylandiMi=‘False’”,con);

cmd.Parameters.AddWithValue(“@UserId”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

try

{

con.Open();

inti=Convert.ToInt32(cmd.ExecuteScalar());

if(i>0)

{

lnkTeklifSayisi.Text=“(“+i.ToString()+“)”;

}

else

{

lnkTeklifSayisi.Text=“”;

}

}

catch(Exception)

{

throw;

}

finally{con.Close();}

}

Liste 1.41: Arkadaslarim.aspx.cs Page_Load olayı ve TeklifSayisi metodu.

60 Proje 1

Page 65: Yazilim Proje BilgeAdam

lnkTeklifSayisi ismindeki Linkbutton kontrolünün text özelliği başlangıçta boş bırakıldı. Eğer teklif varsa Text dolacak ve dolayısıyla tıklanabilir bir hale gelecek. Eğer tıklanabiliniyor ise tekliflerim.aspx sayfasına yönlendirin.

protectedvoidlnkTeklifSayisi_Click(objectsender,EventArgse)

{

Response.Redirect(“~/Kullanici/Tekliflerim.aspx”);

}

Liste 1.42: lnkTeklifSayisi linkbutton kontrolü Click olayı.

Arkadaşları listeleyecek olan datalist kontrolünde bir eleman gösterilirken o elemana ait yani, sa-tıra ait bir işlem yapılacak ise RowCommand kullanılması gerekir. Tanımlanan datalist kontrolün-de birden fazla işlem yapılacak ve yapılacak işlemler CommandName içerisinde tanımlanacak. Örneğin:

<asp:LinkButtonID=”LinkButton1”runat=”server”

CommandName=”AlbumGoruntule”ForeColor=”Blue”CommandArgument=’<%#DataBinder.Eval(Container.DataItem,“UserName”)%>’>AlbumGörüntüle</asp:LinkButton>

Liste 1.43: Örnek bir Datalist Command tanımlaması.

Burada CommandName olarak AlbumGoruntule ismi verildi, Albumu görüntülenecek olan kullanıcı bilgisi ise CommandArgument içerisinde gönderildi. Bu şekilde Command’lere göre işlem yapa-cak olan datalist’in RowCommand olayını hazırlayın.

protectedvoiddtArkadaslar_ItemCommand(objectsource,DataListCommandEventArgse)

{

if(e.CommandName==“MesajGonder”)

{

Session[“cevap”]=“”+“|”+e.CommandArgument.ToString();

Response.Redirect(“~/kullanici/cevapla.aspx”);

}

elseif(e.CommandName==“AlbumGoruntule”)

{

Response.Redirect(“~/kullanici/albumler.aspx?album=”+e.CommandArgument.ToString());

}

elseif(e.CommandName==“ProfilGoruntule”)

{

Response.Redirect(“profildetay.aspx?profil=”+e.CommandArgument.ToString());

}

else

{

61herkesburada.com

Page 66: Yazilim Proje BilgeAdam

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“deletefromArkadasListesiWhereKim=@KimAndKimin=@Kimin”,con);

cmd.Parameters.AddWithValue(“@Kim”,newGuid(e.CommandArgument.ToString()));

cmd.Parameters.AddWithValue(“@Kimin”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

try

{

con.Open();

cmd.ExecuteNonQuery();

}

catch(Exception)

{

throw;

}

finally

{

con.Close();

}

dtArkadaslar.DataBind();

}

}

Liste 1.44: dtArkadaslar datalist kontrolü ItemCommand olayı.

Kullanıcıların resimlerini gösterebilmek için Arkadaslar.aspx.cs içerisine ResimAdres() isminde metod tanımlayın. Bu metod kullanıcının resim adını alıp datalist kontrolü içerisinde göstermesini sağlayacak. Kullanıcının profil resmi veritabanı yerine kullanıcının Profile bilgisi içerisinde tutuldu-ğu için böyle bir yöntem kullanıldı.

// Arkadaş listesinde kullanıcının resmini döndürür.

protectedstringResimAdres(stringusername)

{

stringresimAdres=Profile.GetProfile(username).ProfilResmi;

return@”../UyeResimleri/”+resimAdres;

}

Liste 1.45: Kullanıcının resim adını döndürmeyi sağlayan metod.

62 Proje 1

Page 67: Yazilim Proje BilgeAdam

Bu metod ise DataList içerisinde Liste 1.46’daki şekilde kullanıldı.

<imgsrc=’<%#ResimAdres(DataBinder.Eval(Container.DataItem,“UserName”).ToString())%>’alt=’<%#Eval(“UserName”).ToString()%>resmi’/>

Liste 1.46: Datalist içerisinden metod çağırmak.

Kullanıcıya gelen teklifleri gösterecek olan tekliflerim.aspx sayfasını Kullanici klasörüne ekleyin. Eklenen teliflerim.aspx sayfasında kullanıcıya gelen teklifler update panel içerisindeki datagrid kontrolü içerisinde gösteriliyor.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”tekliflerim.aspx.cs”Inherits=”Kullanici_tekliflerim”Title=”Tekliflerim”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<br/>

Tekliflisteniz.<br/>

<br/>

<asp:UpdatePanelID=”UpdatePanel1”runat=”server”>

<ContentTemplate>

<asp:GridViewID=”grdTeklifler”runat=”server”AllowPaging=”True”AllowSorting=”True”

AutoGenerateColumns=”False”CellPadding=”4”DataSourceID=”SqlDataSource1”ForeColor=”#333333”

GridLines=”None”Width=”606px”DataKeyNames=”Kim”OnRowCommand=”grdTeklifler_RowCommand”EmptyDataText=”Listenizdecevapsız teklifiniz bulunmuyor...”>

<FooterStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

<Columns>

<asp:HyperLinkFieldDataNavigateUrlFields=”UserName”DataNavigateUrlFormatString=”~/kullanici/profildetay.aspx?type=r&amp;value={0}”

DataTextField=”UserName”HeaderText=”TeklifteBulunan”/>

<asp:TemplateFieldShowHeader=”False”>

<ItemTemplate>

63herkesburada.com

Page 68: Yazilim Proje BilgeAdam

<asp:LinkButtonID=”LinkButton2”runat=”server”CausesValidation=”False”CommandName=”Onayla”

Text=”Onayla”CommandArgument=’<%#Eval(“Kimin”)%>’></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

<asp:TemplateFieldShowHeader=”False”>

<ItemTemplate>

<asp:LinkButtonID=”LinkButton1”

runat=”server”OnClientClick=”returnconfirm(‘Bu teklifi reddetmek istediğinizden emin misiniz?’)”

CausesValidation=”False”CommandName=”Sil”CommandArgument=’<%#Eval(“Kimin”)%>’

Text=”Sil”></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

</Columns>

<RowStyleBackColor=”#F7F6F3”ForeColor=”#333333”/>

<EditRowStyleBackColor=”#999999”/>

<SelectedRowStyleBackColor=”#E2DED6”Font-Bold=”True”ForeColor=”#333333”/>

<PagerStyleBackColor=”#284775”ForeColor=”White”HorizontalAlign=”Center”/>

<HeaderStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

<AlternatingRowStyleBackColor=”White”ForeColor=”#284775”/>

</asp:GridView>

<asp:SqlDataSourceID=”SqlDataSource1”runat=”server”ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”

SelectCommand=”SELECTaspnet_Users.UserName,ArkadasListesi.Kim,ArkadasListesi.KiminFROMArkadasListesiINNERJOINaspnet_Users&#13;&#10;ONArkadasListesi.Kimin=aspnet_Users.UserIdWHEREArkadasListesi.OnaylandiMi=&#13;&#10;’False’And(ArkadasListesi.Kim=@UserId)”>

<SelectParameters>

<asp:SessionParameterName=”UserId”SessionField=”UserId”/>

</SelectParameters>

</asp:SqlDataSource>

</ContentTemplate>

</asp:UpdatePanel>

</div>

</asp:Content>

Liste 1.47: Tekliflerim.aspx html tasarımı.

�� Proje 1

Page 69: Yazilim Proje BilgeAdam

Eğer kullanıcının bir teklifi yoksa “Listenizde cevapsız teklifiniz bulunmuyor...” mesajı gösterilir. Bu yazıyı datagrid kontrolünün EmptyDataText özelliğini kullanarak yapın. Gelen teklifi onayla-mak için veya silmek için DataList kontrolünün RowCommand olayını kullanın.

protectedvoidgrdTeklifler_RowCommand(objectsender,GridViewCommandEventArgse)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand();

if(e.CommandName==“Onayla”)

{

cmd.CommandText=“UpdateArkadasListesiSetOnaylandiMi=’True’WhereKim=@UserIdAndKimin=@IsteyenAndOnaylandiMi=’False’”;

}

else

{

cmd.CommandText=“DeletefromArkadasListesiWhereKim=@UserIdAndKimin=@IsteyenAndOnaylandiMi=’False’”;

}

cmd.Parameters.AddWithValue(“@UserId”,newGuid(Session[“UserId”].ToString()));

cmd.Parameters.AddWithValue(“@Isteyen”,e.CommandArgument.ToString());

cmd.Connection=con;

try

{

con.Open();

cmd.ExecuteNonQuery();

}

catch(SqlExceptionex)

{

throwex;

}

finally

{

con.Close();

��herkesburada.com

Page 70: Yazilim Proje BilgeAdam

}

Response.Redirect(“tekliflerim.aspx”);

}

Liste 1.48: Teklifleri listeleyen datalist kontrolünün RowCommand olayı.

Tekliflerim.aspx sayfasının görsel çıkıtısı Şekil 1.27‘de gösterilmiştir.

Arkadaş listesindeki bir kullanıcının profilini görüntülemek için veya arama sonrasında çıkan kul-lanıcıların profillerini görüntüleyebilmek için profildetay.aspx sayfasını Kullanici klasörüne ekleyin. Kullanıcının profilindeki bilgileri gösterecek arayüzü tasarlayın.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”profildetay.aspx.cs”Inherits=”Kullanici_profildetay”Title=”UntitledPage”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<tablestyle=”width:100%”>

<tr>

<tdstyle=”width:118px”>

Şekil 1.27: Tekliflerim.aspx tasarım görünümü.

�� Proje 1

Page 71: Yazilim Proje BilgeAdam

</td>

<tdstyle=”width:365px”>

</td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdrowspan=”8”style=”width:118px”valign=”top”>

<asp:ImageID=”imgProfilResmi”runat=”server”Height=”175px”Width=”145px”/></td>

<tdstyle=”width:365px;height:12px;”valign=”top”>

Ad:</td>

<tdstyle=”width:530px;height:12px;”>

<asp:LabelID=”lblAd”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:365px;height:8px;”valign=”top”>

Soyad:</td>

<tdstyle=”width:530px;height:8px;”>

<asp:LabelID=”lblSoyad”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:365px”valign=”top”>

Doğum Tarihi :</td>

<tdstyle=”width:530px”>

<asp:LabelID=”lblDogumTarihi”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:365px;height:6px;”valign=”top”>

Cinsiyet:</td>

<tdstyle=”width:530px;height:6px”>

<asp:LabelID=”lblCinsiyet”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:365px;height:1px;”valign=”top”>

Yaşadığı Şehir :

</td>

<tdstyle=”width:530px;height:1px;”>

<asp:LabelID=”lblYasadigiSehir”runat=”server”></asp:Label></td>

</tr>

��herkesburada.com

Page 72: Yazilim Proje BilgeAdam

<tr>

<tdstyle=”width:365px”valign=”top”>

Eğitim Durumu :

</td>

<tdstyle=”width:530px”>

<asp:LabelID=”lblEgitimDurumu”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:365px;”valign=”top”>

Meslek:

</td>

<tdstyle=”width:530px;”>

<asp:LabelID=”lblMeslek”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:365px”valign=”top”>

Fobileri:

</td>

<tdstyle=”width:530px”>

<asp:LabelID=”lblFobileri”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”valign=”top”>

Hobileri:

</td>

<tdstyle=”width:530px”>

<asp:LabelID=”lblHobileri”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:118px;”>

</td>

<tdstyle=”width:365px;”valign=”top”>

Hakkında :

</td>

<tdstyle=”width:530px;”>

<asp:LabelID=”lblHakkinda”runat=”server”></asp:Label></td>

</tr>

<tr>

�� Proje 1

Page 73: Yazilim Proje BilgeAdam

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”valign=”top”>

Okuduğunu Kitaplar :</td>

<tdstyle=”width:530px”>

<asp:LabelID=”lblOkuduguKitaplar”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”valign=”top”>

Tuttuğu Takım :

</td>

<tdstyle=”width:530px”>

<asp:LabelID=”lblTuttuguTakim”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:118px;”>

</td>

<tdstyle=”width:365px;”valign=”top”>

Yaptığı Sporlar</td>

<tdstyle=”width:530px;”>

<asp:LabelID=”lblYaptigiSporlar”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”valign=”top”>

Sigara kullanırmı ? :</td>

<tdstyle=”width:530px”>

<asp:LabelID=”lblSigara”runat=”server”></asp:Label></td>

</tr>

<tr>

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”valign=”top”>

Alkol kullanırmı ?&nbsp; :</td>

<tdstyle=”width:530px”>

<asp:LabelID=”lblAlkol”runat=”server”></asp:Label></td>

</tr>

��herkesburada.com

Page 74: Yazilim Proje BilgeAdam

<tr>

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”>

</td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”>

</td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”>

</td>

<tdstyle=”width:494px”>

</td>

</tr>

<tr>

<tdstyle=”width:118px”>

</td>

<tdstyle=”width:365px”>

</td>

<tdstyle=”width:494px”>

</td>

</tr>

</table>

&nbsp;&nbsp;

</div>

</asp:Content>

Liste 1.49: ProfilDetay.aspx html tasarımı.

Kullanıcının bazı bilgileri veritabanından bazıları ise Profile üzerinden alınacak. Kullanıcıların veritabanı üzerinden alınacak bilgileri için veritabanı sunucunuz üzerinde KullaniciDetay stored procedure’ü oluşturun.

CreateProcKullaniciDetay

(

@EgitimDurumIdint,

70 Proje 1

Page 75: Yazilim Proje BilgeAdam

@MeslekIdint,

@TakimIdint,

@SehirIdint

)

AS

DECLARE@Egitimnvarchar(50)

DECLARE@Mesleknvarchar(50)

DECLARE@Takimnvarchar(50)

DECLARE@Sehirnvarchar(50)

Select@Egitim=EgitimDurumAdiFromEgitimDurumlariWhereEgitimDurumId=@EgitimDurumId

Select@Meslek=MeslekAdiFromMesleklerWhereMeslekId=@MeslekId

Select@Takim=TakimAdiFromTakimlarWhereTakimId=@TakimId

Select@Sehir=SehirAdiFromSehirlerWhereSehirId=@SehirId

Select@EgitimAsEgitim,@MeslekAsMeslek,@TakimasTakim,@SehirAsSehir

Liste 1.50: KullaniciDetay.sql stored procedure’ü.

Kullanıcının profilini gösterecek metodları profildetay.aspx.cs dosyasına yazın. Burada dikkat edilmesi gereken; profili görmek isteyen kullanıcının, yani oturum açan kullanıcının bu profili gör-meye yetkisi olup olmamasıdır. Eğer profili görüntülenmek istenen kullanıcı sadece arkadaşları-nın profili görüntülemesine izin verdiyse, profili görüntülemek isteyen kişinin arkadaş listesinde olup olmadığının kontrolünün yapılması gerekir. Kullanıcı profili görüntülemeyi sağlayan kod Liste 1.51‘de verilmiştir.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(Request.QueryString[“profil”]!=null)

{

stringkullanici=Request.QueryString[“profil”];

if(ProfilYetki(kullanici))

{

ProfilGoruntule(kullanici);

}

else

Response.Redirect(“arkadaslarim.aspx”);

}

else

{

71herkesburada.com

Page 76: Yazilim Proje BilgeAdam

Response.Redirect(“arkadaslarim.aspx”);

}

}

boolProfilYetki(stringkullanici)

{

if(Profile.GetProfile(kullanici).ProfilYetki)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlDataAdapterda=newSqlDataAdapter(“ArkadasListem”,con);

da.SelectCommand.Parameters.AddWithValue(“@UserId”,Membership.GetUser(kullanici).ProviderUserKey);

da.SelectCommand.CommandType=CommandType.StoredProcedure;

DataTabledt=newDataTable();

da.Fill(dt);

boolsonuc=false;

foreach(DataRowdrindt.Rows)

{

if(dr[“Username”].ToString()==kullanici)

{

sonuc=true;

}

}

returnsonuc;

}

else

returntrue;

}

voidProfilGoruntule(stringkullanici)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“ConStrHerkesBurada”].ConnectionString);

SqlCommandcmd=newSqlCommand(“KullaniciDetay”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@EgitimDurumId”,Profile.EgitimDurumId);

cmd.Parameters.AddWithValue(“@MeslekId”,Profile.MeslekId);

72 Proje 1

Page 77: Yazilim Proje BilgeAdam

cmd.Parameters.AddWithValue(“@TakimId”,Profile.TuttuguTakimId);

cmd.Parameters.AddWithValue(“@SehirId”,Profile.KisiselBilgiler.YasadigiSehirId);

try

{

con.Open();

SqlDataReaderrdr=cmd.ExecuteReader();

if(rdr.Read())

{

lblEgitimDurumu.Text=rdr[“Egitim”].ToString();

lblMeslek.Text=rdr[“Meslek”].ToString();

lblTuttuguTakim.Text=rdr[“Takim”].ToString();

lblYasadigiSehir.Text=rdr[“Sehir”].ToString();

}

}

catch(Exception)

{

throw;

}

finally

{

con.Close();

}

stringurl=@”../UyeResimleri/”+Profile.GetProfile(kullanici).ProfilResmi;

imgProfilResmi.ImageUrl=url;

lblAd.Text=Profile.GetProfile(kullanici).KisiselBilgiler.Ad;

lblSoyad.Text=Profile.GetProfile(kullanici).KisiselBilgiler.Soyad;

lblDogumTarihi.Text=Profile.GetProfile(kullanici).KisiselBilgiler.DogumTarihi.ToShortDateString();

lblHakkinda.Text=Profile.GetProfile(kullanici).Hakkinda;

lblAlkol.Text=DurumGosterici(Profile.AlkolKullanirMi);

lblCinsiyet.Text=CinsiyetGosterici(Profile.KisiselBilgiler.Cinsiyet);

lblHobileri.Text=Profile.GetProfile(kullanici).Hobileri;

lblFobileri.Text=Profile.GetProfile(kullanici).Fobileri;

lblOkuduguKitaplar.Text=Profile.GetProfile(kullanici).OkuduguKitaplar;

lblSigara.Text=DurumGosterici(Profile.SigaraKullanirMi);

73herkesburada.com

Page 78: Yazilim Proje BilgeAdam

lblYaptigiSporlar.Text=Profile.GetProfile(kullanici).YaptigiSporlar;

}

stringCinsiyetGosterici(boolcinsiyet)

{

if(!cinsiyet)

return“Bay”;

else

return“Bayan”;

}

stringDurumGosterici(booldurum)

{

if(durum)

return“Evet”;

else

return “Hayır”;

}

Liste 1.51: Profil görüntüleme kodu. (ProfilDetay.aspx.cs)s

ProfilDetay.aspx sayfasının tasarım görünümü Şekil 1.28’de verilmiştir.

Kişisel albüm oluşturmayı sağlamak ve yönetmek için Kullanici klasörü içerisine albumlerim.aspx isimli bir sayfa ekleyin. Bu sayfa içerisine aynen mesaj göndermedeki gibi yeni bir albüm oluş-

Şekil 1.28: ProfilDetay.aspx sayfası tasarım görünümü.

�� Proje 1

Page 79: Yazilim Proje BilgeAdam

turma link’i ekleyin ve bu link’te yeni mesaj göndermedeki gibi popup penceresinde yeni album sayfası açın.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”

CodeFile=”albumlerim.aspx.cs”Inherits=”Kullanici_albumlerim”Title=”Albümlerim”%>

<%@RegisterAssembly=”System.Web.Extensions,Version=3.5.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”

Namespace=”System.Web.UI”TagPrefix=”asp”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<scriptlanguage=”javascript”type=”text/javascript”>

functionYeniMesajGoster()

{

window.open(‘yenialbum.aspx’,’yenimesaj’,’width=350,height=80’);

}

</script>

<asp:LinkButtonID=”lnkYeniAlbum”runat=”server”OnClientClick=”YeniMesajGoster(); return false;”>Yeni Album Oluştur</asp:LinkButton><br/>

&nbsp;<asp:UpdatePanelid=”UpdatePanel1”runat=”server”><contenttemplate>

<asp:GridViewID=”grdAlbumler”runat=”server”AutoGenerateColumns=”False”CellPadding=”4”

DataKeyNames=”AlbumId” EmptyDataText=”Tanımlanmış albümünüzbulunmuyor”

ForeColor=”#333333”GridLines=”None”Width=”100%”

OnRowDeleting=”grdAlbumler_RowDeleting”OnRowEditing=”grdAlbumler_RowEditing”

OnRowUpdating=”grdAlbumler_RowUpdating”OnRowCancelingEdit=”grdAlbumler_RowCancelingEdit”>

��herkesburada.com

Page 80: Yazilim Proje BilgeAdam

<FooterStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

<RowStyleBackColor=”#F7F6F3”ForeColor=”#333333”/>

<Columns>

<asp:TemplateField>

<EditItemTemplate>

<asp:TextBoxID=”txtAlbumAdi”runat=”server”Text=’<%#DataBinder.Eval(Container.DataItem,”AlbumAdi”)%>‘></asp:TextBox>

</EditItemTemplate>

<ItemTemplate>

<ahref=’album.aspx?album=<%#DataBinder.Eval(Container.DataItem,”AlbumId”)%>’>

<asp:LabelID=”lblAlbumAdi”runat=”server”Text=’<%#Eval(“AlbumAdi”)%>‘></asp:Label></a>

</ItemTemplate>

</asp:TemplateField>

<asp:BoundFieldDataField=”OlusturulmaTarihi”DataFormatString=”{0:d}” HeaderText=”Oluşturulma Tarihi”

HtmlEncode=”False”ReadOnly=”True”SortExpression=”OlusturulmaTarihi”/>

<asp:HyperLinkFieldDataNavigateUrlFields=”albumId”DataNavigateUrlFormatString=”resimekle.aspx?albumId={0}”

Text=”ResimEkle”/>

<asp:TemplateFieldShowHeader=”False”>

<EditItemTemplate>

<asp:LinkButtonID=”lnkGuncelle”runat=”server”CausesValidation=”True”CommandName=”Update”

Text=”Güncelle”>

</asp:LinkButton>

<asp:LinkButtonID=”lnkIptal”runat=”server”CausesValidation=”False”CommandName=”Cancel”

Text=”İptal”></asp:LinkButton>

</EditItemTemplate>

<ItemTemplate>

<asp:LinkButtonID=”LinkButton3”runat=”server”CausesValidation=”False”CommandName=”Edit”

Text=”Düzenle”></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

<asp:TemplateFieldShowHeader=”False”>

<ItemTemplate>

<asp:LinkButtonID=”LinkButton1”runat=”server”

CausesValidation=”False”CommandName=”Delete”OnClientClick=”returnconfirm(‘Bualbümü

�� Proje 1

Page 81: Yazilim Proje BilgeAdam

silmek istediğinizden eminmisiniz\rAlbümü silerseniz albümdeki resimlerdesilinecek’)”

Text=”Sil”></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

</Columns>

<PagerStyleBackColor=”#284775”ForeColor=”White”HorizontalAlign=”Center”/>

<SelectedRowStyleBackColor=”#E2DED6”Font-Bold=”True”ForeColor=”#333333”/>

<HeaderStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

<EditRowStyleBackColor=”#999999”/>

<AlternatingRowStyleBackColor=”White”ForeColor=”#284775”/>

</asp:GridView></contenttemplate>

</asp:UpdatePanel>

</div>

</asp:Content>

Liste 1.52: Albumlerim.aspx html tasarımı.

Yapılan tasarım sonucu albumlerim.aspx sayfası tasarım görünümü Şekil 1.29’da gösterilmiştir.

Sayfa ilk yüklendiğinde gerekli datagrid kontrolüne verileri doldurmak için gerekli kodları Liste 1.53’deki şekilde yazın.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(!Page.IsPostBack)

Şekil 1.29: albumlerim.aspx sayfası tasarım görünümü.

��herkesburada.com

Page 82: Yazilim Proje BilgeAdam

VerileriDoldur();

}

voidVerileriDoldur()

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlDataAdapterda=newSqlDataAdapter(“SELECT[AlbumId],[AlbumAdi],[KullaniciId],[OlusturulmaTarihi],[SadeceArkadaslarGorsun]FROM[Albumler]WHERE([KullaniciId]=@KullaniciId)”,con);

da.SelectCommand.Parameters.AddWithValue(“@KullaniciId”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

DataTabledt=newDataTable();

da.Fill(dt);

grdAlbumler.DataSource=dt;

grdAlbumler.DataBind();

}

Liste 1.53: albumlerim.aspx sayfasında album listesini dolduran metodlar.

Albüm düzenleme ve silme işlemleri için grdAlbumler datagridview kontrolünün RowEditing, RowUpdating, RowCancelEditing ve RowDeleting olaylarına gerekli kodları Liste 1.54‘deki şekil-de yazın.

protectedvoidgrdAlbumler_RowEditing(objectsender,GridViewEditEventArgse)

{

grdAlbumler.EditIndex=e.NewEditIndex;

VerileriDoldur();

}

protectedvoidgrdAlbumler_RowCancelingEdit(objectsender,GridViewCancelEditEventArgse)

{

grdAlbumler.EditIndex=-1;

VerileriDoldur();

}

protectedvoidgrdAlbumler_RowUpdating(objectsender,GridViewUpdateEventArgse)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“updateAlbumlersetAlbumAdi=@AlbumAdiwherealbumId=@AlbumId”,con);

cmd.Parameters.AddWithValue(“@AlbumAdi”,((TextBox)grdAlbumler.Rows[e.RowIndex].FindControl(“txtAlbumAdi”)).Text);

�� Proje 1

Page 83: Yazilim Proje BilgeAdam

cmd.Parameters.AddWithValue(“@AlbumId”,newGuid(grdAlbumler.DataKeys[e.RowIndex].Value.ToString()));

try

{

con.Open();

cmd.ExecuteNonQuery();

}

catch(Exception)

{

throw;

}

finally

{

con.Close();

}

grdAlbumler.EditIndex=-1;

VerileriDoldur();

}

protectedvoidgrdAlbumler_RowDeleting(objectsender,GridViewDeleteEventArgse)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“deletefromAlbumlerwherealbumId=@albumId”,con);

cmd.Parameters.AddWithValue(“@albumId”,newGuid(grdAlbumler.DataKeys[e.RowIndex].Value.ToString()));

try

{

con.Open();

cmd.ExecuteNonQuery();

}

catch(Exception)

{

throw;

}

finally

{

con.Close();

VerileriDoldur();

}

}

Liste 1.54: grdAlbumler datagridview kontrolü olayları.

��herkesburada.com

Page 84: Yazilim Proje BilgeAdam

Yeni albüm eklemek için Kullanici klasörü içerisine yenialbum.aspx sayfasını ekleyin. Bu sayfayı eklerken yenimesaj.aspx sayfasında olduğu gibi master page seçtirmeyin. Sayfa içerisinde albüm adının yazılacağı bir textbox kontrolü ve albüm izninin verileceği bir dropdownlist kontrolü ekleyin. Dropdownlist kontrolüne Herkes Görebilsin ve Sadece Arkadaşlarım olmak üzere 2 eleman ekle-yin ve value özelliklerini true, false verin. Boş bırakılmaması gereken yerler için gerekli validation kontrolleri kullanın.

<%@PageLanguage=”C#”AutoEventWireup=”true”CodeFile=”yenialbum.aspx.cs”Inherits=”Kullanici_yenialbum”%>

<!DOCTYPEhtmlPUBLIC“-//W3C//DTDXHTML1.0Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<htmlxmlns=”http://www.w3.org/1999/xhtml”>

<headrunat=”server”>

<title>Yeni Albüm Oluştur</title>

<linkhref=”../Style/Genel.css”rel=”stylesheet”type=”text/css”/>

<scriptlanguage=”javascript”type=”text/javascript”>

functionKapat()

{

window.opener.location.reload(true);

}

</script>

</head>

<bodystyle=”text-align:left”onunload=”Kapat();”>

<formid=”form1”runat=”server”>

<div>

<br/>

&nbsp;&nbsp;

<asp:Label ID=”Label1” runat=”server” Text=”Album Adı : “></asp:Label>

<asp:TextBoxID=”txtAlbum”runat=”server”></asp:TextBox>&nbsp;

<asp:RequiredFieldValidatorID=”RequiredFieldValidator1”runat=”server”ControlToValidate=”txtAlbum”

ErrorMessage=”Albüm adını boş bırakmayın”>!</asp:RequiredFieldValidator><asp:ButtonID=”btnYeniAlbum”runat=”server”Text=”Oluştur” OnClick=”btnYeniAlbum_Click” />&nbsp;&nbsp;<br />

&nbsp;&nbsp; İzin:

<asp:DropDownListID=”drpIzinler”runat=”server”>

<asp:ListItemSelected=”True”Value=”False”>HerkesG&#246;rebilsin</asp:ListItem>

80 Proje 1

Page 85: Yazilim Proje BilgeAdam

<asp:ListItem Value=”True”>Sadece Arkadaşlarım</asp:ListItem>

</asp:DropDownList><br/>

&nbsp;&nbsp;

<asp:LabelID=”lblSonuc”runat=”server”Font-Size=”Small”ForeColor=”Red”></asp:Label><br/>

<asp:ValidationSummaryID=”ValidationSummary1”runat=”server”ShowMessageBox=”True”

ShowSummary=”False”/>

</div>

</form>

</body>

</html>

Liste 1.55: Yenialbum.aspx html tasarımı.

Bu sayfa içerisinde Kapat isminde bir javascript metodu kullanıldı. Bu metod sayfa kapatılırken veya body elementinin unload olayı çağrıldığında popup olarak kendini açtıran sayfayı, yani al-bumlerim.aspx sayfasını yenileyecek ve dolayısıyla popup ekranın eklenen albüm bilgisi otomatik olarak albumlerim.aspx sayfasında görünecek. Bunu sağlayan ise window.opener.locati-on.reload(true); kodu yani javascript ile yazılan Kapat metodudur.

btnYeniAlbum button kontrolünün Click olayına Liste 1.56‘daki kodu yazın.

protectedvoidbtnYeniAlbum_Click(objectsender,EventArgse)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“insertintoAlbumler(AlbumAdi,KullaniciId,OlusturulmaTarihi,SadeceArkadaslarGorsun)values(@AlbumAdi,@KullaniciId,@OlusturulmaTarihi,@Izin)”,con);

cmd.Parameters.AddWithValue(“@AlbumAdi”,txtAlbum.Text);

cmd.Parameters.AddWithValue(“@KullaniciId”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

cmd.Parameters.AddWithValue(“@OlusturulmaTarihi”,DateTime.Now);

cmd.Parameters.AddWithValue(“@Izin”,Convert.ToBoolean(drpIzinler.SelectedValue));

try

{

con.Open();

inti=cmd.ExecuteNonQuery();

if(i>0)

{

lblSonuc.Text=“Albümeklendi”;

}

81herkesburada.com

Page 86: Yazilim Proje BilgeAdam

}

catch(Exceptionex)

{

throw;

}

finally

{

con.Close();

}

}

Liste 1.56: btnYeniAlbum kontrolü Click olayı.

Yeni albüm ekleme sayfası tasarım görünümü Şekil 1.30’da verilmiştir.

Bu aşamadan sonra eklenen her albümden sonra bu say-fayı açtıran albumlerim.aspx sayfası da otomatik olarak güncellenecek ve yeni eklenen albüm eklendiği an görü-necektir. Albumlerim.aspx sayfasında Resim Ekle buto-nuna tıklandığı zaman resimekle.aspx sayfasına yönlen-dirme yapıldı. Kullanici klasörüne resimekle.aspx sayfası ekleyin ve açın. Bu sayfa QueryString ile gelen veriye göre resim ekleyecek, yani querystring’den gelen AlbumId’ye sahip albüme resim ekleyecek. Gelen AlbumId’nin istenen

formatta olup olmadığını kontrol etmelisiniz. Eğer Int32 tipinden AlbumId varsa numeric olup ol-madığının kontrol edilmesi gerekir. Bu projede AlbumId sütun tipi veritabanında uniqueidentifier, yani C#’taki veri tipinde GUID’e karşılık gelir. Page_Load olayında gelen parametrenin GUID olup olmadığını kontrol edin.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(Request.QueryString[“albumId”]!=null)

{

try

{

Guidalbum=newGuid(Request.QueryString[“albumId”]);

}

catch(Exception)

{

Response.Redirect(“~/kullanici/albumlerim.aspx”);

}

}

else

Response.Redirect(“~/kullanici/albumlerim.aspx”);

}

Liste 1.57: Resimekle.aspx Page_Load olayı QueryString kontrolü.

Şekil 1.30: YeniAlbum.aspx tasarım görünümü.

82 Proje 1

Page 87: Yazilim Proje BilgeAdam

Kontrol yapıldıktan sonra sayfa tasarımı yapın. ProfilResmi.aspx sayfasındaki tasarıma yakın bir tasarım yapın. Gerekli FileUpload ve diğer kontrolleri ekleyin.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”resimekle.aspx.cs”Inherits=”Kullanici_resimekle”Title=”UntitledPage”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<br/>

<tablestyle=”width:100%”>

<tr>

<tdstyle=”width:100px”>

<asp:LabelID=”lblSonuc”runat=”server”ForeColor=”Red”></asp:Label></td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdcolspan=”3”>

ResimSeç</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdcolspan=”2”>

<asp:FileUploadID=”FileUpload1”runat=”server”Width=”492px”/></td>

<tdstyle=”width:100px”>

</td>

83herkesburada.com

Page 88: Yazilim Proje BilgeAdam

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

<asp:ButtonID=”btnEkle”runat=”server”OnClick=”btnEkle_Click”Text=”Ekle”Width=”156px”/></td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

�� Proje 1

Page 89: Yazilim Proje BilgeAdam

</div>

</asp:Content>

Liste 1.58: ResimEkle.aspx html tasarımı.

Yapılan html tasarımı sonucu ortaya çıkan sayfa Şekil 1.31’de gösterilmiştir.

Ekle butonuna tıklandığı zaman resmi siteye yükleyecek kodu Liste 1.59‘daki şekilde yazın.

protectedvoidbtnEkle_Click(objectsender,EventArgse)

{

stringresimAdi=Guid.NewGuid().ToString();

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

try

{

stringresimUrl=Server.MapPath(“~/Albumler/”)+resimAdi+“.albumresmi”;

FileUpload1.SaveAs(resimUrl);

SqlCommandcmd=newSqlCommand(“Insertintofotograflar(AlbumId,ResimUrl,EklenmeZamani)values(@AlbumId,@ResimUrl,@EklenmeZamani)”,con);

cmd.Parameters.AddWithValue(“@AlbumId”,newGuid(Request.QueryString[“albumId”]));

cmd.Parameters.AddWithValue(“@ResimUrl”,resimAdi+”.albumresmi”);

cmd.Parameters.AddWithValue(“@EklenmeZamani”,DateTime.Now);

con.Open();

Şekil 1.31: ResimEkle.aspx sayfası tasarım görünümü.

��herkesburada.com

Page 90: Yazilim Proje BilgeAdam

cmd.ExecuteNonQuery();

lblSonuc.Text=“Resimeklendi”;

}

catch(HttpExceptionex)

{

lblSonuc.Text = “Hata oluştu”;

}

finally

{

con.Close();

}

}

Liste 1.59: ResimEkle.aspx btnEkle button kontrolü Click olayı.

Albumlerim.aspx sayfasında listelenen bir albüm adına tıklandığı zaman albümdeki resimleri gös-teren album.aspx sayfasını Kullanici klasörüne ekleyin. Eklenen album.aspx sayfasında da gelen parametrenin GUID tipinde olup olmadığını kontrol edin.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(Request.QueryString[“album”]!=null)

{

try

{

Guidg=newGuid(Request.QueryString[“album”]);

}

catch

{

Response.Redirect(“albumlerim.aspx”);

}

}

}

Liste 1.60: Album.aspx Page_Load olayı.

Albüm içerisindeki resimleri listelemek için sayfaya gridview ekleyip kullanacağı Data Source’u yapılandırın. Resim gösterileceği için TemplateField içerisinde resmi gösterin.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”album.aspx.cs”Inherits=”Kullanici_album”Title=”UntitledPage”%>

�� Proje 1

Page 91: Yazilim Proje BilgeAdam

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<br/>

<asp:HyperlinkID=”lnkYeniResim”runat=”server”NavigateUrl=”resimekle.aspx”>YeniResimEkle</asp:Hyperlink><br/>

<br/>

<asp:GridViewID=”GridView1”runat=”server”AutoGenerateColumns=”False”CellPadding=”4”

DataKeyNames=”FotografId”DataSourceID=”SqlDataSource1”ForeColor=”#333333”GridLines=”None”

Width=”100%”AllowPaging=”True”>

<FooterStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

<Columns>

<asp:TemplateFieldHeaderText=”ResimUrl”SortExpression=”ResimUrl”>

<EditItemTemplate>

<asp:TextBoxID=”TextBox1”runat=”server”Text=’<%#Bind(“ResimUrl”)%>’></asp:TextBox>

</EditItemTemplate>

<ItemTemplate>

<imgsrc=’../Albumler/<%#DataBinder.Eval(Container.DataItem,”ResimUrl”)%>’alt=””height=”60”width=”60”/>

</ItemTemplate>

</asp:TemplateField>

<asp:CommandFieldDeleteText=”Sil”ShowDeleteButton=”True”/>

</Columns>

<RowStyleBackColor=”#F7F6F3”ForeColor=”#333333”/>

<EditRowStyleBackColor=”#999999”/>

<SelectedRowStyleBackColor=”#E2DED6”Font-Bold=”True”ForeColor=”#333333”/>

<PagerStyleBackColor=”#284775”ForeColor=”White”HorizontalAlign=”Center”/>

<HeaderStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

��herkesburada.com

Page 92: Yazilim Proje BilgeAdam

<AlternatingRowStyleBackColor=”White”ForeColor=”#284775”/>

</asp:GridView>

<asp:SqlDataSourceID=”SqlDataSource1”runat=”server”ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”

SelectCommand=”SELECT[FotografId],[AlbumId],[ResimUrl],[EklenmeZamani]FROM[Fotograflar]WHERE([AlbumId]=@AlbumId)”DeleteCommand=”DELETEFROM[Fotograflar]WHERE[FotografId]=@FotografId”InsertCommand=”INSERTINTO[Fotograflar]([FotografId],[AlbumId],[ResimUrl],[EklenmeZamani])VALUES(@FotografId,@AlbumId,@ResimUrl,@EklenmeZamani)”UpdateCommand=”UPDATE[Fotograflar]SET[AlbumId]=@AlbumId,[ResimUrl]=@ResimUrl,[EklenmeZamani]=@EklenmeZamaniWHERE[FotografId]=@FotografId”>

<SelectParameters>

<asp:QueryStringParameterName=”AlbumId”QueryStringField=”album”Type=”String”/>

</SelectParameters>

<DeleteParameters>

<asp:ParameterName=”FotografId”Type=”Object”/>

</DeleteParameters>

<UpdateParameters>

<asp:ParameterName=”AlbumId”Type=”Object”/>

<asp:ParameterName=”ResimUrl”Type=”String”/>

<asp:ParameterName=”EklenmeZamani”Type=”DateTime”/>

<asp:ParameterName=”FotografId”Type=”Object”/>

</UpdateParameters>

<InsertParameters>

<asp:ParameterName=”FotografId”Type=”Object”/>

<asp:ParameterName=”AlbumId”Type=”Object”/>

<asp:ParameterName=”ResimUrl”Type=”String”/>

<asp:ParameterName=”EklenmeZamani”Type=”DateTime”/>

</InsertParameters>

</asp:SqlDataSource>

</div>

</asp:Content>

Liste 1.61: Album.aspx html tasarımı.

Yapılan html tasarımı sonucu Album.aspx sayfası tasarım görünümü Şekil 1.32’de gösterilmiş-tir.

�� Proje 1

Page 93: Yazilim Proje BilgeAdam

Arkadaslarim.aspx sayfasından herhangi bir arkadaşın albüm bilgileri görüntülenmek istendiği zaman albümleri görüntüleyecek olan albumler.aspx sayfasını Kullanici klasörüne ekleyin. Bu sayfa ilk başta albümü görüntülenmek istenen kullanıcının albümleri için hangi izinleri verdiğini kontrol edecek. Albümlere bakan kişi, kullanıcının arkadaşı ise hepsi, değilse sadece izinli olan-lar görüntülenecektir. Sayfaya DataList kontrolü ekleyerek albümleri listeleyin. Hangi kullanıcının albümü olduğu bilgisi QueryString üzerinden alınacak.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”albumler.aspx.cs”Inherits=”Kullanici_albumler” Title=”Kullanıcı Albümleri” %>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<br/>

<asp:DataListID=”DataList1”runat=”server”CellPadding=”4”DataKeyField=”AlbumId”ForeColor=”#333333”RepeatColumns=”5”RepeatDirection=”Horizontal”

Width=”100%”>

<FooterStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

Şekil 1.32: Album.aspx sayfa tasarım görünümü.

��herkesburada.com

Page 94: Yazilim Proje BilgeAdam

<AlternatingItemStyleBackColor=”White”ForeColor=”#284775”/>

<ItemStyleBackColor=”#F7F6F3”ForeColor=”#333333”/>

<SelectedItemStyleBackColor=”#E2DED6”Font-Bold=”True”ForeColor=”#333333”/>

<HeaderStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

<ItemTemplate>

<imgsrc=”../SiteResimleri/ok.gif”/>

<ahref=”albumgoruntule.aspx?album=<%#Eval(“AlbumId”)%>”>

<asp:LabelID=”AlbumAdiLabel”runat=”server”Text=’<%#Eval(“AlbumAdi”)%>’></asp:Label></a><br/>

</ItemTemplate>

</asp:DataList>

</div>

</asp:Content>

Liste 1.62: Albumler.aspx html tasarımı.

Albumler.aspx sayfasının görsel çıktısı Şekil 1.33‘deki gibidir.

Albumler.aspx sayfasına gelen parametrenin doğru olup olmadığını kontrol edin. Daha sonra albümü görüntülemek için gerekli izin olup olmadığının kontrolünü yapın.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(Request.QueryString[“album”]==null)

{

Response.Redirect(“arkadaslarim.aspx”);

Şekil 1.33: Albumler.aspx sayfası tasarım görünümü.

90 Proje 1

Page 95: Yazilim Proje BilgeAdam

}

AlbumGoruntule();

}

voidAlbumGoruntule()

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlDataAdapterda=newSqlDataAdapter(“selectAlbumId,AlbumAdi,SadeceArkadaslarGorsunfromalbumlerwherekullaniciId=dbo.KullaniciIdAl(@KullaniciAdi)”,con);

da.SelectCommand.Parameters.AddWithValue(“@KullaniciAdi”,Request.QueryString[“album”]);

DataTabledt=newDataTable();

da.Fill(dt);

SqlDataAdapterdaArkadasListesi=newSqlDataAdapter(“ArkadasListem”,con);

daArkadasListesi.SelectCommand.Parameters.AddWithValue(“@UserId”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

daArkadasListesi.SelectCommand.CommandType=CommandType.StoredProcedure;

DataTabledtArkadaslar=newDataTable();

daArkadasListesi.Fill(dtArkadaslar);

boolarkadasmiyiz=false;

for(inti=0;i<dt.Rows.Count;i++)

{

if(Convert.ToBoolean(dt.Rows[i][“SadeceArkadaslarGorsun”]))

{

foreach(DataRowdr2indtArkadaslar.Rows)

{

if(dr2[“UserName”].ToString()==Request.QueryString[“album”])

{

arkadasmiyiz=true;

}

}

}

if(!arkadasmiyiz)

dt.Rows.Remove(dt.Rows[i]);

if(dt.Rows.Count==i)

break;

}

91herkesburada.com

Page 96: Yazilim Proje BilgeAdam

DataList1.DataSource=dt;

DataList1.DataBind();

}

Liste 1.63: Albumler.aspx Page_Load olayı ve AlbumGoruntule metodu.

Uygulama: Seçilen albüme ait resimleri gösteren albumgoruntule.aspx sayfasını yapın. Gerekli izinleri kontrol edin.

Kullanıcılara gösterilen KullaniciSolMenu.ascx User Control’ü açın. Kullanıcı aramak için btnAra button kontrolünün Click olayını hazırlayın. Arama kriterini uyeara.aspx sayfasına yönlendirin.

protectedvoidbtnAra_Click(objectsender,EventArgse)

{

Response.Redirect(“uyeara.aspx?ara=”+txtRumuz.Text);

}

Üye arama sonuçlarını listeleyecek olan uyeara.aspx sayfasını Kullanici klasörüne ekleyin. Kul-lanıcı listesini gösterecek olan datalist kontrolünü ekleyin ve bu kontrol ile kullanıcıya arkadaşlık teklif edebilmeyi ve mesaj göndermeyi sağlayın.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”uyeara.aspx.cs”Inherits=”Kullanici_uyeara”Title=”UntitledPage”%>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

&nbsp;<br/>

&nbsp;<asp:LabelID=”lblSonuc”runat=”server”ForeColor=”Red”Text=”Aradığınız kritere ait kullanıcı bulunamadı”

Visible=”False”></asp:Label><br/>

<br/>

<asp:DataListID=”dtSonuclar”runat=”server”CellPadding=”4”

ForeColor=”#333333”OnItemCommand=”dtSonuclar_ItemCommand”Width=”632px”>

<FooterStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

<SelectedItemStyleBackColor=”#E2DED6”Font-Bold=”True”ForeColor=”#333333”/>

<ItemTemplate>

<tablestyle=”width:100%”>

92 Proje 1

Page 97: Yazilim Proje BilgeAdam

<tr>

<tdrowspan=”2”style=”width:100px”>

<imgalt=’<%#Eval(“UserName”).ToString()%>resmi’src=’<%#ResimAdres(DataBinder.Eval(Container.DataItem,“UserName”).ToString())%>’/>

</td>

<tdstyle=”width:100px”>

</td>

<tdrowspan=”3”style=”width:100px”valign=”top”>

<asp:LinkButtonID=”LinkButton3”runat=”server”CommandArgument=’<%#Eval(“UserName”)%>’

CommandName=”MesajGonder”ForeColor=”Blue”>MesajGönder</asp:LinkButton><br/>

<asp:LinkButtonID=”LinkButton4”runat=”server”CommandArgument=’<%#Eval(“UserName”)%>’

CommandName=”Teklif”ForeColor=”Blue”>Arkadaşlık Teklif Et</asp:LinkButton></td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

&nbsp;<asp:LabelID=”UserNameLabel”runat=”server”Text=’<%#Eval(“UserName”)%>’></asp:Label></td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

<br/>

<br/>

</ItemTemplate>

<AlternatingItemStyleBackColor=”White”ForeColor=”#284775”/>

<ItemStyleBackColor=”#F7F6F3”ForeColor=”#333333”/>

<HeaderStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

</asp:DataList><br/>

</div>

</asp:Content>

Liste 1.64: uyeara.aspx sayfası html tasarımı.

Uyeara.aspx sayfası tasarım görünümü Şekil 1.34‘de gösterilmiştir.

93herkesburada.com

Page 98: Yazilim Proje BilgeAdam

Kullanıcıları arama işlemini Membership sınıfı üzerinden yapın çünkü hızlı arama işlemi yapılır-ken ihtiyaç duyulan sadece kullanıcı adıdır. Kullanıcı listeleyecek olan datalist kontrolünün Item-Command olayında ise mesaj göndermeyi ve arkadaşlık teklif etmeyi sağlayın.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(Request.QueryString[“ara”]!=null)

{

if(!Page.IsPostBack)

{

VerileriListele(Request.QueryString[“ara”]);

}

}

}

voidVerileriListele(stringkriter)

{

MembershipUserCollectionkullanicilar=Membership.GetAllUsers();

ArrayListsonuc=newArrayList();

foreach(MembershipUserkullaniciinkullanicilar)

{

if(kullanici.UserName.StartsWith(kriter)||kullanici.UserName.EndsWith(kriter))

{

sonuc.Add(kullanici);

Şekil 1.34: Uyeara.aspx sayfası tasarım görünümü.

�� Proje 1

Page 99: Yazilim Proje BilgeAdam

}

}

dtSonuclar.DataSource=sonuc;

dtSonuclar.DataBind();

if(sonuc.Count==0)

lblSonuc.Visible=true;

else

lblSonuc.Visible=false;

}

// Arkadaş listesinde kullanıcının resmini döndürür.

protectedstringResimAdres(stringusername)

{

stringresimAdres=Profile.GetProfile(username).ProfilResmi;

return@”../UyeResimleri/”+resimAdres;

}

protectedvoiddtSonuclar_ItemCommand(objectsource,DataListCommandEventArgse)

{

if(e.CommandName==“MesajGonder”)

{

Session[“cevap”]=“”+“|”+e.CommandArgument.ToString();

Response.Redirect(“~/kullanici/cevapla.aspx”);

}

else

{

// Arkadaşlık teklif et.

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);

SqlCommandcmd=newSqlCommand(“insertintoArkadasListesi(Kim,Kimin,OnaylandiMi,TeklifTarihi)Values(dbo.KullaniciIdAl(@Kim),@Kimin,@OnaylandiMi,@TeklifTarihi)”,con);

cmd.Parameters.AddWithValue(“@Kim”,e.CommandArgument.ToString());

cmd.Parameters.AddWithValue(“@Kimin”,Membership.GetUser(User.Identity.Name).ProviderUserKey);

cmd.Parameters.AddWithValue(“@OnaylandiMi”,false);

cmd.Parameters.AddWithValue(“@TeklifTarihi”,DateTime.Now);

inti=0;

��herkesburada.com

Page 100: Yazilim Proje BilgeAdam

try

{

con.Open();

i=cmd.ExecuteNonQuery();

}

catch(Exception)

{

lblSonuc.Text = “Bu kişiye daha önceden teklifte bulunulmuş...”;

}

finally

{

con.Close();

}

}

}

Liste 1.65: Uyeara.aspx metodları.

Detaylı arama yapabilmek için Kullanici klasörüne detayliarama.aspx isimli bir sayfa ekleyin. Bu sayfada çeşitli kriterlere göre arama yapılacak. Detaylı arama yapmak için Liste 1.66 ‘da belirtilen tasarımı yapın.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”detayliarama.aspx.cs”Inherits=”Kullanici_detayliarama” Title=”Detaylı Arama” %>

<%@RegisterSrc=”../Controls/KullaniciSolMenu.ascx”TagName=”KullaniciSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:KullaniciSolMenuID=”KullaniciSolMenu1”runat=”server”/>

</div>

<divclass=”KullaniciIcerik”>

<fieldsetstyle=”height:auto;width:auto”>

<legend><fontstyle=”font-size:smaller”>ÜyeAra</font></legend>

<asp:TextBoxID=”txtRumuz”runat=”server”Width=”385px”ValidationGroup=”Arama”></asp:TextBox>&nbsp;<asp:RequiredFieldValidator

ID=”RequiredFieldValidator1”runat=”server”ControlToValidate=”txtRumuz” ErrorMessage=”Boş Bırakmayın” ValidationGroup=”Arama”></asp:RequiredFieldValidator><br/>

�� Proje 1

Page 101: Yazilim Proje BilgeAdam

&nbsp;<br/>

Fotoğraf &nbsp; &nbsp; &nbsp; &nbsp; :

<asp:CheckBoxID=”chcSadeceFotografli”runat=”server”Text=”Sadece Fotoğraflı” />&nbsp;<br />

AranacakAlan:

<asp:CheckBox ID=”chcAdSoyad” runat=”server” Text=”Adı ve Soyadını da ara” /><br />

Cinsiyet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:

<asp:DropDownListID=”drpCinsiyet”runat=”server”>

<asp:ListItemValue=”True”>Bay</asp:ListItem>

<asp:ListItemValue=”False”>Bayan</asp:ListItem>

</asp:DropDownList>

<br/>

Online&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:

<asp:DropDownListID=”drpDurum”runat=”server”>

<asp:ListItem Value=”false”>T&#252;m Kullanıcılar</asp:ListItem>

<asp:ListItemSelected=”True”Value=”true”>SadeceOnlineOlanlar</asp:ListItem>

</asp:DropDownList><br/>

<br/>

<asp:ButtonID=”btnAra”runat=”server”Text=”Ara”OnClick=”btnAra_Click”ValidationGroup=”Arama”/><br/></fieldset>

<asp:DataListID=”DataList1”runat=”server”CellPadding=”4”ForeColor=”#333333”OnItemCommand=”DataList1_ItemCommand”

Width=”100%”>

<FooterStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

<SelectedItemStyleBackColor=”#E2DED6”Font-Bold=”True”ForeColor=”#333333”/>

<ItemTemplate>

<tablestyle=”width:100%”>

<tr>

<tdrowspan=”2”style=”width:100px”>

<imgalt=’<%#Eval(“UserName”).ToString()%>resmi’src=’<%#ResimAdres(DataBinder.Eval(Container.DataItem,“UserName”).ToString())%>’/>

</td>

<tdstyle=”width:100px”>

</td>

<tdrowspan=”3”style=”width:100px”valign=”top”>

<asp:LinkButtonID=”LinkButton3”runat=”server”CommandArgument=’<%#Eval(“UserName”)%>’

CommandName=”MesajGonder”ForeColor=”Blue”>MesajGönder</asp:LinkButton><br/>

��herkesburada.com

Page 102: Yazilim Proje BilgeAdam

<asp:LinkButtonID=”LinkButton4”runat=”server”CommandArgument=’<%#Eval(“UserId”)%>’

CommandName=”Teklif”ForeColor=”Blue”>Arkadaşlık Teklif Et</asp:LinkButton></td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

&nbsp;<asp:LabelID=”UserNameLabel”runat=”server”Text=’<%#Eval(“UserName”)%>’></asp:Label></td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

<br/>

<br/>

</ItemTemplate>

<AlternatingItemStyleBackColor=”White”ForeColor=”#284775”/>

<ItemStyleBackColor=”#F7F6F3”ForeColor=”#333333”/>

<HeaderStyleBackColor=”#5D7B9D”Font-Bold=”True”ForeColor=”White”/>

</asp:DataList></div>

</asp:Content>

Liste 1.66: Detayliarama.aspx html tasarımı.

Yapılan html tasarımı sonrası detayliarama.aspx sayfa tasarımı Şekil 1.35‘de verilmiştir.

Uygulama: Detaylı arama yapmayı sağlayan arama işlemini yapın.

Uygulama içerisinde oluşabilecek hatalar, özelleştirilen hata sayfalarında gösterilir. Oluşan hatayı sistem yöneticisine bildirmek için uygulamaya Global Application Class dosyası yani, global.asax dosyası ekleyin. Application_Error olayında uygulama oluşan hataları mail atar. Oluşan hata ise Server.GetLastError() ile alınır. Application_Error olayını Liste 1.67‘deki şekilde özelleşti-rin.

try

{

System.Net.Mail.MailMessagemail=newSystem.Net.Mail.MailMessage();

mail.From=newSystem.Net.Mail.MailAddress(“[email protected]”);

mail.To.Add(“[email protected]”);

mail.Subject = “Site Hatası”;

mail.Priority=System.Net.Mail.MailPriority.High;

�� Proje 1

Page 103: Yazilim Proje BilgeAdam

mail.Body=“Mesaj:“+Server.GetLastError().Message+Environment.NewLine+“Trace:“+Server.GetLastError().StackTrace;

System.Net.Mail.SmtpClientclient=newSystem.Net.Mail.SmtpClient(“localhost”);

client.Send(mail);

}

catch(Exceptionex)

{

throwex;

}

Liste 1.67: Global.asax Application_Error.

Controls klasörü içerisine AdminSolMenu.ascx isminde bir User Control ekleyin. Bu menu sadece admin rolündeki kullanıcılara gösterilecek. Admin rol grubuna ait kullanıcıların düzenleyebileceği bilgiler için menüyü Liste 1.68’de gösterildiği gibi şekillendirin.

<%@ControlLanguage=”C#”AutoEventWireup=”true”CodeFile=”AdminSolMenu.ascx.cs”Inherits=”Controls_AdminSolMenu”%>

<fieldsetstyle=”width:129px;height:69px”>

<legend>ÜyeAra</legend>

<asp:TextBoxID=”txtRumuz”runat=”server”Width=”125px”></asp:TextBox><br/>

&nbsp;<asp:ButtonID=”btnAra”runat=”server”OnClick=”btnAra_Click”Text=”Ara”/></fieldset>

Şekil 1.35: Detayliarama.aspx sayfa tasarımı.

��herkesburada.com

Page 104: Yazilim Proje BilgeAdam

&nbsp;<br/>

<br/>

<asp:MenuID=”Menu1”runat=”server”BackColor=”#E3EAEB”DynamicHorizontalOffset=”2”

Font-Names=”Verdana”Font-Size=”0.8em”ForeColor=”#666666”Height=”105px”StaticSubMenuIndent=”10px”

Width=”134px”>

<StaticMenuItemStyleHorizontalPadding=”5px”VerticalPadding=”2px”/>

<DynamicHoverStyleBackColor=”#666666”ForeColor=”White”/>

<DynamicMenuStyleBackColor=”#E3EAEB”/>

<StaticSelectedStyleBackColor=”#1C5E55”/>

<DynamicSelectedStyleBackColor=”#1C5E55”/>

<DynamicMenuItemStyleHorizontalPadding=”5px”VerticalPadding=”2px”/>

<Items>

<asp:MenuItemNavigateUrl=”~/Admin/Default.aspx”Text=”AdminAnaSayfa”Value=”AdminAnaSayfa”>

</asp:MenuItem>

<asp:MenuItemText=”&#220;yeY&#246;netimi”Value=”Mesajlarım”>

<asp:MenuItemNavigateUrl=”~/Admin/uyeler.aspx”Text=”&#220;yeler”Value=”&#220;yeler”>

</asp:MenuItem>

<asp:MenuItemNavigateUrl=”~/Admin/albumler.aspx”Text=”Alb&#252;mler”Value=”Alb&#252;mler”>

</asp:MenuItem>

</asp:MenuItem>

<asp:MenuItem Text=”Tanımlamalar” Value=”Arkadaşlarım”>

<asp:MenuItem Text=”Şehirler” Value=”Şehirler” NavigateUrl=”~/Admin/sehirler.aspx”></asp:MenuItem>

<asp:MenuItemNavigateUrl=”~/Admin/takimlar.aspx”Text=”Takımlar” Value=”Takımlar”></asp:MenuItem>

<asp:MenuItemText=”Meslekler”Value=”Meslekler”NavigateUrl=”~/Admin/meslekler.aspx”></asp:MenuItem>

<asp:MenuItem Text=”Eğitim Durumları” Value=”Eğitim Durumları” NavigateUrl=”~/Admin/egitimler.aspx”></asp:MenuItem>

</asp:MenuItem>

</Items>

<StaticHoverStyleBackColor=”#666666”ForeColor=”White”/>

</asp:Menu>

<br/>

Liste 1.68: AdminSolMenu.ascx html tasarımı.

Aynen KullaniciSolMenu.ascx User Control’üne benzeyen bu menu sayfasının tasarım görünümü Şekil 1.36’te gösterilmiştir.

100 Proje 1

Page 105: Yazilim Proje BilgeAdam

Uygulama içerisine Admin klasörü ekleyin. Bu klasör içerisine takimlar.aspx sayfası ekleyin. Admin klasörüne sadece admin rol grubuna ait olan kullanı-cılar erişecek ve buradaki sayfalar sayesinde site yönetimi yapılacak. Ekle-nen takimlar.aspx sayfasında GridView kontrolü sayesinde verileri listeleyin, DetailsView kontrolü sayesinde yeni kayıt ekleyin ve güncelleyin.

Takimlar.aspx sayfası html tasarımı Liste 1.69’da gösterilmiştir.

<%@PageLanguage=”C#”MasterPageFile=”~/herkesburada.master”AutoEventWireup=”true”CodeFile=”takimlar.aspx.cs”Inherits=”Admin_takimlar”Title=”UntitledPage”%>

<%@RegisterSrc=”../Controls/AdminSolMenu.ascx”TagName=”AdminSolMenu”TagPrefix=”uc1”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”AnaIcerik”Runat=”Server”>

<divclass=”SolMenu”>

<uc1:AdminSolMenuid=”AdminSolMenu1”runat=”server”>

</uc1:AdminSolMenu></div>

<divclass=”KullaniciIcerik”>

<asp:UpdatePanelID=”UpdatePanel1”runat=”server”>

<ContentTemplate>

<asp:GridViewID=”GridView1”runat=”server”AllowPaging=”True”AllowSorting=”True”

AutoGenerateColumns=”False”BackColor=”White”BorderColor=”#DEDFDE”BorderStyle=”None”

BorderWidth=”1px”CellPadding=”4”DataKeyNames=”TakimId”DataSourceID=”SqlDataSource1”

ForeColor=”Black”GridLines=”Vertical”Width=”512px”>

<FooterStyleBackColor=”#CCCC99”/>

<Columns>

<asp:BoundFieldDataField=”TakimAdi”HeaderText=”TakimAdi”SortExpression=”TakimAdi”/>

<asp:CommandField CancelText=”İptal” DeleteText=”Sil”EditText=”D&#252;zenle”InsertText=”Ekle”

SelectText=”Se&#231;”ShowDeleteButton=”True”ShowEditButton=”True”UpdateText=”G&#252;ncelle”/>

</Columns>

<RowStyleBackColor=”#F7F7DE”/>

<SelectedRowStyleBackColor=”#CE5D5A”Font-Bold=”True”ForeColor=”White”/>

<PagerStyleBackColor=”#F7F7DE”ForeColor=”Black”HorizontalAlign=”Right”/>

<HeaderStyleBackColor=”#6B696B”Font-Bold=”True”ForeColor=”White”/>

Şekil 1.36: AdminSol-Menu.ascx tasarım gö-rünümü.

101herkesburada.com

Page 106: Yazilim Proje BilgeAdam

<AlternatingRowStyleBackColor=”White”/>

</asp:GridView>

<asp:LinkButtonID=”LinkButton1”runat=”server”OnClick=”LinkButton1_Click”ForeColor=”Blue”>Yeni</asp:LinkButton><br/>

</ContentTemplate>

</asp:UpdatePanel>

<asp:UpdatePanelID=”UpdatePanel2”runat=”server”>

<ContentTemplate>

<asp:DetailsViewID=”DetailsView1”runat=”server”AutoGenerateRows=”False”CellPadding=”4”

DataKeyNames=”TakimId”DataSourceID=”SqlDataSource1”ForeColor=”#333333”GridLines=”None”

Height=”49px”Width=”297px”OnItemCommand=”DetailsView1_ItemCommand”OnItemInserted=”DetailsView1_ItemInserted”>

<FooterStyleBackColor=”#507CD1”Font-Bold=”True”ForeColor=”White”/>

<CommandRowStyleBackColor=”#D1DDF1”Font-Bold=”True”/>

<EditRowStyleBackColor=”#2461BF”/>

<RowStyleBackColor=”#EFF3FB”/>

<PagerStyleBackColor=”#2461BF”ForeColor=”White”HorizontalAlign=”Center”/>

<Fields>

<asp:BoundFieldDataField=”TakimAdi”HeaderText=”Takım Adı” SortExpression=”TakimAdi” />

<asp:CommandFieldShowInsertButton=”True”CancelText=”İptal” InsertText=”Ekle” />

</Fields>

<FieldHeaderStyleBackColor=”#DEE8F5”Font-Bold=”True”/>

<HeaderStyleBackColor=”#507CD1”Font-Bold=”True”ForeColor=”White”/>

<AlternatingRowStyleBackColor=”White”/>

</asp:DetailsView>

</ContentTemplate>

</asp:UpdatePanel>

<br/>

<asp:SqlDataSourceID=”SqlDataSource1”runat=”server”ConflictDetection=”CompareAllValues”

ConnectionString=”<%$ConnectionStrings:ConStrHerkesBurada%>”DeleteCommand=”DELETEFROM[Takimlar]WHERE[TakimId]=@original_TakimIdAND[TakimAdi]=@original_TakimAdi”

InsertCommand=”INSERTINTO[Takimlar]([TakimAdi])VALUES(@TakimAdi)”OldValuesParameterFormatString=”original_{0}”

SelectCommand=”SELECT[TakimId],[TakimAdi]FROM[Takimlar]”UpdateCommand=”UPDATE[Takimlar]SET[TakimAdi]=@

102 Proje 1

Page 107: Yazilim Proje BilgeAdam

TakimAdiWHERE[TakimId]=@original_TakimIdAND[TakimAdi]=@original_TakimAdi”>

<DeleteParameters>

<asp:ParameterName=”original_TakimId”Type=”Int32”/>

<asp:ParameterName=”original_TakimAdi”Type=”String”/>

</DeleteParameters>

<UpdateParameters>

<asp:ParameterName=”TakimAdi”Type=”String”/>

<asp:ParameterName=”original_TakimId”Type=”Int32”/>

<asp:ParameterName=”original_TakimAdi”Type=”String”/>

</UpdateParameters>

<InsertParameters>

<asp:ParameterName=”TakimAdi”Type=”String”/>

</InsertParameters>

</asp:SqlDataSource>

</div>

</asp:Content>

Liste 1.69: Admin\Takimlar.aspx sayfası html tasarımı.

Html tasarımı yapılan takimlar.aspx sayfasının tasarım görünümü Şekil 1.37’da gösterilmiştir.

Uygulama: Takimlar.aspx sayfası haricindeki diğer yönetim sayfalarını yapın.

Şekil 1.37: Admin\Takimlar.aspx sayfa tasarım görünümü.

103herkesburada.com

Page 108: Yazilim Proje BilgeAdam
Page 109: Yazilim Proje BilgeAdam

2 Proje 2: Otobüs Otomasyonu

Page 110: Yazilim Proje BilgeAdam

2 Proje 2: Otobüs

OtomasyonuGenel Bakış

Görüşmeler

Uygulama Tasarımı

Page 111: Yazilim Proje BilgeAdam

Proje 2: Otobüs Otomasyonu Genel BakışHızlı Tur A.Ş Türkiye’nin dört bir yanına otobüs seferleri düzenleyen bir otobüs firmasıdır. Yakla-şık olarak bir ay öncesine kadar sadece iki şehre sefer düzenleyen Hızlı Tur, artık ülkenin dört bir yanına seferler düzenlemeye başladı. Şimdiye kadar kesilen biletlerin hepsi bilgisayar ortamı olmadan elle kesildiği için takibinde zorluklar yaşanıyor, müşteri kaydının tutulmaması yüzün-den müşteri profili bilinmiyor ve herhangi özel bir promosyon yapılamıyor, personel takibinde ve otobüs seferlerinde de karışıklıklar oluşuyor. Bu sorunları çözmek için yeni bir yönetim sistemi yazılımı yaptırılmak isteniyor.

GörüşmelerÖzgür Kolukısa (Genel Müdür)Bugüne kadar sadece iki şehre sefer düzenlediğimiz için elle bilet kesmek bize yetiyordu fakat yaptığımız yatırımlar sonucu artık her şehre sefer düzenliyoruz. Mevcut sistem ile bu işin altın-dan kalkma imkanımız yok ve yeni bir uygulama yazdırmak istiyoruz. Benim özellikle istediğim, herhangi tarih aralığında hangi şehirden hangi şehre kaç yolcu gittiğini görmektir. Uygulama içe-risinde iki adet yetki olacak. Bunlardan biri yönetici için diğeri ise bilet kesecek olan banko çalı-şanı için. Yöneticilerin hepsi aynı yetkide olacak, bankoda çalışacak personelin ise yetkileri aynı olacak.Bu ayrım sonucu bankoda görevli personel, yani yönetici rolüne sahip olmayan personel bilet işlemleri ve müşteri işlemleri yapabilecek, diğer işlemleri yapamayacak ve o işlemlere ait menüleri göremeyecek.

Selçuk Huysuz (Müşteri Hizmetleri Müdürü)Yapılacak temel seferleri, ekstra bir durum ortaya çıkmadığı sürece 1 aylık olarak planlıyoruz. Müşterilerimiz bu 1 aylık süre içinde herhangi bir tarih için bilet rezervasyonu yaptırabilmeli veya istediği tarihe bilet alışı yapabilmeli. Rezervasyon işlemi için eğer rezerve edilmiş bilet otobüs kalkış zamanından 10 dakika öncesine kadar alınmamışsa rezervasyon otomatik olarak iptal edi-lecek. Mümkün olan her müşterimizin kaydını tutmak istiyoruz. Eğer daha önceden bizde kaydı yoksa kaydı alınmalı fakat bu kural bilet satış veya rezervasyon işlemleri için zorunlu olmamalı. Telefon açıp bilet alacak müşteri için de müşteri kartı açmak zor olduğundan direk ad ve soyad ile işlem yapabilmeliyiz ama eğer imkan varsa müşteri kartı oluşturmak istiyoruz. Sistem tarafından otomatik olarak verilecek olan kart numarası sayesinde daha sonradan barkod okuyucu kullana-rak direk o müşteriye bilet satışı veya rezervasyon yapabilmeliyiz. Kartın asıl amacı ise belirli bir sayıda bilet alan müşterilerimize bilet hediye etmektir. Örneğin her 10 bilette 1 bilet bedava gibi ama bu kriter sabit değil ileride belki 7 bilette 1 bilet hediye edebiliriz. Aldığı her bilet ücretinin belli bir oranını müşterinin kartına geri yükleyeceğiz.Yeterli kredisi olduğu zaman bunu kullanabilecek ama bir şartımız var. Örneğin 40 YTL kredisi var alacağı bilet 65 YTL. Eğer mevcut kredisi alaca-ğı biletten az ise kredi kullanımı yapamayacak.Müşterimizin bu hediye puanı kullandıktan sonra bu puanı ne zaman kullanmış bilgisi işimize yaramıyor görmesek de olur sadece bilet satışında bildirilsin yeter. Detaylı yolcu profilimizi görebilmek açısından yolcularımızın yaşı, cinsiyeti vb. gibi bilgileri de görmek istiyorum.

Baki Çokbilmiş (Personel Sorumlusu)Bir bilet satışı veya rezervasyonu yapılırken hangi şehirdeki hangi şubeden işlemin gerçekleştiril-diğini ve hangi personelin bu işlemi gerçekleştirdiğini görebilmeliyim. Her personele bir kullanıcı adı ve şifre vermeliyim. Personelin işe başlama veya vardiya devralma zamanını takip etme zor-luğu yaşadığımız için programda kullanıcı adı ve şifresini girip oturum açtığı saatleri de görmek istiyorum. Bu sayede hangi personelin hangi şubede hangi saatler arasında çalıştığını bileceğim. Personel takibinin yanı sıra sefer işlemleri de bana bağlı.İstediğim tarihte istediğim seferi tanım-layıp, istediğim otobüsü ve şoförü görevlendirme imkanım olmalı.

Page 112: Yazilim Proje BilgeAdam

Vildan Parasever (Muhasebe Sorumlusu)Müşterilerin aldığı biletlerin günlük, aylık raporlarını ve otobüslerin seferlerde yaptığı harcama tu-tarlarını görebilmeliyim. Şu an için otoban masrafları, terminal giriş çıkış masrafları, yemek ücret-leri ve trafik cezası kalemlerini masraf olarak kabul ediyoruz ama ileride yeni harcama kalemleri ekleme imkanı da olmalı.

Uygulama AnaliziHızlı Tur A.Ş’nin isteklerine yönelik bir analiz yapılacak olursa;

Farklı şubelerde çalışan personelin ne zaman hangi işlemi yaptığının kaydı tutulacak.

Bilet satışı esnasında eğer müşteriye bilet satışı yapılıyorsa müşteri kartına kredi yüklenecek. Müşterimiz değilse normal satış yapılacak.

Bilet satışı esnasında müşterimizin yeterli kredisi varsa krediden düşülecek ve bileti ücretsiz almış olacak.

Otobüs kayıtları, otobüste çalışan personel kaydı ve sefer esnasındaki harcama bilgileri kayıt altına alınacak.

Aylık olarak istenen şehre istenen sefer tanımlaması yapılabilecek.

Uygulama yetki baz alınarak çalışacak ve yetkilere göre kullanan kişiye bazı menüler göste-rilmeyecek.Yetki ise 2 türlü olacak.

Şube, Sefer, Otobüs ve Personel tanımlamaları yapılabilecek.

Uygulama TasarımıVeritabanı Tasarımı

Veritabanı sunucunuza bağlanıp HizliTur isminde veritabanı oluşturun.

Veritabanında kullanılacak olan tablolar, veri tipleri ve ek özellikleri Şekil 2.1 ile Şekil 2.15 arasında gösterilmekte.

IslemZamani sütunu için default tanımlayın ve GetDate() olarak verin.

Şekil 2.2: PersonelGirisCikis tablosu.Şekil 2.1: OtobusMasraflari tablosu.

Şekil 2.3: Default tanımlaması.

108 Proje 2

Page 113: Yazilim Proje BilgeAdam

Biletler tablosundaki YolcuId işlemi yaptıran kişinin kayıtlı olup olmadığını belirtiyor. Eğer YolcuId mevcut ise o yolcuya belirtilen oranda puan hediye edilecek.

Biletler tablosundaki SatisTip sütunu yapılan satışın müşterideki kredi kullanılarak mı yapıldığını belirtiyor. False normal satış, true kredili satış anlamına gelmektedir.

Şekil 2.4: Seferler tablosu. Şekil 2.5: Sehirler tablosu.

Şekil 2.6: Subeler tablosu. Şekil 2.7: Ayarlar tablosu.

Şekil 2.8: Biletler tablosu. Şekil 2 9: Calisanlar tablosu.

Şekil 2.10: CalisanTipleri tablosu. Şekil 2.11: Hatalar tablosu.

Şekil 2.12: Markalar tablosu. Şekil 2.13: MasrafTipleri tablosu.

Şekil 2.14: Musteriler tablosu.

109Otobüs Otomasyonu

Page 114: Yazilim Proje BilgeAdam

Müşteriler tablosundaki KartDurumu sütunu müşteri-ye kartın teslim edilip edilmediğinin bilgisini tutacak. Müşteriler tablosundaki MevcutPara sütunu müşteri-nin hediye para durumunu tutacak.

Uygulamanın bazı ayarları veritabanı üzerinde tutulmak zorundadır. Bunun sebebi ise client makine denen şu-belerdeki uygulamalar işlem yaparken sunucu üzerinden bilgileri alıp o bilgilere göre işlem yapmalıdır. Bu yüzden çözüm olarak veritabanı üzerinde ayarlar tablosu tutul-muş ve bu ayarlar tablosuna sabit değerler girilmiştir. Bu şekilde farklı şubelerdeki uygulamaların da belirli ayarla-ra göre çalışması sağlanmıştır.

Ayarlar tablonuza müşteri satışları için bir bilete ne kadar puan aktarımı yapacağımızı belirleyen anahtarı tanımlayın. Tanımla-maktan kasıt yeni bir kayıt girin.

Insert into ayarlar values(‘BiletGeriOdemeOrani’,’0,1’)

Artık BiletGeriOdemeOrani anahtarı veritabanı üzerinde tanımla-nan bir ayar olmuştur.

Bu anahtar sayesinde program ilk çalıştığında her 10 bilete 1 bilet hediye edilecek şekilde yapılandırıldı. Bilet satışı esnasında ça-lışacak olan trigger buradaki oranı okuyup müşterinin hesabına okunan orana göre puan aktarımı yapacak.

14 tablodan oluşan veritabanını tasarladıktan sonra veritabanı-tablo çıktısı Şekil 2. 16’da gösterilmektedir.

Veritabanı tablo tasarımı yapıldıktan sonra HizliTur veritabanına yeni bir veritabanı diyagramı ekleyin. Tablolarınızı diagrama ekleyin.

Oluşturulan diagram üzerinde Tablo 2.1’deki ilişkileri yapılandırın.

Şekil 2.15: Otobusler tablosu.

Tüm tablolardaki primary key sutunlarınının identity specification‘ı Yes yapılmalı ve identitty increment ve seed 1 olarak belirtilmelidir.

Şekil 2.16: Veritabanı tablo yapısı.

Tabloların hepsini aynı anda diyagrama ekleyip ça-lışmak karışık gelebilir. Çalışılacak tabloları tek tek eklemek diagramda çalışmayı kolaylaştıracaktır.

Tablo 2.1: Veritabanı İlişkileriKaynak Tablo Kaynak Sütun Hedef Tablo Hedef Sütun

Markalar MarkaId Otobusler MarkaIdOtobusler OtobusId OtobusMasraflari OtobusId

MasrafTipleri MasrafTipId OtobusMasraflari MasrafTipId

Seferler SeferId OtobusMasraflari SeferId

Sehirler SehirId Seferler KalkisSehirId

Sehirler SehirId Seferler VarisSehirId

Otobusler OtobusId Seferler OtobusId

Calisanlar PersonelId Seferler SoforId

Calisanlar PersonelId Seferler MuavinId

Subeler SubeId Calisanlar SubeId

Sehirler SehirId Subeler SehirId

Sehirler SehirId Musteriler SehirId

Calisanlar PersonelId PersonelGirisCikis PersonelId

Musteriler MusteriId Biletler YolcuId *Calisanlar PersonelId Biletler IslemiYapanPersonelId

Seferler SeferId Biletler SeferIdCalisanTipleri CalisanTipId Calisanlar CalisanTipId

110 Proje 2

Page 115: Yazilim Proje BilgeAdam

* Bu ilişkiyi kurarken Enforce Foreign Key Constraint özel-liğini False yapın. Bileti alan kişi eğer müşteri ise MusteriId kaydı girilecek, ama müşteriye satış yapılmıyorsa boş geçi-lebilecek ve bilgi tutarlılığı zorlanmayacak.

Veritabanı diagramı Şekil 2.17’de verilmiştir.

HizliTur veritabanı üzerinde sağ tıklayın ve New Query menüsüne tıklayın.

Proje altyapısında kullanılacak olan standart işlemler için stored procedure (saklı yordam) oluşturun. Liste 2.1 ile Liste 2.5 arasında Subeler tablosu örnek alınarak gerekli stored procedure’ler oluşturulmuştur. Diğer tablolar için de aynı yapıda ekleme, silme, güncelleme, tüm kayıtları listeleme ve bir kaydın detayını görüntüleme stored procedure’leri oluşturun. Bu işlem sonucu 70 adet stored procedure olacak.

CREATEPROCSubeEkle

(

@SubeAdinvarchar(50),

@SehirIdint

)

AS

INSERTINTOSubeler(SubeAdi,SehirId)VALUES(@SubeAdi,@SehirId)

Liste 2.1: SubeEkle stored procedure.

CREATEPROCSubeGuncelle

(

@SubeIdint,

@SubeAdinvarchar(50),

@SehirIdint

)

AS

Veritabanınız üzerindeki ilişkileri gör-mek için select * from sys.objects whe-re type=’F’ sorgusunu yürütebilirsiniz.

Şekil 2.17: HizliTur veritabanı diagramı.

111Otobüs Otomasyonu

Page 116: Yazilim Proje BilgeAdam

UPDATESubelerSETSubeAdi=@SubeAdi,SehirId=@SehirIdWHERESubeId=@SubeId

Liste 2.2: SubeGuncelle stored procedure.

CREATEPROCSubeSil

(

@SubeIdint

)

AS

DELETEFROMSubelerWhereSubeId=@SubeId

Liste 2.3: SubeSil stored procedure.

CREATEPROCSubeListesi

AS

SELECTSubeId,SubeAdi,SehirIdFromSubeler

Liste 2.4: SubeListesi stored procedure.

CREATEPROCSubeDetay

(

@SubeIdint

)

As

SelectSubeId,SubeAdi,SehirIdFromSubelerWhereSubeId=@SubeId

Liste 2.5: SubeDetay stored procedure.

Hazırlanan bu 70 stored procedure yapılacak temel işlemler için oluşturulmuştur. Bunların ha-ricinde proje içerisinde farklı işlemleri yapacak stored procedure’lere ihtiyaç duyulacak ,ve bu stored procedure’ler yeri geldikçe oluşturulacaktır.

Uygulama TasarımıGünümüzde uygulama mimarisi, katmanlı yapı üzerine oluşturulur. Katmanlı yapı aynı işlemi ya-pan kodları tekrar yazma sorununu ortadan kaldırır. Sonradan yapılan bir değişikliğin, uygulama-nın tamamını direk etkilemesi sağlanır. Farklı platformlar için (web, windows) aynı kodları tekrar yazmamıza gerek kalmaz. Uygulama yönetiminin kolay yapılmasını, oluşacak bir sorun esnasın-da müdahale edilecek yere direk ulaşımı sağlar. Uygulama testlerinin daha kolay yapılabilmesini de sağlar.

Uygulama katman yapısının belirli bir standardı yoktur. Çeşitli katman yapıları kullanılır. Bun-lardan en yaygın olarak kullanılanı Entity – Facade yapısıdır. Bunun haricinde de çeşitli yapılar kullanılır ve bu yapılara Pattern denilir. Bu projede Entity – Facade yapısı kullanılacaktır. Entity katmanından kasıt veritabanı ile uygulama arasında kullanılacak olan tiplerin (type) tanımlandığı katmandır. Facade katmanı ise belirlenen bu tiplerin veritabanı ile haberleşmesini sağlayacak olan katmandır.

112 Proje 2

Page 117: Yazilim Proje BilgeAdam

Visual Studio .Net programını açın.

File > New > Project menülerini takip ederek proje oluşturma ekranını açın.

Project Types bölümünden Other Project Types menüsünü genişletin.

Visual Studio Solutions menüsünü seçin.

Solution ismi olarak HizliTurSln girin. (Şekil 2.18 – Yeni boş solution oluşturma ekranı.)

Oluşturulan solution’a yeni bir Class Library projesi ekleyip ismini HizliTur.Entity olarak belirleyin. Bu proje veritabanı işlemleri için kullanılacak olan class’ları ve property’leri barındıracak olan katmandır.

Eklenen projedeki class1 ismindeki class’ı silin. Bir solution’a ilk proje eklendiği zaman solution dosyası (*.sln uzantılı dosya) Solution Explorer penceresinde gizlenir. İkinci proje eklendiği za-man bu dosya Solution Explorer penceresinde görünür. Bu dosyanın sürekli görünmesi için Tools > Options > Projects and Solutions > Always show solution menüsü seçilmelidir.

Oluşturulan solution’a yeni bir Class Library projesi ekleyip ismini HizliTur.Facede oalark belirle-yin. Bu proje veritabanı bağlantılarında ekleme, silme vb. işlemleri yapacak olan katmandır.

Eklenen projedeki class1 ismindeki class’ı silin.

Oluşturulan solution’a yeni bir windows projesi ekleyip ismini Hiz-liTur.WinUI olarak belirleyin.

HizliTur.WinUI projeniz üzerinde sağ tıklayın, Set As Startup Pro-ject menüsüne tıklayın. Bu seçenek sayesinde uygulama derlen-diği zaman (F5 tuşuna basıldığı zaman) Startup Project olarak seçilen proje başlatılır.

Oluşturulan proje çıktısı Şekil 2.19’da gösterilmiştir.

Şekil 2.18: Yeni boş solution oluşturma ekranı.

Katmanlı bir uygulama tasarlarken namespace isimleri ProjeA-dı.Katman (HizliTur.Entity) şeklinde tanımlanırsa uygulamanın yazımı ve class’ların anlaşılırlığı daha da rahat olacaktır.

Şekil 2.19: HizliTurSln proje dos-ya yapısı.

113Otobüs Otomasyonu

Page 118: Yazilim Proje BilgeAdam

Veri Katmanı TasarımıHizliTur.Entity Class projesine veritabanındaki her tabloya karşılık gelecek bir class, bu class içerisine her sütuna karşılık gelecek property oluşturun. Class isimlerini tekil olacak şekilde verin. Örneğin veritabanında bulunan Subeler tablosu için olacak class adı Sube olmalı. Nesneye daha sonra değer atamak veya sadece istenen bir property kullanabilmek için boş bir constructor oluş-turun. Bunun haricinde tek satırda bir nesneye değer atayabilmeyi sağlamak için içindeki her pro-perty için parametre alan bir constructor oluşturun. Böylece tek bir satırda nesneye değer atanmış olacaktır ve daha az yazım olacaktır. Örneğin Sehir sehir = new Sehir(“Ankara”); gibi.

Projede kullanılacak yapıya örnek olarak Sube class’ı Liste 2.6’da verilmiştir.

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceHizliTur.Entity

{

publicclassSube

{

privateint_SubeId;

privatestring_SubeAdi;

privateint_SehirId;

publicintSubeId

{

get{return_SubeId;}

set{_SubeId=value;}

}

publicstringSubeAdi

{

get{return_SubeAdi;}

set{_SubeAdi=value;}

}

publicintSehirId

{

get{return_SehirId;}

set{_SehirId=value;}

Unutulmamalıdır ki isimlendirilen her uzun veritabanı sütun adı, property, class veya metot daha sonra yine sizin tarafınızdan yazılacak. Ne kadar uzun isimlendirme veya yanlış yapı tasarlarsanız o kadar çok kod yazar-sınız fakat kısa isimlendirme olacak diye de çok kısa yazılıp anlamsız isimlendirme tekniğine gidilmemelidir.

114 Proje 2

Page 119: Yazilim Proje BilgeAdam

}

publicSube()

{

}

publicSube(intsubeId,stringsubeAdi,intsehirId)

{

this._SubeId=subeId;

this._SubeAdi=subeAdi;

this._SehirId=sehirId;

}

}

}

Liste 2.6: Örnek Sube class’ı.

HizliTur.Entity proje çıktısı Şekil 2.20’de verilmiştir.

HizliTur.Facade projesine geçin. Bu projenin üzerinde sağ tıklayın .

Add Reference menüsüne tıklayın.

Açılan pencereden Projects tab’ına geçin.

HizliTur.Entity proje çıktısını seçin ve OK butonuna tıklayın. (Şekil 2. 21)

HizliTur.Facade projenize Util isminde bir class ekleyin. Bu class sıklıkla yapılan database iş-lemlerinin tek bir noktadan yönetilmesini sağlayacak. İçerisindeki Yurut(SqlCommand cmd) olarak tanımlanan metot SqlCommand tipinden bir parametre alacak ve bu parametrede gelen komutun(SqlCommand) ExecuteNonQuery() metodunu çalıştıracak. Böylece her Exucute-NonQuery() metodunun kullanılması gereken metodda, try catch hata yakalama mekanizma-sı kullanılmayacak, tek bir yerde kullanılacak ve yönetim tek bir yerden olacak. Metodun static yapılmasının sebebi ise bu metodu kullanabilmek için bulunduğu class’ın yeni bir instance’ının

Şekil 2.20: HizliTur.Entity proje çıktısı. Şekil 2.21: Referans ekleme.

115Otobüs Otomasyonu

Page 120: Yazilim Proje BilgeAdam

oluşturulmasına gerek duyulmamasıdır. Bu sayede her Yurut() metodu çağırımında Util class tipinden yeni bir instance oluşturmaya gerek duyulmaz. Util class içeriği Liste 2.7’de verilmiştir.

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data.SqlClient;

namespaceHizliTur.Facade

{

publicclassUtil

{

// Projenin genelinde kullanilacak olan bağlantı tanimlamasi.

publicstaticstringConnectionString=“server=.;database=HizliTur;IntegratedSecurity=SSPI;pooling=true;MinPoolSize=100;MaxPoolSize=200”;

publicstaticintYurut(SqlCommandcmd)

{

intetkilenenSatirSayisi=-1;

try

{

cmd.Connection.Open();

etkilenenSatirSayisi=cmd.ExecuteNonQuery();

}

catch(SqlException)

{

//throw

}

finally

{

cmd.Connection.Close();

}

returnetkilenenSatirSayisi;

}

}

}

Liste 2.7: HizliTur.Facade projesi içerisindeki Util class’ı.

etkilenenSatirSayisi isminde bir değişken tanımlanıp döndürülmesinin sebebi etkilenen satır sayısını öğrenebilmektir. Eğer işlem ekleme, silme ve güncelleme için başarılı olur ise 1 değeri dönecektir. Eğer herhangi bir satır etkilenmez ama sorgu başarılı bir şekilde yürütülürse 0 değeri dönecektir. Hata olması durumunda ise -1 değeri döndürülür. Başarılı işlem sonucu etkile-

116 Proje 2

Page 121: Yazilim Proje BilgeAdam

necek satır sayısı 0 ve daha fazla olmalı bu yüzden eğer bir hata olursa -1 döndürülür ki arayüz tarafından bu hatayı yakalayıp kullanıcıya hata ile ilgili mesaj gösterilebilsin.

Uygulama geliştirme aşamasındayken kullanılan catch scope’ları içerisinde throw kullanmak, oluşan hataların çözülmesi için çok başarılı bir yöntemdir. Fakat uygulama geliştirme aşaması tamamlanıp production denilen sürüm ortaya çıktıktan sonra bu throw’ların silinmesi gerekir ki kullanıcılara oluşan hatalar kötü bir biçimde aktarılmasın.

Yazılan binlerce kodun arasında nerede throw kullanıldığının tespiti zor olacaktır. Bunu kolay-laştırmak için her throw başına #warning önişlemci direktifi kullanılırsa derledikten sonra Error List penceresinde bu kısımlar uyarı olarak bize gösterilecek ve çok rahat bir şekilde değişiklikler yapılabilecektir. Örneğin:

catch(SqlExceptionex)

{

#warning Burayı Silmeyi Unutma!

throwex;

}

Oluşabilecek hata kayıtlarını tutmak için HizliTur.Facade projesine Hataci isminde bir class ekle-yin. Hata kayıtlarını tutmayı sağlayacak olan YeniHataKaydi(SqlException hata) meto-dunu yazın. (Liste 2.8)

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data.SqlClient;

namespaceHizliTur.Facade

{

publicclassHataci

{

publicstaticvoidYeniHataKaydi(SqlExceptionhata)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“HataKaydiEkle”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@Numara”,hata.Number);

cmd.Parameters.AddWithValue(“@Mesaj”,hata.Message);

cmd.Parameters.AddWithValue(“@Procedure”,hata.Procedure);

try

{

con.Open();

cmd.ExecuteNonQuery();

}

117Otobüs Otomasyonu

Page 122: Yazilim Proje BilgeAdam

catch(SqlExceptionex)

{

#warningSilmeyiunutma!

throwex;

}

finally

{

con.Close();

}

}

}

}

Liste 2.8: Hata kayıtlarını tutmayı sağlayan class ve metod.

HizliTur.Facade projesi içerisindeki Util class’ındaki Yurut metodu içerisindeki catch scope’unu Liste 2.9’daki şekilde değiştirin.

catch(SqlExceptionex)

{

Hataci.YeniHataKaydi(ex);

#warningSilmeyiunutma!

throw;

}

Liste 2.9: Örnek hata yakalama mekanizması.

Bir proje içerisinde kullanılan her metoda Summary bilgisinin yazılması hangi metodun hangi amaçla kullandığının not edilmesini ve projeye daha sonradan katılan programcıların çok çabuk adapte olmalarını sağlar. Bunun haricinde özellikle dokümantasyon için SandCastle, Ndoc tarzı programlar bu summary bilgilerine göre yazılan kodların dokümantasyonun çok kolay bir şekilde otomatik çıkarmaktadır. Summary kullanılmadığı taktirde uygulama dökümantasyonu tek tek elle yazılmak zorundadır. Proje dökümantasyonu için SandCastle uygulaması kullanılabilir. (www.sandcastleproject.org)

HizliTur.Facade projesine her tabloya karşılık bir class ekleyin, class’ların isimlerini tekil veri ve standart işlemler için (ekleme-silme-güncelleme-tümünü listeleme ve detay görüntüleme) stored procedure’lerini çalıştırıp gerekli sonuçları döndüren metodları yazın. Şube işlemlerini yapacak olan Sube class’ı Liste 2.10’da örnek olarak gösterilmiştir.

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data.SqlClient;

usingSystem.Collections;

namespaceHizliTur.Facade

{

118 Proje 2

Page 123: Yazilim Proje BilgeAdam

publicclassSube

{

publicstaticintEkle(Entity.Subesube)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“SubeEkle”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@SubeAdi”,sube.SubeAdi);

cmd.Parameters.AddWithValue(“@SehirId”,sube.SehirId);

returnUtil.Yurut(cmd);

}

publicstaticintGuncelle(Entity.Subesube)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“SubeGuncelle”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@SubeId”,sube.SubeId);

cmd.Parameters.AddWithValue(“@SubeAdi”,sube.SubeAdi);

cmd.Parameters.AddWithValue(“@SehirId”,sube.SehirId);

returnUtil.Yurut(cmd);

}

publicstaticintSil(Entity.Subesube)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“SubeSil”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@SubeId”,sube.SubeId);

returnUtil.Yurut(cmd);

119Otobüs Otomasyonu

Page 124: Yazilim Proje BilgeAdam

}

publicstaticArrayListSubeListesi()

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“SubeListesi”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

ArrayListsubeListesi=newArrayList();

try

{

con.Open();

SqlDataReaderrdr=cmd.ExecuteReader();

while(rdr.Read())

{

Entity.Subesube=newEntity.Sube();

sube.SubeId=Convert.ToInt32(rdr[“SubeId”]);

sube.SubeAdi=rdr[“SubeAdi”].ToString();

sube.SehirId=Convert.ToInt32(rdr[“SehirId”]);

subeListesi.Add(sube);

}

}

catch(SqlExceptionex)

{

Hataci.YeniHataKaydi(ex);

#warningSilmeyiunutma!

throw;

}

finally

{

con.Close();

}

returnsubeListesi;

}

publicstaticEntity.SubeDetayGoruntule(intsubeId)

{

120 Proje 2

Page 125: Yazilim Proje BilgeAdam

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“SubeDetay”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@SubeId”,subeId);

Entity.Subesube=null;

try

{

con.Open();

SqlDataReaderrdr=cmd.ExecuteReader();

sube=newHizliTur.Entity.Sube();

if(rdr.Read())

{

sube.SehirId=Convert.ToInt32(rdr[“SehirId”]);

sube.SubeAdi=rdr[“SubeAdi”].ToString();

sube.SubeId=Convert.ToInt32(rdr[“SubeId”]);

}

}

catch(SqlExceptionex)

{

Hataci.YeniHataKaydi(ex);

#warning Burayı Silmeyi Unutma !

throwex;

}

finally

{

con.Close();

}

returnsube;

}

}

}

Liste 2.10: Örnek Sube class’ı.

HizliTur.Facade projesi içerisindeki diğer class’ları da Liste 2.10’daki class’ı örnek alarak yapılan-dırın. Veritabanı tasarımı başlığı altında oluşturulan standart işlemleri yapan stored procedure’leri çalıştıran standart class’lar ve metodlar hazırlandıktan sonra, daha sonradan kullanılacak metod-lar yeri geldikçe class’lara eklenecektir.

121Otobüs Otomasyonu

Page 126: Yazilim Proje BilgeAdam

Arayüz TasarımıHizliTur.WinUI projenize geçin. References menüsü üzerinde sağ tıklayın.

Add References menüsüne tıklayın.Projects sekmesinden HizliTur.Entity ve HizliTur.Facade projelerini seçin. OK tuşuna basın. Form1 isimli formu FrmMain olarak yeniden adlandırın.

HizliTur.WinUI projesi içerisindeki Form1 içerisine static Entiy.Calisan tipinde global bir değiş-ken oluşturun. Bu değişken oturum açan kullanıcının bilgisini tutacak.

publicstaticEntity.Calisancalisan=null;

HizliTur.WinUI projenize yeni bir Windows Form ekleyin. İsmini FrmGiris olarak belirleyin. Formun Text özelliğini Kullanıcı Girişi olarak değiştirin ve Şekil 2.22’deki tasarımı yapın.

FrmGiris formu üzerindeki kontroller ve özellikleri Tablo 2.2’de verilmiştir.

Kullanıcıların giriş yapmasını sağlayan ara yüzü yaptıktan sonra veritabanı üzerinde kullanıcı kontrolü yapan CalisanGiris stored procedure’ünü oluşturun.

CREATEPROCCalisanGiris

(

@KullaniciAdinvarchar(15),

@Sifrenvarchar(20)

)

AS

SELECTPersonelId,YoneticiMi,SubeId,CalisanTipIdFROMcalisanlar

WHEREKullaniciAdi=@KullaniciAdiAndSifre=@Sifre

Liste 2.11: CalisanGiris stored procedure’ü.

Şekil 2.22: Kullanıcı giriş ekranı.

Tablo 2.2: Kullanıcı Giriş Ekranı KontrolleriKontrol Özellik Özellik Değeri

TextBox Name txtKullaniciAdiTextBox Name txtSifre

UseSystemPasswordChar True

Label Name lblKullaniciAdi

Text Kullanıcı Adı:

Label Name lblSifre

Text Şifre:

Button Name btnGirisText Giriş

122 Proje 2

Page 127: Yazilim Proje BilgeAdam

Liste 2.11’de tanımlanan stored procedure’ü çalıştıran Login() metodunu HizliTur.Facade projesi içerisindeki Calisan class’ına ekleyin.

publicstaticEntity.CalisanLogin(Entity.Calisancalisan)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“CalisanGiris”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@KullaniciAdi”,calisan.KullaniciAdi);

cmd.Parameters.AddWithValue(“@Sifre”,calisan.Sifre);

Entity.CalisandonecekCalisan=null;

try

{

con.Open();

SqlDataReaderrdr=cmd.ExecuteReader();

if(rdr.Read())

{

donecekCalisan=newHizliTur.Entity.Calisan();

donecekCalisan.PersonelId=Convert.ToInt32(rdr[“PersonelId”]);

donecekCalisan.YoneticiMi=Convert.ToBoolean(rdr[“YoneticiMi”]);

donecekCalisan.SubeId=Convert.ToInt32(rdr[“SubeId”]);

donecekCalisan.CalisanTipId=Convert.ToInt32(rdr[“CalisanTipId”]);

}

}

catch(SqlExceptionex)

{

Hataci.YeniHataKaydi(ex);

#warningSilmeyiunutma!

throw;

}

finally

{

con.Close();

}

123Otobüs Otomasyonu

Page 128: Yazilim Proje BilgeAdam

returndonecekCalisan;

}

Liste 2.12: Calisan class’ı Login metodu.

HizliTur.WinUI projesi içerisindeki FrmGiris formuna geri dönün. btnGiris button kontrolünün Click olayını hazırlayın HizliTur.Facade.Calisan.Login() metodunu çalıştırın.Çalışan-

ların giriş çıkış bilgilerinin de tu-tulması istendiği için giriş yapan kullanıcının kaydını gerekli tab-loya ekleyin.(Liste 2.13)

privatevoidbtnGiris_Click(objectsender,EventArgse)

{

Entity.Calisankullanici=newHizliTur.Entity.Calisan();

kullanici.KullaniciAdi=txtKullaniciAdi.Text;

kullanici.Sifre=txtSifre.Text;

HizliTur.Entity.CalisancalisanBilgi=HizliTur.Facade.Calisan.Login(kullanici);

if(calisanBilgi!=null)

{

//Personelinoturumacmabilgisinikaydet

Entity.PersonelGirisCikisgirisBilgileri=newHizliTur.Entity.PersonelGirisCikis();

girisBilgileri.PersonelId=calisanBilgi.PersonelId;

girisBilgileri.IslemTipi=true;

Facade.PersonelGirisCikis.PersonelGirisCikisEkle(girisBilgileri);

//Oturumacanpersonelibelirle

FrmMain.calisan=calisanBilgi;

this.DialogResult=DialogResult.OK;

}

else

MessageBox.Show(“Kullanıcı adı veya şifre hatalı”, “Hata”,MessageBoxButtons.OK,MessageBoxIcon.Error);

}

Liste 2.13: Kullanıcı giriş işlemini yapan btnGiris button kontrol kodu.

FrmMain isimli forma geçin. Tablo 2.3’de belirtilen özellikleri ayarlayın.

PersonelGirisCikis tablosunda IslemZamani sütununda default değer tanımlan-dığı için yazılan stored procedure (PersonelGirisCikisEkle) ve gerekli metod içe-risinden (Facade.PersonelGirisCikisEkle) IslemZamani parametrelerini kaldırın.

124 Proje 2

Page 129: Yazilim Proje BilgeAdam

FrmMain isimli forma geçin. FrmMain _Load olayında FrmGiris formunu ShowDialog() metodu ile açın. Böylece kullanıcı girişi yapılmaz ise uygulama çalışmayacaktır (Liste 2. 14).

privatevoidFrmMain_Load(objectsender,EventArgse)

{

this.Hide();

FrmGirisfrm=newFrmGiris();

if(frm.ShowDialog()==DialogResult.OK)

{

this.Show();

}

else

Application.Exit();

}

Liste 2.14: FrmMain Load olayı.

Artık uygulamaya girişler sadece kullanıcı adı ve şifresi belirtilerek yapılabiliyor. Test etmek amaçlı veritabanında örnek bir kullanıcı tanımlayın. Örnek bir çalışan tanımlamayabilmek için önce veri-tabanı üzerindeki ilişkilerden dolayı sırasıyla Sehir, Sube ve CalisanTip tablolarına veri girin daha sonra çalışanları tanımlayın.

FrmMain formuna menu strip ekleyin.Name özelliğini anaMenu olarak değiştirin.Tablo 2.4’de ve-rildiği gibi menüleri ekleyin.

Programı kullanan personelin en fazla yapacağı işlem bilet satışı olacağı için Bilet Satış menü-süne kısayol tuşu olarak F2 tuşunu seçin. (Bilet Satiş menüsüne sağ tıklayarak özellikler pence-resine geçin ve ShortCutKeys özelliğini F2 olarak değiştirin.) Menülerin eklendikten sonraki form görüntüsü Şekil 2.23’de görülmektedir.

Tablo 2.3: FrmMain Formu ÖzellikleriÖzellik Özellik Değeri

Text Hızlı Tur Otobüs OtomasyonuIsMdiContainer True

StartPosition CenterScreenWindowState Maximized

Tablo 2.4: FrmMain Üzerindeki MenülerMenu Elemanı Text Name

İşlemler İşlemler islemlerMenusuBilet Satış biletSatis

Yönetimsel Araçlar Yönetimsel Araçlar yonetimselAraclar

Sefer İşlemleri seferIslemleri

Şube İşlemleri subeIslemleri

Personel İşlemleri personelIslemleri

Otobüs İşlemleri otobusIslemleri

Müşteri İşlemleri musteriIslemleri

Raporlar Raporlar raporIslemleri

Tarih Bazlı tarihBazliSefer Bazlı seferBazli

125Otobüs Otomasyonu

Page 130: Yazilim Proje BilgeAdam

Açılan uygulama yetki bazlı yapılmakta, yani oturum açan kullanıcının yetkisine göre yönetimsel araçlar menüsü içerisinde bazı menü elemanları gösterilmeyecektir. Yetkiye göre menü gizlemesi için FrmMain içerisine YetkiyeGoreMenuGoster() metodu oluşturun ve FrmMain_Load ola-yında bu metodu çağırın. FrmMain son hali Liste 2.15’de verilmiştir.

publicstaticEntity.Calisancalisan=null;

voidYetkiyeGoreMenuGoster()

{

if(!calisan.YoneticiMi)

{

seferIslemleri.Visible=false;

subeIslemleri.Visible=false;

personelIslemleri.Visible=false;

otobusIslemleri.Visible=false;

raporIslemleri.Visible=false;

}

}

privatevoidFrmMain_Load(objectsender,EventArgse)

{

this.Hide();

FrmGirisfrm=newFrmGiris();

if(frm.ShowDialog()==DialogResult.OK)

{

this.Show();

YetkiyeGoreMenuGoster();

}

else

Application.Exit();

}

Liste 2.15: FrmMain_Load olayı ve YetkiyeGoreMenuGoster metodu.

Şekil 2.23: FrmMain ekran görüntüsü.

126 Proje 2

Page 131: Yazilim Proje BilgeAdam

Uygulamada oturum açan ve kapatan kullanıcının bilgileri tutulmak istendiği için, uygulamadan çıkış yapılırken hangi kullanıcının çıkış yaptığını veritabanına kaydettirin. Bu işlem FrmMain_Clo-sing olayı içerisinde yapılacaktır. Burada calisan değişkeninin null olup olmadığı kontrol edilmiştir. Eğer kontrol edilmemiş olursa giriş ekranında direk olarak X tuşuna basılması, yani formun ka-patılması sonucu yine bu olay çalışacak ve calisan değişkeninin değeri null olduğu için uygulama hata verecektir. Hata ile karşılaşmamak için calisan değişkeninin değerini kontrol edin.

privatevoidFrmMain_FormClosing(objectsender,FormClosingEventArgse)

{

if(FrmMain.calisan!=null)

{

Entity.PersonelGirisCikiscikisBilgileri=newHizliTur.Entity.PersonelGirisCikis();

cikisBilgileri.PersonelId=FrmMain.calisan.PersonelId;

cikisBilgileri.IslemTipi=false;

Facade.PersonelGirisCikis.PersonelGirisCikisEkle(cikisBilgileri);

}

}

Liste 2.16: FrmMain formu FormClosing olayı.

Yapılan proje içerisinde kullanılacak olan form sayısı fazladır. Fazla form barındıracak uygulama-lar ile çalışırken çalışılacak olan formları klasörler içerisinde kategorileştirmek uygulama yazmayı kolaylaştıracaktır. Solution Explorer pencersinde HizliTur.WinUI projesi üzerinde sağ tıklayın Add > New Folder menüsüne tıklayın. Bu şekilde uygulama içerisine Musteri, Otobus, Personel, Ra-porlar, Sefer ve Sube klasörleri ekleyin. Uygulamanın son hali Şekil 2.24’de belirtilmiştir.

WinUI projesi içerisinde de artık kullanılacak olan formlar kategorilendirilmiştir. Bu kategoriler altında gerekli formlar oluşturulacak ve klasör isimlerinin geçtiği şekilde yapılandırma işlemleri yapılacaktır. Örneğin şube tanımlama ve düzenleme gibi şube ile ilgili tüm işlemrleri yapacak formlar Sube klasörünün içerisine eklenecek.

Uygulama içerisindeki Sube klasörüne bir adet Windows Form ekleyin.İsmini FrmSubeIslemleri verin. Şekil 2.25’de gösterildiği tasarım yapın.

Şekil 2.24: HizliTur.WinUI projesi klasör yapısı. Şekil 2.25: Örnek şube yönetim formu.

Bir klasör içerisine eklenen for-mun namespace bilgisi KlasorAdi.FormAdi şeklinde olacaktır.

127Otobüs Otomasyonu

Page 132: Yazilim Proje BilgeAdam

Form üzerindeki kontroller ve özellikleri Tablo 2.5’de gösterilmiştir.

Bir şube tanımlaması yapabilmek için şehirlere ihtiyaç duyulur. Veritabanı ilişkileri yüzünden form üzerinde mevcut şehirler de listelenmektedir. Form ilk yüklendiğinde form üzerindeki şubeleri ve şehirleri listeleyecek olan combobox kontrollerini doldurun (Liste 2. 17).

privatevoidFrmSubeIslemleri_Load(objectsender,EventArgse)

{

cmbSehirListesi.DisplayMember=“SehirAdi”;

cmbSehirListesi.ValueMember=“SehirId”;

cmbSehirListesi.DataSource=Facade.Sehir.SehirListesi();

cmbSubeListesi.DisplayMember=“SubeAdi”;

cmbSubeListesi.ValueMember=“SubeId”;

cmbSubeListesi.DataSource=Facade.Sube.SubeListesi();

}

Liste 2.17: Şube işlemlerini yapmayı sağlayan FrmSubeIslemleri form load.

Üzerinde işlem yapabilmek için global Entity.Sube tipinden bir değişken oluşturun.

Entity.Subesube;

Seçilen bir şubenin detayını getiren metodu cmbSubeListesi combobox kontrolünün SelectedIn-dexChanged olayında çağırın.

privatevoidcmbSubeListesi_SelectedIndexChanged(objectsender,EventArgse)

{

Entity.Subesube=Facade.Sube.DetayGoruntule(Convert.ToInt32(cmbSubeListesi.SelectedValue));

if(sube!=null)

Tablo 2.5: FrmSubeIslemleri Form Kontrol ListesiKontrol Özellik Değer

GroupBox Name grpSubeLabel Text Mevcut Şubeler

Combobox Name cmbSubeListesi

Button Text Yeni

Name btnYeniSube

Label Text Şube Adı :

Label Text Şehir :

TextBox Name txtSubeAdi

ComboBox Name cmbSehirListesi

Button Text Güncelle

Name btnGuncelle

Button Text Şube SilName btnSil

128 Proje 2

Page 133: Yazilim Proje BilgeAdam

{

txtSubeAdi.Text=sube.SubeAdi;

cmbSehirListesi.SelectedValue=sube.SehirId;

}

}

Liste 2.18: Şube seçme işlemi.

Şube bilgisi güncellemeyi sağlayacak btnGuncelle kontrolünün Click olayını yazın.

privatevoidbtnGuncelle_Click(objectsender,EventArgse)

{

sube.SubeAdi=txtSubeAdi.Text;

sube.SehirId=Convert.ToInt32(cmbSehirListesi.SelectedValue);

sube.SubeId=Convert.ToInt32(cmbSubeListesi.SelectedValue);

if(Facade.Sube.Guncelle(sube)>0)

{

FrmSubeIslemleri_Load(null,null);

}

else

{

MessageBox.Show(“Hata Oluştu”);

}

}

Liste 2.19: Şube güncelleme işlemi.

Şube silmeyi sağlayan kodu btnSil kontrolünün Click olayına yazın. Eğer bu şubeye bağlı perso-nel veya başka kayıtlar mevcut ise şube silinemeyecektir. Silme esnasında hata oluşursa ekran-da hata mesajı görünecektir.

privatevoidbtnSil_Click(objectsender,EventArgse)

{

if(Facade.Sube.Sil(sube)>0)

{

MessageBox.Show(“Şube Silindi”);

FrmSubeIslemleri_Load(null,null);

}

else

MessageBox.Show(“Şube Silinemedi.\rBu şubeye bağlı personel olabilir.”);

}

Liste 2.20: Şube silme işlemi.

129Otobüs Otomasyonu

Page 134: Yazilim Proje BilgeAdam

Yeni şube ekleyebilmek için WinUI projesi içerisindeki Sube klasörüne FrmYeniSube isminde bir Windows Form ekleyin.

Şekil 40’de belirtilen tasarım için Tablo 2.6’daki kontrolleri ekleyin.

Bir şube ekleyebilmek için şehirlere ihtiyaç duyulduğundan dolayı form ilk yüklendiğinde Şehir listesini combobox kontrolüne doldurun.

privatevoidFrmYeniSube_Load(objectsender,EventArgse)

{

cmbSehirListesi.DisplayMember=“SehirAdi”;

cmbSehirListesi.ValueMember=“SehirId”;

cmbSehirListesi.DataSource=Facade.Sehir.SehirListesi();

}

Liste 2.21: FrmYeniSube_Load olayı.

btnIptal butonuna tıklanıldığı zaman formu kapatacak Close() metodunu çağırın.

privatevoidbtnIptal_Click(objectsender,EventArgse)

{

this.Close();

}

btnEkle butonuna tıklanıldığı zaman yeni bir şube ekleme metodunu çağırın.

privatevoidbtnEkle_Click(objectsender,EventArgse)

{

Entity.Subesube=newHizliTur.Entity.Sube();

Şekil 2.26: Yeni şube ekleme formu.

Tablo 2.6: Yeni Şube Ekleme Formu Üzerindeki KontrollerKontrol Özellik Değer

Label Text Şube AdıLabel Text Şehir

TextBox Name txtSubeAdi

Combobox Name cmbSehirListesi

Button Name btnEkle

Text Ekle

Button Name btnIptalText İptal

130 Proje 2

Page 135: Yazilim Proje BilgeAdam

sube.SubeAdi=txtSubeAdi.Text;

sube.SehirId=Convert.ToInt32(cmbSehirListesi.SelectedValue);

if(Facade.Sube.Ekle(sube)>0)

{

MessageBox.Show(“Yeni Şube Eklendi...”);

}

else

{

MessageBox.Show(“Hata Oluştu”);

}

txtSubeAdi.Clear();

}

Liste 2.22: Yeni şube kaydetme işlemi.

FrmSubeIslemleri formuna geri dönün. btnYeniSube button kontrolünün Click olayını hazırlayın.

privatevoidbtnYeniSube_Click(objectsender,EventArgse)

{

FrmYeniSubefrm=newFrmYeniSube();

frm.Show();

}

Örnek olarak Şube yönetiminin yapıldığı bölüm yapılmıştır. Otobüs, Sefer, Personel ve Müşteri yönetiminin yapılabileceği formları gerekli klasörler içerisinde oluşturun ve yapılandırın.Yapaca-ğınız bu formlar sayesinde tanımlama, düzeltme veya silme işlemlerini yapın.

FrmMain formundaki SubeIslemleri menüsüne tıklanıldığı zaman FrmSubeIslemleri formunu aç-tırın.

privatevoidsubeIslemleri_Click(objectsender,EventArgse)

{

Sube.FrmSubeIslemlerifrm=newSube.FrmSubeIslemleri();

frm.MdiParent=this;

frm.Show();

}

HizliTur.WinUI projesine FrmBiletSatis isminde Windows Form ekleyin. FrmMain üzerindeki bilet-Satis menusunun Click olayına Liste 2.23‘deki kodu yazın.

privatevoidbiletSatis_Click(objectsender,EventArgse)

{

FrmBiletSatisfrm=newFrmBiletSatis();

frm.MdiParent=this;

frm.Show();

}

Liste 2.23: Bilet Satış Formu açma ekranı.

131Otobüs Otomasyonu

Page 136: Yazilim Proje BilgeAdam

HizliTur.WinUI projesi içerisindeki FrmBiletSatis formu tasarım ekranı Şekil 2.27’de verilmiştir.

HizliTur.WinUI projesi içerisindeki FrmBiletSatis formuna SplitContainer ekleyin ve Şekil 2.27’deki gibi 2’ye ayırın. Oluşan panel1 paneline Tablo 2.7’deki şekilde kontrolleri ekleyin ve yapılandırın.

Panel1 içerisindeki dgSonuc gridview kontrolüne Tablo 2.8’deki sütunları ekleyin.

Şekil 2.27: Bilet Satış ekranı.

Tablo 2.7: Panel 1 İçerisindeki Kontrol Listesi ve ÖzellikleriKontrol Özellik Değer

GroupBox Name solGrupDock Fill

Text Sefer Ara

Label Text Kalkış :

Label Text Varış :

Label Text Tarih :

Combobox Name cmbKalkis

DropDownStyle DropDownList

Combobox Name cmbVaris

DropDownStyle DropDownList

DateTimePicker Name dtZaman

Button Name btnAra

Text Seferleri Göster

Label Text Mevcut Seferler

DataGridView Name dgSonuc

AllowUserToAddRows False

AllowUsertoDeleteRows FalseReadOnly True

132 Proje 2

Page 137: Yazilim Proje BilgeAdam

Oluşan Panel 2’ye Tablo 2.9’daki kontrolleri ekleyin ve yapılandırın.

Tablo 2.8: dgSonuc Gridview Kontrolü Sütun ListesiSütun Özellik Değer

ClSaat DataPropertyName SaatHeaderText Saat

ClPlaka DataProperyName Plaka

Header Text Otobüs Plaka

ClBiletTutari DataPropertyName BiletTutari

HeaderText Ücret

ClSeferId DataPropertyName SeferIdClKoltukSayisi DataPropertyName KoltukSayisi

Tablo 2.9: Panel 2 İçerisindeki Kontroller ve ÖzellikleriKontrol Özellik Değer

GroupBox Name seferGrupDock Top

Text Sefer Bilgileri

Height 90

Label Name lblSeferBilgi

Text

ForeColor Red

Label Name lblPlaka

ForeColor Red

Text

GroupBox Name grpOturmaPlani

Text Oturma Planı

Dock Left

Width 268

Label Text Müşteri Bilgi

Fore Color Red

CheckBox Name chcMevcutMusteri

Text Mevcut Müşteri

Label Text Kart No

TextBox Name txtKartNo

ReadOnly True

Label Text Ad

CheckBox Name chcAyniBilgileriKullan

Text Aynı Bilgileri Kullan

TextBox Name txtAd

Label Text Soyad

TextBox Name txtSoyad

Label Text Cinsiyet

ComboBox Name cmbCinsiyet

Label Text Kredi

TextBox Name txtMevcutPara

ReadOnly True

Label Text İşlem TipiComboBox Name cmbIslemTipi

133Otobüs Otomasyonu

Page 138: Yazilim Proje BilgeAdam

HizliTur.WinUI projesi içerisindeki FrmBiletSatis formuna Tablo 2.10’daki bileşenleri ekleyin ve yapılandırın.

biletSolMenu contextmenustrip kontrolüne Tablo 2.11’deki menu elemanlarını ekleyin.

FrmBiletSatis formu üzerindeki cmbCinsiyet combobox kontrolüne Bay, Bayan olmak üzere sıray-la iki eleman ekleyin. (Kontrol üzerinde sağ tıklayın ve Edit Items menüsüne tıklayın)

cmbIslemTipi combobox kontrolüne sırayla Satış, Rezervasyon elemanlarını ekleyin. Formunun kod tarafına geçin ve gerekli değişkenleri oluşturun. Bu değişkenlere her metod içerisinden ulaşılabilinmesi için değişkenleri global olarak tanımlayın.

// hangi sefer uzerinde islem yapıldığının bilgisini tutar

intseferId=0;

//seçilenseferinbiletücretinitutar

decimalucret=0;

// işlem yapılan müşteri bilgisini tutar

Entity.Musterimusteri;

Tablo 2.9: Panel 2 İçerisindeki Kontroller ve Özellikleri (devam)Kontrol Özellik Değer

Label Text Satış TipiComboBox Name cmbSatisTipi

Label Text Koltuk

TextBox Name txtKoltukNo

Button Name btnOnayla

Text Onayla

Button Name btnIptalText İptal

Tablo 2.10: FrmBiletSatis Formu Bileşenleri ve ÖzellikleriBileşen Özellik Değer

Timer Name tmrKoltukBilgiGuncelleyiciInterval 1000

Enabled False

BackgroundWorker Name bcKoltukBilgiGuncelleContextMenuStrip Name biletSolMenu

Tablo 2.11: biletSolMenu ContextMenuStrip Kontrolü Menü ListesiMenu Name

Satış İptal satisIptalContextSatış Yap satisContext

Rezervasyon İptal rezervasyonContext

Seperator (-)Vazgeç vazgecContext

Kısayol tuşu ola-rak F7 tuşunu kullanabilirsiniz.

134 Proje 2

Page 139: Yazilim Proje BilgeAdam

// hangi koltuk üzerinde işlem yapıldığının bilgisini tutar. ContextMenu kullanırken gerekli olacak.

intuzerindeIslemYapilanKoltuk=0;

HizliTur.WinUI projesi içerisindeki FrmBiletSatis formunun load olayına Liste 2.24‘deki kodu yazın. cmbKalkis combobox kontrolü hangi şehirden yolcunun bineceğini, cmbVaris combobox kontrolü hangi şehre gidileceğini seçmeyi sağlayacak. Bu yüzden her iki kontrole de şehir listesi doldurul-muştur. Bulunan seferleri gösterecek datagridview kontrolünde gösterilmesi istenmeyen sütunlar gizlenmiştir.

privatevoidFrmBiletSatis_Load(objectsender,EventArgse)

{

cmbKalkis.DisplayMember=“SehirAdi”;

cmbKalkis.ValueMember=“SehirId”;

cmbKalkis.DataSource=Facade.Sehir.SehirListesi();

cmbVaris.DisplayMember=“SehirAdi”;

cmbVaris.ValueMember=“SehirId”;

cmbVaris.DataSource=Facade.Sehir.SehirListesi();

dgSonuc.Columns[“ClSeferId”].Visible=false;

dgSonuc.Columns[“ClKoltukSayisi”].Visible=false;

cmbIslemTipi.SelectedIndex=0;

cmbSatisTipi.SelectedIndex=0;

}

Liste 2.24 Bilet Satış Formu FormLoad olayı.

Veritabanı üzerinde sefer aramayı sağlayan MevcutSeferler stored procedure’ünü oluşturun.

CREATEPROCEDUREMevcutSeferler

(

@KalkisSehirIdint,

@VarisSehirIdint,

@Tarihdatetime

)

AS

SELECTConvert(nvarchar,DatePart(hh,KalkisZamani))+‘:’+Convert(nvarchar,DatePart(mi,KalkisZamani))asSaat,Otobusler.Plaka,

Seferler.BiletTutari,Seferler.SeferId,KoltukSayisiFROMSeferlerInnerJoinOtobuslerOnSeferler.OtobusId=Otobusler.OtobusIdWHERESeferler.KalkisSehirId=@KalkisSehirIdANDSeferler.VarisSehirId=@VarisSehirIdAND(DatePart(d,KalkisZamani)=DatePart(d,@Tarih)ANDDatePart(m,KalkisZamani)=DatePart(m,@Tarih))OrderByKalkisZamani

Liste 2.25: MevcutSeferler stored procedure’ü.

Bir datagridview kontrolüne bağlanan kaynaktaki tüm sütunları veya property’leri datagridviewkontrolünde göstermek istemiyorsanız, da-tagridview kontrolünün AutoGenerateColumns özelliğini False yapın.

135Otobüs Otomasyonu

Page 140: Yazilim Proje BilgeAdam

Oluşturulan MevcutSeferler stored procedure’ünü çalıştıran metodu HizliTur.Facade projesi içeri-sindeki Sefer class’ına ekleyin (Liste 2. 26).

publicstaticDataTableSeferListesi(intkalkisSehirId,intvarisSehirId,DateTimekalkisZamani)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“MevcutSeferler”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@KalkisSehirId”,kalkisSehirId);

cmd.Parameters.AddWithValue(“@VarisSehirId”,varisSehirId);

cmd.Parameters.AddWithValue(“@Tarih”,kalkisZamani);

SqlDataAdapterda=newSqlDataAdapter(cmd);

DataTabledt=newDataTable();

da.Fill(dt);

returndt;

}

Liste 2.26: DataTable döndüren SeferListesi metodu.

HizliTur.WinUI projesi içerisindeki FrmBiletSatis formunun da içerisindeki btnAra butonunun Click olayına Liste 2.27’de belirtilen kodu yazın. Seçilen şehirler ve o tarihteki mevcut seferler listelen-mektedir.

privatevoidbntAra_Click(objectsender,EventArgse)

{

dgSonuc.DataSource=null;

DataTabledt=Facade.Sefer.SeferListesi(Convert.ToInt32(cmbKalkis.SelectedValue),Convert.ToInt32(cmbVaris.SelectedValue),dtZaman.Value);

if(dt.Rows.Count==0)

{

MessageBox.Show(“Seçilenbilgilereaitseferbulunamadı”);

}

else

{

dgSonuc.DataSource=dt;

}

}

Liste 2.27: Arama button Click olayı.

136 Proje 2

Page 141: Yazilim Proje BilgeAdam

Listelenen seferlerden herhangi birine tıklanıldığı zaman sefer detayını ve koltuk durumlarını lis-teleyen SefereGoreKoltukNumaralari stored procedure’ünü veritabanı üzerinde oluşturun.

CREATEPROCEDURESefereGoreKoltukNumaralari

(

@SeferIdint

)

AS

SelectSeferId,KoltukNo,YolcuCinsiyet,SatisMiRezervasyonMuFromBiletlerWhereSeferId=@SeferId

Liste 2.28: SefereGoreKoltukNumaralari stored procedure’ü.

Oluşturulan stored procedure’ü çalıştıran metodu HizliTur.Facade projesi içerisindeki Sefer class’ına ekleyin.

publicstaticDataTableSefereGoreKoltukNumaralari(intseferId)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“SefereGoreKoltukNumaralari”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@SeferId”,seferId);

SqlDataAdapterda=newSqlDataAdapter(cmd);

DataTabledt=newDataTable();

da.Fill(dt);

returndt;

}

Liste 2.29: DataTable döndüren SefereGoreKoltukNumaralari metodu.

bcKoltukBilgiGuncelle backdgroundworker bileşeninin DoWork olayını Liste 2.30’daki gösterildiği gibi hazırlayın. Timer sayesinde çalıştırılan backgroundworker bileşeni her saniye seçilen sefere ait güncel koltuk bilgisini çekip rezervasyon ve satışları bay ve bayan durumuna göre renklendir-mektedir.

privatevoidbcKoltukBilgiGuncelle_DoWork(objectsender,DoWorkEventArgse)

{

foreach(ControlclingrpOturmaPlani.Controls)

{

if(clisButton)

137Otobüs Otomasyonu

Page 142: Yazilim Proje BilgeAdam

{

cl.BackColor=Color.Empty;

cl.ForeColor=Color.Black;

foreach(DataRowdrinFacade.Sefer.SefereGoreKoltukNumaralari(seferId).Rows)

{

if(cl.Text==dr[“KoltukNo”].ToString())

{

if(Convert.ToBoolean(dr[“SatisMiRezervasyonMu”]))

{

cl.ForeColor=Color.Black;

}

else

{

//Eğer false ise satış demektir.

cl.ForeColor=Color.White;

}

//YolcucinsiyetFalseBayiçinkullanıldı.

if(Convert.ToBoolean(dr[“YolcuCinsiyet”])==true)

{

cl.BackColor=Color.DarkRed;

}

else

{

cl.BackColor=Color.Blue;

}

}

}

}

}

}

Liste 2.30: bcKoltukBilgiGuncelle backgroundworker bileşenin DoWork olayı.

tmrKoltukBilgiGuncelleyici timer kontrolünün Tick olayını Liste 2.31’de gösterildiği şekilde yazın ve form üzerindeki backgroundworker bileşenini asenkron olarak çalıştırın.

138 Proje 2

Page 143: Yazilim Proje BilgeAdam

privatevoidtmrKoltukBilgiGuncelleyici_Tick(objectsender,EventArgse)

{

bcKoltukBilgiGuncelle.RunWorkerAsync();

}

Liste 2.31: Timer Tick olayı.

dgSonuc datagridview kontrolünün CellDoubleClick olayına Liste 2.32‘deki kodu yazın. Listelenen seferlerden herhangi birine tıklanıldığı zaman o sefere ait bilgiler ve otobüs planı ekrana çizilecek. Burada çizdirilmekten kasıt grpOturmaPlani groupbox kontrolüne runtime (çalışma zamanı) esna-sında button kontrolleri eklemektir.

privatevoiddgSonuc_CellDoubleClick(objectsender,DataGridViewCellEventArgse)

{

grpOturmaPlani.Controls.Clear();

lblPlaka.Text=dgSonuc.Rows[e.RowIndex].Cells[“ClPlaka”].Value.ToString();

lblSeferBilgi.Text=cmbKalkis.Text+“-“+cmbVaris.Text;

intkoltukSayisi=Convert.ToInt32(dgSonuc.Rows[e.RowIndex].Cells[“ClKoltukSayisi”].Value.ToString());

ucret=Convert.ToDecimal(dgSonuc.Rows[e.RowIndex].Cells[“ClBiletTutari”].Value.ToString());

seferId=Convert.ToInt32(dgSonuc.Rows[e.RowIndex].Cells[“ClSeferId”].Value.ToString());

intsoldan=15,yukaridan=15;

for(inti=0;i<koltukSayisi;i++)

{

Buttonkoltuk=newButton();

koltuk.Text=(i+1).ToString();

koltuk.Height=30;

koltuk.Width=30;

koltuk.FlatStyle=FlatStyle.Flat;

koltuk.Cursor=Cursors.Hand;

koltuk.Click+=newEventHandler(koltuk_Click);

if(i%4==0)

{

soldan=25;

yukaridan+=30;

}

elseif(i%2==0)

139Otobüs Otomasyonu

Page 144: Yazilim Proje BilgeAdam

{

soldan+=25;

}

koltuk.Top=yukaridan;

koltuk.Left=soldan;

koltuk.ContextMenuStrip=this.biletSolMenu;

grpOturmaPlani.Controls.Add(koltuk);

soldan+=35;

}

tmrKoltukBilgiGuncelleyici.Start();

}

Liste 2.32: dgSonuc datagridview kontrolü CellDoubleClick olayı.

Liste 2.33’deki Koltuk_Click handler’ini ekleyin. Runtime esnasında eklenen koltuklara tıklanıldığı zaman ne işlem yapılacağını belirleyin. Eğer daha önceden rezerve edilmiş bir koltuk ise veya satılmış bir koltuk ise duruma göre ContextMenuStrip menulerini gizleyin veya açın.

voidkoltuk_Click(objectsender,EventArgse)

{

// tıklanan butonu yakala

ButtontiklananKoltuk=(Button)sender;

// hangi koltuk uzerinde islem yapıldıgının bilgisini yaz.

int.TryParse(tiklananKoltuk.Text,outuzerindeIslemYapilanKoltuk);

if(tiklananKoltuk.ForeColor==Color.White)

{

// daha önceden satılmış bir koltuk

rezervasyonContext.Visible=false;

satisContext.Visible=false;

satisIptalContext.Visible=true;

tiklananKoltuk.ContextMenuStrip.Show(tiklananKoltuk,10,10);

}

elseif((tiklananKoltuk.BackColor==Color.Blue||tiklananKoltuk.BackColor==Color.DarkRed)&&tiklananKoltuk.ForeColor==Color.Black)

{

// daha önceden rezerve edilmiş bir koltuk

rezervasyonContext.Visible=true;

140 Proje 2

Page 145: Yazilim Proje BilgeAdam

satisContext.Visible=true;

satisIptalContext.Visible=false;

tiklananKoltuk.ContextMenuStrip.Show(tiklananKoltuk,10,10);

}

else

{

txtKoltukNo.Text=tiklananKoltuk.Text;

}

}

Liste 2.33: Koltuk_Click olayı.

Şimdiye kadar mevcut bir seferin koltukları ekrana getirildi ve bilgileri programı kullanan kullanı-cıya gösterildi. Bu aşamadan sonra satış işlemi yapılacak. Mevcut bir müşteriye satış yapılıyorsa gerekli kontroller aktif hale gelecek. chcMevcutMusteri checkbox kontrolünün CheckedChanged olayını Liste 2.34’deki gibi hazırlayın. Bu checkbox seçildiğinde müşteriye satış işlemi başlar. Eğer seçilmezse satış müşteriye yapılmaz, yapılan satıştan hediye puan aktarımı yapılmaz.

privatevoidchcMevcutMusteri_CheckedChanged(objectsender,EventArgse)

{

txtKartNo.ReadOnly=!chcMevcutMusteri.Checked;

txtKartNo.Focus();

}

Liste 2.34: chcMevcutMusteri CheckedChanged olayı.

Bir müşteriye satış yapılırken kart numarasına göre satış yapılacak. Kart numarasına göre müş-teri bilgileri döndüren stored procedure’ü veritabanı üzerinde oluşturun.

CREATEPROCEDUREKartNoyaGoreMusteriBilgi

(

@KartNumarasinvarchar(16)

)

AS

SelectMusteriId,Ad,Soyad,CinsiyetFromMusterilerWhereKartNumarasi=@KartNumarasi

Liste 2.35: KartNoyaGoreMusteriBilgi stored procedure’ü.

KartNoyaGoreMusteriBilgi stored procedure’ünü çalıştıran metodu HizliTur.Facade projesi içeri-sindeki Musteri class’ına ekleyin (Liste 2.36).

publicstaticEntity.MusteriKartNumarasinaGoreMusteriBilgi(stringkartNo)

{

141Otobüs Otomasyonu

Page 146: Yazilim Proje BilgeAdam

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“KartNoyaGoreMusteriBilgi”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@KartNumarasi”,kartNo);

Entity.Musteridonecek=null;

try

{

con.Open();

SqlDataReaderrdr=cmd.ExecuteReader();

if(rdr.Read())

{

donecek=newHizliTur.Entity.Musteri();

donecek.Ad=rdr[“Ad”].ToString();

donecek.Soyad=rdr[“Soyad”].ToString();

donecek.MusteriId=Convert.ToInt32(rdr[“MusteriId”]);

donecek.Cinsiyet=Convert.ToBoolean(rdr[“Cinsiyet”]);

donecek.MevcutPara=Convert.ToDecimal(rdr[“MevcutPara”]);

}

}

catch(SqlExceptionex)

{

Hataci.YeniHataKaydi(ex);

#warningSilmeyiunutma!

throw;

}

finally

{

con.Close();

}

returndonecek;

}

Liste 2.36: KartNumarasinaGoreMusteriBilgi metodu.

txtKartNo textbox kontrolünün TextChanged olayını Liste 2.37’deki gibi hazırlayın. Barkod oku-yucudan kart numarası okutulduğu an kart numarasına ait müşteri bilgileri anılır ve kime satış yapılacağı bilgisi sorgulanır.

142 Proje 2

Page 147: Yazilim Proje BilgeAdam

privatevoidtxtKartNo_TextChanged(objectsender,EventArgse)

{

musteri=Facade.Musteri.KartNumarasinaGoreMusteriBilgi(txtKartNo.Text);

if(musteri!=null)

{

if(chcAyniBilgileriKullan.Checked)

{

txtAd.Text=musteri.Ad;

txtSoyad.Text=musteri.Soyad;

cmbCinsiyet.SelectedIndex=Convert.ToInt32(musteri.Cinsiyet);

txtMevcutPara.Text=musteri.MevcutPara.ToString();

}

}

}

Liste 2.37: txtKartNo textbox kontrolünün TextChanged olayı.

chcAyniBilgileriKullan checkbox’ının CheckedChanged olayını Liste 2.38’deki gibi hazırlayın. Bu checkbox seçilmesi sonucu kart numarası girilen müşterinin adı ve soyadı otomatik olarak kesi-lecek bilete yazdırılır.

privatevoidchcAyniBilgileriKullan_CheckedChanged(objectsender,EventArgse)

{

if(chcAyniBilgileriKullan.Checked)

{

if(musteri!=null)

{

txtAd.Text=musteri.Ad;

txtSoyad.Text=musteri.Soyad;

cmbCinsiyet.SelectedIndex=Convert.ToInt32(musteri.Cinsiyet);

txtMevcutPara.Text=musteri.MevcutPara.ToString();

}

}

else

{

txtAd.Clear();

txtSoyad.Clear();

txtMevcutPara.Clear();

}

}

Liste 2.38: chcAyniBilgileriKullan checkbox kontorülün checkedChanged olayı.

143Otobüs Otomasyonu

Page 148: Yazilim Proje BilgeAdam

GirdiKontrol() isminde metod oluşturun. Bu metod bilet satışı esnasında gerekli alanların boş geçilememesini sağlar.

boolGirdiKontrol()

{

if(string.IsNullOrEmpty(txtAd.Text)||string.IsNullOrEmpty(txtSoyad.Text)||string.IsNullOrEmpty(txtKoltukNo.Text)||cmbCinsiyet.SelectedIndex<0)

returnfalse;

else

returntrue;

}

Liste 2.39: GirdiKontrol metodu.

Bilet satışı esnasında satılan biletin müşteriye satılması sonucu müşterinin hesabına para aktar-mayı sağlayan trigger’ı veritabanı üzerinde oluşturun.

CreatetriggerMusteriKrediIslemOn[Biletler]

ForInsert

as

Declare@MusteriIdint

Declare@SatisMiRezervasyonMubit

Select@MusteriId=YolcuId,@SatisMiRezervasyonMu=SatisMiRezervasyonMuFromInserted

-- yapılan işlem satıs ise ve müşteriye satılıyorsa

if(@SatisMiRezervasyonMu=‘False’and@MusteriId>0)

begin

--Guncelgeriodemeoraninial

Declare@BiletGeriOdemeOranifloat

Select@BiletGeriOdemeOrani=Convert(float,Deger)FromAyarlarWhereAnahtar=‘BiletGeriOdemeOrani’

--musteriyeaktarilacakmiktarihesapla

Declare@GeriyeAktarilacakTutarfloat

Select@GeriyeAktarilacakTutar=Ucret*@BiletGeriOdemeOraniFromBiletlerWhereSeferId=2andKoltukNo=2

--musteriyeaktarimiyap

UpdateMusterilerSetMevcutPara=MevcutPara+@GeriyeAktarilacakTutarWhereMusteriId=@MusteriId

End

Liste 2.40: MusteriKrediIslem trigger’ı.

144 Proje 2

Page 149: Yazilim Proje BilgeAdam

btnOnayla button kontrolünün Click olayını Liste 2.41’deki gibi hazırlayın ve bilet satışını tamam-layın.

privatevoidbtnOnayla_Click(objectsender,EventArgse)

{

if(GirdiKontrol())

{

Entity.Biletbilet=newHizliTur.Entity.Bilet();

bilet.KoltukNo=Convert.ToInt32(txtKoltukNo.Text);

bilet.IslemZamani=DateTime.Now;

bilet.SeferId=seferId;

bilet.IslemiYapanPersonelId=FrmMain.calisan.PersonelId;

bilet.SatisMiRezervasyonMu=Convert.ToBoolean(cmbIslemTipi.SelectedIndex);

bilet.SatisTip=Convert.ToBoolean(cmbSatisTipi.SelectedIndex);

bilet.YolcuCinsiyet=Convert.ToBoolean(cmbCinsiyet.SelectedIndex);

bilet.YolcuAd=txtAd.Text;

bilet.YolcuSoyad=txtSoyad.Text;

if(musteri!=null)

{

bilet.YolcuId=musteri.MusteriId;

}

if(cmbSatisTipi.SelectedIndex==1)

{

if(musteri!=null)

{

if(musteri.MevcutPara>=ucret)

{

bilet.Ucret=0;

musteri.MevcutPara=musteri.MevcutPara-ucret;

}

else

{

MessageBox.Show(“Müşterinin yeterli kredisiyok”);

return;

}

}

145Otobüs Otomasyonu

Page 150: Yazilim Proje BilgeAdam

else

{

MessageBox.Show(“Müşteri bilgisi yok. Kredili satış yapamazsınız”);

return;

}

}

else

{

bilet.Ucret=ucret;

}

if(Facade.Bilet.BiletEkle(bilet)>0)

{

MessageBox.Show(“İşleminiz tamamlandı”);

tmrKoltukBilgiGuncelleyici.Start();

}

}

else

{

MessageBox.Show(“EksikBilgi”);

}

}

Liste 2.41: btnOnayla button kontrolünün Click olayı.

Bilet iptali olduğu zaman kredili satışta müşterinin hesabına yatırılan hediye paranın geri iade edilmesini sağlayan trigger’i veritabanı üzerinde oluşturun.

CreateTriggerBiletIptalOnBiletler

ForDelete

As

Declare@SatisTipbit

Declare@SatisMiRezervasyonMubit

Select@SatisTip=SatisTip,@SatisMiRezervasyonMu=SatisMiRezervasyonMuFromDeleted

-- Satış tipi kredili ise

if(@SatisTip=‘True’and@SatisMiRezervasyonMu=‘False’)

begin

-- Müşteri ve sefer bilgisi al

Declare@MusteriIdint

Declare@SeferIdint

Select@MusteriId=YolcuId,@SeferId=SeferIdFromDeleted

--Seferinfiyatbilgisinial

146 Proje 2

Page 151: Yazilim Proje BilgeAdam

Declare@BiletFiyatmoney

Select@BiletFiyat=BiletTutariFromSeferlerWhereSeferId=@SeferId

-- Müşteriden parayı geri yükle

UpdateMusterilerSetMevcutPara=MevcutPara+@BiletFiyatWhereMusteriId=@MusteriId

End

Liste 2.42: BiletIptal trigger’ı.

Mevcut bir rezervasyonu satışa çevirmek için veritabanı üzerinde Liste 2.43’deki stored procedure’leri oluşturun. Bu stored procedure sayesinde daha önceden rezerve edilmiş bir bilet satışa çevrilebilecek. Daha önceden satılan bir biletin iptalini yapan stored procedure’ü de oluş-turun.

CREATEPROCEDURERezervasyonuSatisaCevir

(

@SeferIdint,

@KoltukNoint

)

AS

UpdateBiletlerSetSatisMiRezervasyonMu=0WhereSeferId=@SeferIdAndKoltukNo=@KoltukNo

Go

CREATEPROCEDURESatisIptal

(

@SeferIdint,

@KoltukNoint

)

AS

DeleteFromBiletlerWhereSeferId=@SeferIdAndKoltukNo=@KoltukNo

Liste 2.43: RezervasyonuSatisaCevir ve SatisIptal stored procedure’ü.

Oluşturulan stored procedure’ü çalıştıran metodu ve satış iptalini yapan metodu HizliTur.Facade projesi içerisindeki Bilet class’ı içerisinde oluşturun (Liste 2. 44).

publicstaticintRezervasyonuSatisaCevir(Entity.Biletbilet)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“RezervasyonuSatisaCevir”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

147Otobüs Otomasyonu

Page 152: Yazilim Proje BilgeAdam

cmd.Parameters.AddWithValue(“@SeferId”,bilet.SeferId);

cmd.Parameters.AddWithValue(“@KoltukNo”,bilet.KoltukNo);

returnUtil.Yurut(cmd);

}

publicstaticintSatisIptal(Entity.Biletbilet)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“SatisIptal”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@SeferId”,bilet.SeferId);

cmd.Parameters.AddWithValue(“@KoltukNo”,bilet.KoltukNo);

returnUtil.Yurut(cmd);

}

Liste 2.44: RezervasyonuSatisaCevir metodu.

Satılmış veya rezervasyon yapılmış biletler üzerinde işlem yapmak için context menu kullanıldı. Bu menülere tıklanıldığı zaman yapılacak işlemleri hazırlayın (Liste 2.45).

privatevoidvazgecContext_Click(objectsender,EventArgse)

{

biletSolMenu.Hide();

}

privatevoidsatisIptalContext_Click(objectsender,EventArgse)

{

DialogResult sonuc = MessageBox.Show(“Bu satışı iptal etmekten emin misiniz ?”, “Satış İptal”, MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if(sonuc==DialogResult.Yes)

{

// Satış iptali yap

Entity.Biletbilet=newHizliTur.Entity.Bilet();

bilet.KoltukNo=uzerindeIslemYapilanKoltuk;

bilet.SeferId=seferId;

if(Facade.Bilet.SatisIptal(bilet)>0)

148 Proje 2

Page 153: Yazilim Proje BilgeAdam

MessageBox.Show(“Bilet iptali yapıldı”, “Satış İptal”, MessageBoxButtons.OK,MessageBoxIcon.Information);

}

}

privatevoidrezervasyonContext_Click(objectsender,EventArgse)

{

DialogResultsonuc=MessageBox.Show(“Burezervasyonuiptal etmekten emin misiniz ?”, “Rezervasyon İptal”, MessageBoxButtons.YesNo,MessageBoxIcon.Question);

if(sonuc==DialogResult.Yes)

{

// Satış iptali yap

Entity.Biletbilet=newHizliTur.Entity.Bilet();

bilet.KoltukNo=uzerindeIslemYapilanKoltuk;

bilet.SeferId=seferId;

if(Facade.Bilet.SatisIptal(bilet)>0)

MessageBox.Show(“Bilet iptali yapıldı”, “Rezervasyon İptal”, MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

privatevoidsatisContext_Click(objectsender,EventArgse)

{

DialogResultsonuc=MessageBox.Show(“Burezervasyonusatışa çevirmek istediğinizden emin misiniz ?”, “Bilet Satış”, MessageBoxButtons.YesNo,MessageBoxIcon.Question);

if(sonuc==DialogResult.Yes)

{

Entity.Biletbilet=newHizliTur.Entity.Bilet();

bilet.KoltukNo=uzerindeIslemYapilanKoltuk;

bilet.SeferId=seferId;

if(Facade.Bilet.RezervasyonuSatisaCevir(bilet)>0)

MessageBox.Show(“Bilet satışı yapıldı”, “Bilet Satış”, MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

Liste 2.45: Satış ve Rezervasyon ile ilgili işlemler.

149Otobüs Otomasyonu

Page 154: Yazilim Proje BilgeAdam

Şimdiye kadar bilet satış, rezervasyon ve diğer tanımlama işlemleri yapıldı. Bu aşamaya kadar uygulamada eksik kalan yer raporlar bölümüdür. Uygulamada 2 çeşit rapor isteniyor. Bunlardan ilki belirlenen 2 tarih arasındaki seferleri, yolcu sayılarını, kalkış ve varış saatlerini listeleyen ra-por, diğeri ise seçilen iki şehir arasında yapılan sefer bilgileridir. Raporlar klasörü içerisine Frm-TarihBazliRapor isminde bir Windows Form ekleyin. Eklenen bu formun Şekil 2.28’deki tasarımını yapın.

FrmTarihBazlıRapor formuna eklenen kontroller ve özellikleri Tablo 2.12’de belirtilmiştir.

Şekil 2.28: Tarih Bazlı raporlama ekranı.

Tablo 2.12: FrmTarihBazliRapor Formu Üzerindeki Kontroller ve ÖzellikleriKontrol Özellik Değer

GroupBox Text Tarih Aralığı BelirleyinName grpKriter

Dock Top

Label Text Başlangıç Tarihi

Label Text Bitiş Tarihi

DateTimePicker Name dtBaslangicZamani

DateTimePicker Name dtBitisZamani

Button Name btnRaporla

Text Raporla

DataGridView Name dgRaporSonuc

AllowUserToAddRows False

AllowUserToDeleteRows False

ReadOnly True

Button Text Rapor Önizle

Name btnOnizle

Button Text Yazdır

Name btnYazdir

Button Text Excele Aktar

Name btnExcelPrintPreviewDialog Name PrintPreviewDialog1

150 Proje 2

Page 155: Yazilim Proje BilgeAdam

Form üzerindeki drRaporSonuc ismini taşıyan datagridview kontrolüne 6 adet sütun ekleyin. Sü-tun isimleri Tablo 2.13’de verilmiştir.

FrmMain formu içerisindeki Tarih Bazlı Rapor menüsünün Click olayına formu açtırmayı sağla-yan kodu yazın.

privatevoidtarihBazliRaporToolStripMenuItem_Click(objectsender,EventArgse)

{

Raporlar.FrmTarihBazliRaporfrm=newHizliTur.WinUI.Raporlar.FrmTarihBazliRapor();

frm.MdiParent=this;

frm.Show();

}

DataGridView kontrolünde sütunlar sonradan eklendiği için veri kaynağından gelen her sütunun veya property’nin görüntülenmemesi için formun Load olayında sütunların otomatik görüntülen-mesini kapatın.

privatevoidFrmTarihBazliRapor_Load(objectsender,EventArgse)

{

dgRaporSonuc.AutoGenerateColumns=false;

}

Raporlama işlemi için gerekli olan TarihBazliRapor stored procedure’ünü veritabanı üzerinde oluşturun.

CreateprocTarihBazliSeferRapor

(

@BaslangicTarihidatetime,

@BitisTarihidatetime

)

As

Tablo 2.12: FrmTarihBazliRapor Formu Üzerindeki Kontroller ve Özellikleri (devam)Kontrol Özellik Değer

Document PrintDocument1PrintDocument Name PrintDocument1FolderBrowserDialog Name FolderBrowserDialog1

Tablo 2.13: drRaporSonuc Kontrolü Üzerindeki SütunlarHeader Text DataPropertyName

Kalkış Şehri KalkisSehri

Varış Şehri VarisSehri

Kalkış Zamanı KalkisZamani

Varış Zamanı VarisZamani

Bilet Tutarı BiletTutariYolcu Sayısı SatisiYapilanBiletSayisi

151Otobüs Otomasyonu

Page 156: Yazilim Proje BilgeAdam

Selecte.SehirAdiAsKalkisSehri,

h.SehirAdiasVarisSehri,

Case

whens.VarisZamaniisNULL

Then‘Belirtilmedi’

else

Convert(nvarchar,s.VarisZamani,104)

endAsVarisZamani,s.KalkisZamani,s.BiletTutari,

Count(b.SeferId)AsSatisiYapilanBiletSayisiFromSeferlers

InnerJoinCalisanlarconc.PersonelId=s.SoforId

InnerJoinCalisanlaraona.PersonelId=s.MuavinId

InnerJoinSehirlereons.KalkisSehirId=e.SehirId

InnerJoinSehirlerhons.VarisSehirId=h.SehirId

InnerJoinBiletlerbonb.SeferId=s.SeferId

Wheres.KalkisZamaniBetween@BaslangicTarihiAnd

@BitisTarihiGroupBys.SeferId,c.Ad,c.Soyad,h.SehirAdi,e.SehirAdi,s.VarisZamani,s.BiletTutari,s.KalkisZamani

Liste 2. 46: TarihBazliSeferRapor stored procedure’ü.

Oluşturulan stored procedure’ü çalıştıracak TarihBazliSeferRapor metodunu HizliTur.Facade projesi içerisindeki Sefer class’ının içerisine ekleyin.

publicstaticDataTableTarihBazliSeferRapor(DateTimebaslangicTarihi,DateTimebitisTarihi)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“TarihBazliSeferRapor”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@BaslangicTarihi”,baslangicTarihi);

cmd.Parameters.AddWithValue(“@BitisTarihi”,bitisTarihi);

SqlDataAdapterda=newSqlDataAdapter(cmd);

DataTabledt=newDataTable();

da.Fill(dt);

returndt;

}

Liste 2.47: TarihBazliSeferRapor metodu.

152 Proje 2

Page 157: Yazilim Proje BilgeAdam

Raporla button kontrolünün Click olayında seçilen tarih aralığındaki bilgileri listeleyen metodu çağırın.

privatevoidbtnRaporla_Click(objectsender,EventArgse)

{

dgRaporSonuc.DataSource=Facade.Sefer.TarihBazliSeferRapor(dtBaslangicZamani.Value,dtBitisZamani.Value);

}

btnOnIzle butonuna tıklanıldığı zaman önizleme yapılmasını sağlamak için Print Preview Dialog kontrolünün ShowDialog() metodunu çağırın.Yalnız bu çağırma işlemi esnasında eğer mevcut datagridview kontrolünün herhangi bir data kaynağı yoksa uygulama hata verecektir. Bu hatayı engellemek için ilk önce datagridview kontrolünün herhangi bir veri kaynağı olup olmadığını kon-trol edin.

privatevoidbtnOnizle_Click(objectsender,EventArgse)

{

if(dgRaporSonuc.DataSource!=null)

printPreviewDialog1.ShowDialog();

}

btnYazdir button kontrolünün Click olayında gerekli belgeyi yazıcıya göndermeyi sağlayan Print() metodunu çağırın.

privatevoidbtnYazdir_Click(objectsender,EventArgse)

{

if(dgRaporSonuc.DataSource!=null)

printDocument1.Print();

}

Uygulamadaki bir veri kaynağını Microsoft Excel uygulamasına aktarmak için farklı yollar mevcut-tur. Bu yollardan biri Office Interop ismi verilen referansı uygulamaya eklemektir fakat bu referans Microsoft Office sürümlerine göre farklılık gösterir. Dolayısıyla uygulama eklenen referans ver-siyonu ile uygulamanın çalıştığı makinedeki Microsoft Office sürümü farklı ise hatalar oluşabilir. Microsoft Excel uygulaması OleDbProvider ile sorunsuz çalıştığından dolayı verileri sorgularken veya aktarırken direk olarak OleDbProvider üzerinden çalışmak hatasız çalışmayı sağlayacaktır fakat Office Interop referansı sayesinde aktarılacak belgenin formatını yapılandırmak mümkün olacaktır. Excel’e aktarmayı sağlayacak olan button kontrolünün Click olayına OleDbProvider sa-yesinde bir tablo oluşturmayı sağlayan ve bu tabloya kayıt girmeyi sağlayan kodu yazın. Standart Ado.Net sorgularından farklı olmayan bu sorgularda tek farklı nokta Microsoft Excel’deki çalışma sayfasının tablo gibi görülmesi ve $ işareti ile birlikte sorgulama yapılmasıdır.

privatevoidbtnExcel_Click(objectsender,EventArgse)

{

if(dgRaporSonuc.DataSource!=null)

{

if(folderBrowserDialog1.ShowDialog()==DialogResult.OK)

{

OleDbConnectionexcelConnection=newOleDbConnection(“DataSource=”+folderBrowserDialog1.SelectedPath

153Otobüs Otomasyonu

Page 158: Yazilim Proje BilgeAdam

+”\\TarihBazlıRapor.xls;Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel8.0;”);

OleDbCommandexcelCommand=newOleDbCommand(“CREATE TABLE [Rapor] ([Kalkış] string, [Varış] string, [Varış Zamanı] string, [Kalkış Zamanı] string,[Bilet Tutarı] double, [Toplam Bilet] int);”, excelConnection);

excelConnection.Open();

try

{

excelCommand.ExecuteNonQuery();

}

catch(Exceptionex)

{

MessageBox.Show(“Bubelgezatenmevcut.”);

return;

}

excelConnection.Close();

excelConnection.Open();

DataTabledt=(DataTable)dgRaporSonuc.DataSource;

foreach(DataRowdrindt.Rows)

{

excelCommand=newOleDbCommand(“InsertInto [Rapor$] ([Kalkış],[Varış],[Varış Zamanı],[Kalkış Zamanı],[Bilet Tutarı], [Toplam Bilet]) Values(@KalkisSehri,@VarisSehri,@VarisZamani,@KalkisZamani,@BiletTutari,@SatisiYapilanBiletSayisi)”,excelConnection);

excelCommand.Parameters.AddWithValue(“@KalkisSehri”,dr[“KalkisSehri”].ToString());

excelCommand.Parameters.AddWithValue(“@VarisSehri”,dr[“VarisSehri”].ToString());

excelCommand.Parameters.AddWithValue(“@VarisZamani”,dr[“VarisZamani”].ToString());

excelCommand.Parameters.AddWithValue(“@KalkisZamani”,dr[“KalkisZamani”].ToString());

excelCommand.Parameters.AddWithValue(“@BiletTutari”,Convert.ToDecimal(dr[“BiletTutari”]));

excelCommand.Parameters.AddWithValue(“@SatisiYapilanBiletSayisi”,Convert.ToInt32(dr[“SatisiYapilanBiletSayisi”]));

excelCommand.ExecuteNonQuery();

}

excelConnection.Close();

154 Proje 2

Page 159: Yazilim Proje BilgeAdam

}

}

}

Liste 2.48: Raporu Excel’e aktarma işlemi.

Rapor çıktısında ise herhangi ek bir bileşen kullanılmayacağından dolayı çıktı işlemi print do-cument sayesinde yapılmaktadır. Bir sayfada 35 kayıt listelenecek şekilde printDocument1_Be-ginPrint ve printDocument1_PrintPage olaylarını Liste 2.49’da belirtiği gibi hazırlayın ve belirtilen global değişkenleri oluşturun.

privatevoidprintDocument1_BeginPrint(objectsender,System.Drawing.Printing.PrintEventArgse)

{

// toplam kaç kayıt olacak

inttoplamKayit=((DataTable)dgRaporSonuc.DataSource).Rows.Count;

// hangi sayfa bitiş sayfamız olacak. Bir sayfada 35 kayıt bulunacak.

bitis=(toplamKayit-(toplamKayit%35))/35;

}

intmevcutSayfa,bitis;

privatevoidprintDocument1_PrintPage(objectsender,System.Drawing.Printing.PrintPageEventArgse)

{

// Rapor Başlığını yaz

e.Graphics.DrawString(“Tarih Bazlı Rapor [“ +dtBaslangicZamani.Value.ToShortDateString()+“-“+dtBitisZamani.Value.ToShortDateString()+“]”,newFont(“Verdana”,10),Brushes.Red,80,10);

// Başlıkları yaz

e.Graphics.DrawString(“Kalkış Şehri”, new Font(“Verdana”,8),Brushes.Red,110,80);

e.Graphics.DrawString(“Varış Şehri”, new Font(“Verdana”,8),Brushes.Red,200,80);

e.Graphics.DrawString(“Kalkış Zamanı”, new Font(“Verdana”,8),Brushes.Red,280,80);

e.Graphics.DrawString(“Varış Zamanı”, new Font(“Verdana”,8),Brushes.Red,400,80);

e.Graphics.DrawString(“Bilet Tutarı”, new Font(“Verdana”,8),Brushes.Red,510,80);

155Otobüs Otomasyonu

Page 160: Yazilim Proje BilgeAdam

e.Graphics.DrawString(“YolcuAdedi”,newFont(“Verdana”,8),Brushes.Red,605,80);

// Başlıklar altına gerekli çizgileri çiz

e.Graphics.DrawLine(newPen(Brushes.Red),80,95,700,95);

// Gerekli kayıtları bas. Her sayfada 30 sefer listelenecek.

DataTabledt=(DataTable)dgRaporSonuc.DataSource;

inty=130;

// e.HasMorePages=True olduğunda hangi kayıttan itibaren yazdırmaya başlanacak

intbaslangicKayit=mevcutSayfa*35;

// mevcut sayfaya kaç adet kayıt yazdırılacak.

intbitisKayit=(baslangicKayit+35>dt.Rows.Count)?dt.Rows.Count:baslangicKayit+35;

for(inti=baslangicKayit;i<bitisKayit;i++)

{

e.Graphics.DrawString(dt.Rows[i][“KalkisSehri”].ToString(),newFont(“Verdana”,8),Brushes.Black,110,y);

e.Graphics.DrawString(dt.Rows[i][“VarisSehri”].ToString(),newFont(“Verdana”,8),Brushes.Black,200,y);

e.Graphics.DrawString(Convert.ToDateTime(dt.Rows[i][“KalkisZamani”]).ToShortTimeString(),newFont(“Verdana”,8),Brushes.Black,280,y);

DateTimevarisZaman=DateTime.Now;

boolsonuc=DateTime.TryParse(dt.Rows[i][“VarisZamani”].ToString(),outvarisZaman);

if(sonuc)

e.Graphics.DrawString(Convert.ToDateTime(dt.Rows[i][“VarisZamani”]).ToShortTimeString(),newFont(“Verdana”,8),Brushes.Black,400,y);

else

e.Graphics.DrawString(dt.Rows[i][“VarisZamani”].ToString(),newFont(“Verdana”,8),Brushes.Black,400,y);

156 Proje 2

Page 161: Yazilim Proje BilgeAdam

e.Graphics.DrawString(Convert.ToDecimal(dt.Rows[i][“BiletTutari”])+“YTL”,newFont(“Verdana”,8),Brushes.Black,510,y);

e.Graphics.DrawString(dt.Rows[i][“SatisiYapilanBiletSayisi”].ToString(),newFont(“Verdana”,8),Brushes.Black,620,y);

y+=30;

}

mevcutSayfa++;

// e.HasMorePages= true olduğunda bu metod bir daha çalışacak.

e.HasMorePages=mevcutSayfa<=bitis;

}

Liste 2.49: Raporu yazdırma işlemi.

Bu rapor formu hazırlandıktan sonra HizliTur.WinUI projesi içerisindeki Raporlar klasörüne Frm-SeferBazliRapor isminde bir Windows Form ekleyin.Şekil 2.29’daki gibi tasarımını yapın.

Kontrolleri Tablo 2.14’de belirtildiği gibi düzenleyin.

Şekil 2.29: Sefer Bazlı Raporlama formu.

157Otobüs Otomasyonu

Page 162: Yazilim Proje BilgeAdam

Form üzerindeki drRaporSonuc ismini taşıyan datagridview kontrolüne 4 adet sütun ekleyin. Sü-tun isimleri Tablo 2.15’de verilmiştir.

Form ilk yüklendiğinde mevcut combobox kontrollerinin verileri listelemesini ve datagridview kon-trolünün sütunları otomatik göstermesini kapatın.

privatevoidFrmSeferBazliRapor_Load(objectsender,EventArgse)

{

cmbKalkis.DisplayMember=“SehirAdi”;

cmbKalkis.ValueMember=“SehirId”;

cmbKalkis.DataSource=Facade.Sehir.SehirListesi();

cmbVaris.DisplayMember=“SehirAdi”;

cmbVaris.ValueMember=“SehirId”;

cmbVaris.DataSource=Facade.Sehir.SehirListesi();

Tablo 2.14: Sefer Bazlı Rapor Formu Üzerindeki KontrollerKontrol Özellik Değer

GroupBox Text Sefer SeçinName grpKriter

Dock Top

Label Text Kalkış:

Label Text Varış

ComboBox Name cmbKalkis

ComboBox Name cmbVaris

Button Name btnRaporla

Text Raporla

DataGridView Name dgRaporSonuc

AllowUserToAddRows False

AllowUserToDeleteRows False

ReadOnly True

Button Text Rapor Önizle

Name btnOnizle

Button Text Yazdır

Name btnYazdir

Button Text Excel’e Aktar

Name btnExcel

PrintPreviewDialog Name PrintPreviewDialog1

Document PrintDocument1

PrintDocument Name PrintDocument1FolderBrowserDialog Name FolderBrowserDialog1

Tablo 2.15: drRaporSonuc Kontrolü Üzerindeki SütunlarHeader Text DataPropertyName

Kalkış Zamanı KalkisZamani

Varış Zamanı VarisZamani

Bilet Fiyatı BiletTutariYolcu Sayısı ToplamYolcu

158 Proje 2

Page 163: Yazilim Proje BilgeAdam

dgRaporSonuc.AutoGenerateColumns=false;

}

Liste 2.50: FrmSeferBazliRapor_Load olayı.

Sefer bazlı rapor alabilmek için veritabanı üzerinde sefer başına toplam yolcuyu döndüren fonk-siyonu oluşturun.

CreateFunctionSeferBasinaToplamYolcu

(

@SeferIdint

)

returnsint

begin

Declare@Sonucint

Select@Sonuc=Count(SeferId)FromBiletlerWhereSeferId=@SeferId

return@Sonuc

end

Liste 2.51: SeferBasinaToplamYolcu stored procedure’ü.

Fonksiyon oluşturulduktan sonra raporlamayı yapacak olan SehirBazliSeferRapor stored procedure’ünü oluşturun.

CreateProcSehirBazliSeferRapor

(

@KalkisSehriint,

@VarisSehriint

)

As

SelectKalkisZamani,

case

whenVarisZamaniisNULL

Then‘Belirtilmedi’

else

Convert(nvarchar,VarisZamani,104)

endAsVarisZamani,BiletTutari,dbo.SeferBasinaToplamYolcu(SeferId)AsToplamYolcu

FromSeferlerWhereKalkisSehirId=@KalkisSehriAndVarisSehirId=@VarisSehri

Liste 2.52: SehirBazliSeferRapor stored procedure’ü.

Oluşturulan stored procedure’ü çalıştırıp rapor sonucunu döndürecek olan SehirBazliSeferRapor metodunu HizliTur.Facade projesi içerisindeki Sefer class’ına ekleyin.

159Otobüs Otomasyonu

Page 164: Yazilim Proje BilgeAdam

publicstaticDataTableSehirBazliSeferRapor(intkalkisSehirId,intvariSehirId)

{

SqlConnectioncon=newSqlConnection(Util.ConnectionString);

SqlCommandcmd=newSqlCommand(“SehirBazliSeferRapor”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@KalkisSehri”,kalkisSehirId);

cmd.Parameters.AddWithValue(“@VarisSehri”,variSehirId);

SqlDataAdapterda=newSqlDataAdapter(cmd);

DataTabledt=newDataTable();

da.Fill(dt);

returndt;

}

Liste 2.53: SehirBazliSeferRapor metodu.

btnRaporla butonuna tıklanıldığı zaman raporlama işlemini yapacak olan metodu çağırın.

privatevoidbtnRaporla_Click(objectsender,EventArgse)

{

dgRaporSonuc.DataSource=Facade.Sefer.SehirBazliSeferRapor(Convert.ToInt32(cmbKalkis.SelectedValue),Convert.ToInt32(cmbVaris.SelectedValue));

}

btnYazdir ve btnOnizle button kontrollerinin Click olaylarını hazırlayın.

privatevoidbtnYazdir_Click(objectsender,EventArgse)

{

if(dgRaporSonuc.DataSource!=null)

printDocument1.Print();

}

privatevoidbtmOnizle_Click(objectsender,EventArgse)

{

if(dgRaporSonuc.DataSource!=null)

printPreviewDialog1.ShowDialog();

}

160 Proje 2

Page 165: Yazilim Proje BilgeAdam

btnExcel butonuna tıklanıldığı zaman rapor çıktısını verecek metodu yazın.

privatevoidbtnExcel_Click(objectsender,EventArgse)

{

if(dgRaporSonuc.DataSource!=null)

{

if(folderBrowserDialog1.ShowDialog()==DialogResult.OK)

{

OleDbConnectionexcelConnection=newOleDbConnection(“DataSource=”+folderBrowserDialog1.SelectedPath + “\\SehirBazlıRapor.xlsx;Provider=Microsoft.Jet.OLEDB.4.0;ExtendedProperties=Excel9.0;”);

OleDbCommandexcelCommand=newOleDbCommand(“CREATE TABLE [Rapor] ([Kalkış Zamanı] string, [Varış Zamanı] string, [Bilet Tutarı] double, [Yolcu Sayısı] int);”,excelConnection);

excelConnection.Open();

try

{

excelCommand.ExecuteNonQuery();

}

catch(Exceptionex)

{

MessageBox.Show(“Bubelgezatenmevcut.”);

return;

}

excelConnection.Close();

excelConnection.Open();

DataTabledt=(DataTable)dgRaporSonuc.DataSource;

foreach(DataRowdrindt.Rows)

{

excelCommand=newOleDbCommand(“InsertInto [Rapor$] ([Kalkış Zamanı],[Varış Zamanı],[Bilet Tutarı], [Yolcu Sayısı]) Values(@KalkisZamani,@VarisZamani,@BiletTutari,@YolcuSayisi)”,excelConnection);

excelCommand.Parameters.AddWithValue(“@KalkisZamani”,dr[“KalkisZamani”].ToString());

excelCommand.Parameters.AddWithValue(“@VarisZamani”,dr[“VarisZamani”].ToString());

excelCommand.Parameters.AddWithValue(“@BiletTutari”,Convert.ToDecimal(dr[“BiletTutari”]));

161Otobüs Otomasyonu

Page 166: Yazilim Proje BilgeAdam

excelCommand.Parameters.AddWithValue(“@YolcuSayisi”,Convert.ToInt32(dr[“ToplamYolcu”]));

excelCommand.ExecuteNonQuery();

}

excelConnection.Close();

}

}

}

Liste 2.54: Gerekli Raporu Excel’e aktarma işlemi.

Datagridview kontrolünün veri kaynağını yazdırmayı sağlayan Liste 2.55’deki olayları hazırlayın.

privatevoidprintDocument1_BeginPrint(objectsender,System.Drawing.Printing.PrintEventArgse)

{

inttoplamKayit=((DataTable)dgRaporSonuc.DataSource).Rows.Count;

bitis=(toplamKayit-(toplamKayit%35))/35;

}

intmevcutSayfa,bitis;

privatevoidprintDocument1_PrintPage(objectsender,System.Drawing.Printing.PrintPageEventArgse)

{

// Rapor Başlığını yaz

e.Graphics.DrawString(“Sefer Bazlı Rapor [“ + cmbKalkis.Text+“-“+cmbVaris.Text+“]”,newFont(“Verdana”,10),Brushes.Red,80,10);

// Başlıkları yaz

e.Graphics.DrawString(“Kalkış Zamanı”, new Font(“Verdana”,8),Brushes.Red,80,80);

e.Graphics.DrawString(“Varış Zamanı”, new Font(“Verdana”,8),Brushes.Red,230,80);

e.Graphics.DrawString(“Bilet Tutarı”, new Font(“Verdana”,8),Brushes.Red,370,80);

e.Graphics.DrawString(“YolcuAdedi”,newFont(“Verdana”,8),Brushes.Red,470,80);

// Başlıklar altına gerekli çizgileri çiz

e.Graphics.DrawLine(newPen(Brushes.Red),80,95,700,95);

162 Proje 2

Page 167: Yazilim Proje BilgeAdam

// Gerekli kayıtları bas. Her sayfada 35 sefer listelenecek.

DataTabledt=(DataTable)dgRaporSonuc.DataSource;

inty=130;

intbaslangicKayit=mevcutSayfa*35;

intbitisKayit=(baslangicKayit+35>dt.Rows.Count)?dt.Rows.Count:baslangicKayit+35;

for(inti=baslangicKayit;i<bitisKayit;i++)

{

e.Graphics.DrawString(Convert.ToDateTime(dt.Rows[i][“KalkisZamani”]).ToShortTimeString(),newFont(“Verdana”,8),Brushes.Black,80,y);

DateTimevarisZaman=DateTime.Now;

boolsonuc=DateTime.TryParse(dt.Rows[i][“VarisZamani”].ToString(),outvarisZaman);

if(sonuc)

e.Graphics.DrawString(Convert.ToDateTime(dt.Rows[i][“VarisZamani”]).ToShortTimeString(),newFont(“Verdana”,8),Brushes.Black,230,y);

else

e.Graphics.DrawString(dt.Rows[i][“VarisZamani”].ToString(),newFont(“Verdana”,8),Brushes.Black,230,y);

e.Graphics.DrawString(Convert.ToDecimal(dt.Rows[i][“BiletTutari”])+“YTL”,newFont(“Verdana”,8),Brushes.Black,370,y);

e.Graphics.DrawString(dt.Rows[i][“ToplamYolcu”].ToString(),newFont(“Verdana”,8),Brushes.Black,470,y);

y+=30;

}

mevcutSayfa++;

e.HasMorePages=mevcutSayfa<=bitis;

}

Liste 2.55: Gerekli raporu yazdırma işlemi.

Rezervasyon yapılıp alınmayan biletler 10 dakika öncesinde iptal edilmesi için database üzerin-de bir job hazırlayın. Rezerve edilen biletler biletler tablosunda SatisMiRezervasyonMu sütunu

163Otobüs Otomasyonu

Page 168: Yazilim Proje BilgeAdam

içerisinde tutuluyor. Hangi sefere ait rezervasyon olduğunu bulabilmek için Seferler tablosundaki KalkisZamani bilgisine ihtiyaç var. İlk önce SeferId’yi parametre alan ve bu seferin kalkış zamanı-nı döndüren fonksiyonu veritabanı sunucusu üzerinde oluşturun.

CreateFunctionKalkisZamaniDondur

(

@SeferIdint

)

returnsdatetime

as

begin

Declare@KalkisZamanidatetime

Select@KalkisZamani=KalkisZamaniFromSeferlerWhereSeferId=@SeferId

return@KalkisZamani

end

Liste 2.56: KalkisZamaniDondur fonksiyonu.

Bu fonksiyon sayesinde hangi seferin ne zaman kalkacağı bilgisine ulaşıp silinmesi gereken re-zervasyonlara ulaşılacak. Silme işlemini yapacak olan sorgu ise Liste 2.57’de verilmiştir.

DeleteFromBiletlerWhereSatisMiRezervasyonMu=‘True’AndDatediff(mi,dbo.KalkisZamaniDondur(SeferId),GetDate())>=-10

Liste 2.57: Rezervasyonları otomatik iptal edecek sorgu.

Bu sorguyu dakikada bir çalışacak bir job haline getirin. Unu-tulmamalıdır ki Sql Server üzerindeki job’ların çalışabilmesi için Sql Server Agent servisinin çalışıyor olması gerekir. Sql Server Agent servisinin Start Mode özelliğini Automatic yapın.

Sql Server Management Studio içerisinden object browser penceresi içerisinde Sql Server Agent genişletin. Job sekmesi üzerinde sağ tıklayın New Job menüsünü seçin.

Oluşturulacak olan job’a General sekmesinden RezervasyonIptal ismi verin. Daha sonra Steps sekmesine geçip New butonuna tıklayıp yeni bir step oluşturun. Oluşturulacak adıma isim olarak RezervasyonSilme ismi verin. Database olarak HizliTur veritabanını seçin. Sorgu olarak ise Liste 2.57’de verilen sorguyu girin.

Sql Server Configuration Manager aracından servislerin Start Mode özelliklerini ayarlayabilirsiniz.

Şekil 2.30: Yeni Job oluşturma ekranı.

164 Proje 2

Page 169: Yazilim Proje BilgeAdam

Job adımı oluşturulduktan sonra Schedules sekmesine tıklayıp New butonuna tıklayın. Her 1 dakikada çalışacak şekilde zamanlama oluşturun.

Şekil 2.31: Job isimlendirme.

Şekil 2.32: Job adımı oluşturma.

165Otobüs Otomasyonu

Page 170: Yazilim Proje BilgeAdam

Job oluşturma işlemini tamamlamak için OK butonuna tıklayıp açık işlemi onaylayın. Bu aşama-dan sonra her 1 dakikada bir zamanlanmış iş çalışacak ve iptal edilmesi gereken rezervasyonları silecek.

Buraya kadar anlatılanlar size uygulama içerisindeki kilit noktalarda yol göster amaçlı yapılmış-tır.

UygulamaMüşterilerin aldığı biletlerin günlük, aylık raporlarını ve otobüslerin seferlerde harcadığı tutar-ların raporlarını hazırlayın.

Personel yetkilendirme formu yapın.

Veritabanının her Pazar full yedeğini, her gün sadece farkların yedeğini alan bir job oluştu-run.

Müşterinin aldığı bilet için bir tasarım yapın ve çıktısını yazıcıdan çıkartın.

1.

2.

3.

4.

Şekil 2.33: Job’ın çalışacağı zamanların belirlenmesi.

166 Proje 2

Page 171: Yazilim Proje BilgeAdam

3 Proje 3: DVDDukkani.com

Page 172: Yazilim Proje BilgeAdam

3 Proje 3 : DVDDukkani.comGörüşmeler

Uygulama Tasarımı

Page 173: Yazilim Proje BilgeAdam

Proje 3: DVDDukkani.comGörüşmelerHüsamettin Beceriksiz (Proje Sahibi)Yapmak istediğimiz web uygulaması sayesinde piyasadaki dvd’leri kullanıcılarımıza ulaştırmak istiyoruz. Filmleri tahsis eden firmalar bir Windows ekranından kendi filmlerini tanımlasın, kate-gorilerini, oyuncularını, altyazı bilgilerini, dilleri, filmin afişini, süresini, yapımcısını girsin, bana ne kadara satacağını girsin ve kendi girdiği filmleri güncelleyebilsin. Daha sonra bu film bilgileri üzerinden de değişiklik yapabilsin ama o filmi ekledikten sonra film direk satışa girmesin. Ben girdiği bilgileri göreyim, eğer düzgün ise satışa alayım filmi ve internette görünsün. Yine aynı uygulamadan gelen bir siparişi o filmi tedarik eden firma görsün ve bana göndersin. Bir filmde oy-nayan oyuncuların, yönetmenlerin ve mevcut altyazı sayısının birden fazla olduğunu unutmayın. Benim onayladığım ve satışa çıkardığım filmleri kullanıcılar görebilsin, kategorilere göre filmleri listeyelebilsin, detayını görüntülediği bir filmi sepetine ekleyebilsin. Sepetteki ürünleri ise en so-nunda onaylayıp alışveriş yapabilsin. Sipariş geldiği zaman otomatik olarak kullanıcının siparişi tedarikçiye iletilsin. Benim depom yok tedarikçe gelen siparişlere bakıp bana göndersin yoksa olmadığına dair açıklama yazsın. Bu işlemi de kendi kullanacağı windows arayüzünden yapsın bende internet sitesi üzerinden görebileyim. Üyelerimiz birden fazla adres tanımlaması yapabil-sin. Örneğin; ev, iş gibi adres tanımlasın ki daha sonradan sipariş verirken istediği adrese siparişi gönderebileyim.

Uygulama TasarımıVeritabanı Tasarımı

Veritabanı sunucunuzu açın DvdDukkani isminde veritabanı oluşturun.

Şekil 3.1 ile Şekil 3.20 arasındaki tabloları veritabanı üzerinde oluşturun.

1.

2.

Şekil 3.1: Tedarikciler tablosu. Şekil 3.2: UyeAdresler tablosu.

Şekil 3.3: Uyeler tablosu. Şekil 3.4: YapimciFirmalar tablosu.

Şekil 3.5: Yonetmenler tablosu. Şekil 3.6: Altyazilar tablosu.

Page 174: Yazilim Proje BilgeAdam

FilmTipUcret tablosundaki Tur ismindeki sutun DVD, CD gibi turleri tutacak. Program tarafından bir enum aracı olacak.

Şekil 3.7: Diller tablosu. Şekil 3.8: FilmKategorileri tablosu.

Şekil 3.9: Filmler tablosu. Şekil 3.10: FilmOyuncular tablosu.

Şekil 3.11: FilmTipUcret tablosu.

Şekil 3.12: FilmYonetmenleri tablosu. Şekil 3.13: Ilceler tablosu.

Şekil 3.14: Islemler tablosu. Şekil 3.15: Kategoriler tablosu.

Şekil 3.16: Oyuncular tablosu. Şekil 3.17: Sehirler tablosu.

Şekil 3.18: SepetDetaylari tablosu. Şekil 3.19: Sepetler tablosu.

170 Proje 3

Page 175: Yazilim Proje BilgeAdam

Eklenen 20 tablo sonucu veritabanındaki tablo listesi Şekil 3.21’deki gibi olmaktadır.

Eklenen tablolar için gerekli ilişkileri verin.

Şekil 3.20: TedarikciIstek tablosu.

Şekil 3.21: Veritabanı tablo yapısı.

Kaynak Tablo Kaynak Sütun Hedef Tablo Hedef Sütun

Ilceler SehirId Sehirler SehirIdUyeAdresler IlceId Ilceler IlceId

Tedarikciler IlceId Ilceler IlceId

Islemler FilmId Filmler FilmId

SepetDetaylari FilmId Filmler FilmId

FilmYonetmenleri FilmId Filmler FilmId

FilmOyuncular FilmId Filmler FilmId

FilmKategorileri FilmId Filmler FilmId

FilmTipUcret FilmId Filmler FilmId

Altyazilar FilmId Filmler FilmId

Filmler DilId Diller DilId

Altyazilar DilId Diller DilId

FilmYonetmenleri YonetmenId Yonetmenler YonetmenId

FilmOyuncular OyuncuId Oyuncular OyuncuId

Filmler YapimciFirmaId YapimciFirmalar FirmaId

SepetDetaylari SepetId Sepetler SepetId

FilmKategorileri KategoriId Kategoriler KategoriId

UyeAdresler UyeId Uyeler UyeIdSepetler UyeId Uyeler UyeId

171DVDDukkani.com

Page 176: Yazilim Proje BilgeAdam

Arayüz TasarımıFarklı platformlardaki uygulamalar haberleşeceği için uygulama bünyesinde web servisi, windows uygulaması ve web uygulaması bulunacak. Visual Studio açıp boş bir solution oluşturun ve ismini DvdDukkaniSln verin. Veri ile arayüzün haberleşmesini sağlamak için Entity ve Facade katman yapısını kullanın. Oluşturulan solution’a DvdDukkani. Entity isminde Class Library projesi ekle-yin. Standart olarak gelen Class1.cs dosyasını silin. Veritabanındaki her tabloya karşılık gelecek şekilde birer class, her sütuna karşılık gelecek şekilde birer property ekleyin. Liste 3.1’de örnek olarak Film class’ı verilmiştir.

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceDvdDukkani.Entity

{

publicclassFilm

{

#regionProperty

privateint_FilmId;

privatestring_Adi;

privateint_DilId;

privatestring_Ozet;

privateint_YapimciFirmaId;

privateint_Sure;

privateint_Yil;

privatestring_Afis;

privatebool_SatistaMi;

privatebool_OnaylandiMi;

privateint_TedarikEdilenFirmaId;

publicintTedarikEdilenFirmaId

{

172 Proje 3

Page 177: Yazilim Proje BilgeAdam

get{return_TedarikEdilenFirmaId;}

set{_TedarikEdilenFirmaId=value;}

}

publicintFilmId

{

get{return_FilmId;}

set{_FilmId=value;}

}

publicstringAdi

{

get{return_Adi;}

set{_Adi=value;}

}

publicintDilId

{

get{return_DilId;}

set{_DilId=value;}

}

publicstringOzet

{

get{return_Ozet;}

set{_Ozet=value;}

}

publicintYapimciFirmaId

{

get{return_YapimciFirmaId;}

set{_YapimciFirmaId=value;}

}

publicintSure

{

get{return_Sure;}

set{_Sure=value;}

}

publicintYil

{

get{return_Yil;}

173DVDDukkani.com

Page 178: Yazilim Proje BilgeAdam

set{_Yil=value;}

}

publicstringAfis

{

get{return_Afis;}

set{_Afis=value;}

}

publicboolSatistaMi

{

get{return_SatistaMi;}

set{_SatistaMi=value;}

}

publicboolOnaylandiMi

{

get{return_OnaylandiMi;}

set{_OnaylandiMi=value;}

}

#endregion

}

}

Liste 3.1: Film.cs class yapısı.

Veritabanı sunucuna bağlanın. Veritabanınız üzerinde her tablo için ekleme, silme, güncelleme, tümünü listeleme ve ID bilgisine göre tümünü listeme yapacak Stored Procedure oluşturun. Ör-nek olarak Liste 3.2 ile Liste 3.6 arasında Stored Procedure’leri kullanın.

CreateProcFilmEkle

(

@Adinvarchar(50),

@DilIdint,

@Ozetnvarchar(max),

@YapimciFirmaIdint,

@Sureint,

@Yilint,

@Afisnvarchar(50),

@TeminEdilenTedarikciIdint

)

As

InsertIntoFilmler

(

174 Proje 3

Page 179: Yazilim Proje BilgeAdam

Adi,

DilId,

Ozet,

YapimciFirmaId,

Sure,

Yil,

Afis,

SatistaMi,

OnaylandiMi,

TeminEdilenTedarikciId

)

values

(

@Adi,

@DilId,

@Ozet,

@YapimciFirmaId,

@Sure,

@Yil,

@Afis,

‘False’,

‘False’,

@TeminEdilenTedarikciId

)

Select@@Identity

Liste 3.2: FilmEkle stored procedure’ü.

CREATEProcFilmGuncelle

(

@Adinvarchar(50),

@DilIdint,

@Ozetnvarchar(max),

@YapimciFirmaIdint,

@Sureint,

@Yilint,

@Afisnvarchar(50),

@SatistaMibit,

@OnaylandiMibit,

@TeminEdilenTedarikciIdint,

@FilmIdint

)

As

UPDATEFilmlerSETAdi=@Adi

,DilId=@DilId

175DVDDukkani.com

Page 180: Yazilim Proje BilgeAdam

,Ozet=@Ozet

,YapimciFirmaId=@YapimciFirmaId

,Sure=@Sure

,Yil=@Yil

,Afis=@Afis

,SatistaMi=@SatistaMi

,OnaylandiMi=@OnaylandiMi

,TeminEdilenTedarikciId=@TeminEdilenTedarikciId

WHEREFilmId=@FilmId

Liste 3.3: FilmGuncelle stored procedure’ü.

CREATEPROCFilmDetay

(

@FilmIdint

)

As

SelectFilmId

,Adi

,DilId

,Ozet

,YapimciFirmaId

,Sure

,Yil

,Afis

,SatistaMi

,OnaylandiMi

,TeminEdilenTedarikciId

FromFilmlerWhereFilmId=@FilmIdAndOnaylandiMi=’True’

Liste 3.4: FilmDetay stored procedure’ü.

CREATEProcFilmListesi

As

SELECTFilmId

,Adi

,DilId

,Ozet

,YapimciFirmaId

,Sure

,Yil

,Afis

,SatistaMi

,OnaylandiMi

176 Proje 3

Page 181: Yazilim Proje BilgeAdam

,TeminEdilenTedarikciId

FROMFilmler

Liste 3.5: FilmListesi stored procedure’ü.

CREATEProcFilmSil

(

@FilmIdint

)

As

DeleteFromFilmlerWhereFilmId=@FilmId

Liste 3.6: FilmSil stored procedure’ü.

Tüm tablolar için Stored Procedure oluşturduktan sonra ve entity katmanını tamamladıktan sonra DvdDukkaniSln isimli solution’a DvdDukkani.Facade isminde yeni bir Class Library projesi ekle-yin. Eklenen proje içerisindeki Class1 ismindeki dosyayı silin. Veritabanındaki her tabloya kar-şılık gelecek birer class ekleyin.Eklenen class’lar içerisine ekleme, silme, güncelleme, tümünü listeleme ve ID bilgisine göre tümünü listeme yapacak static metotları ekleyin. Örnek olarak Liste 3.7‘deki Film.cs class’ını kullanın.

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data.SqlClient;

usingSystem.Configuration;

usingSystem.Data;

namespaceDvdDukkani.DataLayer

{

publicclassFilm

{

publicstaticintFilmEkle(Entity.Filmfilm)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

SqlCommandcmd=newSqlCommand(“FilmEkle”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@Adi”,film.Adi);

cmd.Parameters.AddWithValue(“@DilId”,film.DilId);

cmd.Parameters.AddWithValue(“@Ozet”,film.Ozet);

cmd.Parameters.AddWithValue(“@YapimciFirmaId”,film.YapimciFirmaId);

cmd.Parameters.AddWithValue(“@Sure”,film.Sure);

cmd.Parameters.AddWithValue(“@Yil”,film.Yil);

177DVDDukkani.com

Page 182: Yazilim Proje BilgeAdam

cmd.Parameters.AddWithValue(“@Afis”,film.Afis);

cmd.Parameters.AddWithValue(“@TeminEdilenTedarikciId”,film.TedarikEdilenFirmaId);

inti=0;

try

{

con.Open();

i=Convert.ToInt32(cmd.ExecuteScalar());

}

catch{}

finally{con.Close();}

returni;

}

publicstaticEntity.FilmFilmDetay(intfilmId)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

SqlCommandcmd=newSqlCommand(“FilmDetay”,con);

cmd.Parameters.AddWithValue(“@FilmId”,filmId);

cmd.CommandType=CommandType.StoredProcedure;

Entity.Filmfilm=null;

try

{

con.Open();

SqlDataReaderdr=cmd.ExecuteReader();

if(dr.Read())

{

film=newEntity.Film();

film.FilmId=(int)dr[“FilmId”];

film.Adi=(string)dr[“Adi”];

film.DilId=(int)dr[“DilId”];

film.Ozet=(string)dr[“Ozet”];

film.YapimciFirmaId=(int)dr[“YapimciFirmaId”];

film.Sure=(int)dr[“Sure”];

film.Yil=(int)dr[“Yil”];

film.Afis=(string)dr[“Afis”];

film.SatistaMi=(bool)dr[“SatistaMi”];

film.OnaylandiMi=(bool)dr[“OnaylandiMi”];

film.TedarikEdilenFirmaId=(int)dr[“TeminEdilenTedarikciId”];

}

178 Proje 3

Page 183: Yazilim Proje BilgeAdam

}

catch(Exceptionex)

{

throwex;

}

finally

{

con.Close();

}

returnfilm;

}

publicstaticintFilmGuncelle(Entity.Filmfilm)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

SqlCommandcmd=newSqlCommand(“FilmGuncelle”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@Adi”,film.Adi);

cmd.Parameters.AddWithValue(“@DilId”,film.DilId);

cmd.Parameters.AddWithValue(“@Ozet”,film.Ozet);

cmd.Parameters.AddWithValue(“@YapimciFirmaId”,film.YapimciFirmaId);

cmd.Parameters.AddWithValue(“@Sure”,film.Sure);

cmd.Parameters.AddWithValue(“@Yil”,film.Yil);

cmd.Parameters.AddWithValue(“@Afis”,film.Afis);

cmd.Parameters.AddWithValue(“@SatistaMi”,film.SatistaMi);

cmd.Parameters.AddWithValue(“@OnaylandiMi”,film.OnaylandiMi);

cmd.Parameters.AddWithValue(“@TeminEdilenTedarikciId”,film.TedarikEdilenFirmaId);

cmd.Parameters.AddWithValue(“@FilmId”,film.FilmId);

inti=0;

try

{

con.Open();

i=Convert.ToInt32(cmd.ExecuteScalar());

}

catch{}

finally{con.Close();}

179DVDDukkani.com

Page 184: Yazilim Proje BilgeAdam

returni;

}

publicstaticintFilmSil(intfilmId)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

SqlCommandcmd=newSqlCommand(“FilmSil”,con);

cmd.CommandType=CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@FilmId”,filmId);

inti=0;

try

{

con.Open();

i=cmd.ExecuteNonQuery();

}

catch(Exceptionex)

{

throwex;

}

finally

{

con.Close();

}

returni;

}

publicstaticList<Entity.Film>FilmListesi()

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

SqlCommandcmd=newSqlCommand(“FilmListesi”,con);

cmd.CommandType=CommandType.StoredProcedure;

List<Entity.Film>filmListesi=newList<DvdDukkani.Entity.Film>();

try

{

con.Open();

SqlDataReaderdr=cmd.ExecuteReader();

if(dr.Read())

180 Proje 3

Page 185: Yazilim Proje BilgeAdam

{

Entity.Filmfilm=newEntity.Film();

film.FilmId=(int)dr[“FilmId”];

film.Adi=(string)dr[“Adi”];

film.DilId=(int)dr[“DilId”];

film.Ozet=(string)dr[“Ozet”];

film.YapimciFirmaId=(int)dr[“YapimciFirmaId”];

film.Sure=(int)dr[“Sure”];

film.Yil=(int)dr[“Yil”];

film.Afis=(string)dr[“Afis”];

film.SatistaMi=(bool)dr[“SatistaMi”];

film.OnaylandiMi=(bool)dr[“OnaylandiMi”];

film.TedarikEdilenFirmaId=(int)dr[“TeminEdilenTedarikciId”];

filmListesi.Add(film);

}

}

catch(Exceptionex)

{

throwex;

}

finally

{

con.Close();

}

returnfilmListesi;

}

}

}

Liste 3.7: Facade.Film.cs class yapısı.

Solution’a windows uygulaması ile web uygulamasının haberleşmesini sağlayacak olan web ser-vis projesini oluşturun. DvdDukkani.WebServices isminde bir Web Service projesi ekleyin. Ek-lenen web servis projesi içerisinde kullanılacağı için DvdDukkani.Entity ve DvdDukkani.Facade projelerini referans olarak ekleyin. Proje içerisindeki Service.asmx.cs kod dosyasına Liste 3. 8 ile . arasındaki metotları yazın. Client’ların güvenli bir şekilde uygulama giriş yapmalarını ve oturum açmalarını sağlamak için Soap Header ekleyin.

publicclassSecurity:SoapHeader

{

privatestring_KullaniciKodu;

181DVDDukkani.com

Page 186: Yazilim Proje BilgeAdam

publicstringKullaniciKodu

{

get{return_KullaniciKodu;}

set{_KullaniciKodu=value;}

}

privatestring_Sifre;

publicstringSifre

{

get{return_Sifre;}

set{_Sifre=value;}

}

}

Liste 3.8: SoapHeader sınıfından türetilmiş güvenlik sınıfı.

Tanımlanan soap header bilgisine göre web servisi üzerinde kullanıcıların giriş yapmalarını sağ-layın.İlk önce DvdServisi.Facade projesi içerisindeki Tedarikci sınıfına Login isminde bir metod ekleyin.

publicintLogin(stringkullaniciKodu,stringsifre)

{

SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

SqlCommandcmd=newSqlCommand(“TedarikciLogin”,con);

cmd.CommandType=System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(“@KullaniciKodu”,kullaniciKodu);

cmd.Parameters.AddWithValue(“@Sifre”,sifre);

inti=0;

try

{

con.Open();

i=Convert.ToInt32(cmd.ExecuteScalar());

}

catch(Exception)

{

i=-1;

}

finally

{

182 Proje 3

Page 187: Yazilim Proje BilgeAdam

con.Close();

}

returni;

}

Daha sonra web servisi içerisinde giriş işlemini yapacak metodu oluşturun.

publicSecuritybaslik;

[WebMethod(true)]

[SoapHeader(“baslik”)]

publicintLogin()

{

Tedarikcitedarikci=newTedarikci();

inti=0;

i=tedarikci.Login(baslik.KullaniciKodu,baslik.Sifre);

if(i>0)

Session[“Anahtar”]=Guid.NewGuid();

returni;

}

Liste 3.9: Kullanıcıların giriş yapmasını sağlayan Login metodu.

Eğer başlık bilgisi doğru ise ve kullanıcı başarılı bir şekilde bilgileri girmiş ise Anahtar isminde bir Session oluşturuluyor. Eğer bu session bilgisi boş değil ise diğer metotlar çalışacak, boşsa yani null değer döndürürse işlem yapılmayacak. Film eklemek için veya diğer bilgileri sağlamak için Liste 3.10 ile Liste 3.24 arasındaki metotları servis üzerine yazın.

[WebMethod(true,CacheDuration=360)]

publicDvdDukkani.Entity.FilmOyuncu[]FilmOyuncuListesi()

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.Facade.FilmOyuncu.FilmOyuncuListesi().ToArray();

}

else

returnnull;

}

Liste 3.10: Hangi filmde hangi oyuncu oynuyor bilgisini veren metod.

183DVDDukkani.com

Page 188: Yazilim Proje BilgeAdam

[WebMethod(true,CacheDuration=360)]

publicDvdDukkani.Entity.Kategori[]FilmKategoriListesi()

{

if(Session[“Anahtar”]!=null)

{

returnKategori.KategoriListesi().ToArray();

}

else

returnnull;

}

Liste 3.11: Filmin hangi kategorilerde olduğunun bilgisini veren metod.

[WebMethod(true,CacheDuration=360)]

publicDataSetYapimciFirmaListesi()

{

if(Session[“Anahtar”]!=null)

{

YapimciFirmayapimciFirma=newYapimciFirma();

returnyapimciFirma.YapimciFirmaListesi();

}

else

returnnull;

}

Liste 3.12: Yapımcı Firma listesini döndüren metod.

[WebMethod(true,CacheDuration=360)]

publicDvdDukkani.Entity.Dil[]DilListesi()

{

if(Session[“Anahtar”]!=null)

{

returnDil.DilListesi().ToArray();

}

else

returnnull;

}

Liste 3.13: Mevcut dilleri döndüren metod.

[WebMethod(true,CacheDuration=360)]

publicDvdDukkani.Entity.Yonetmen[]YonetmenListesi()

{

if(Session[“Anahtar”]!=null)

184 Proje 3

Page 189: Yazilim Proje BilgeAdam

{

returnDvdDukkani.DataLayer.Yonetmen.YonetmenListesi().ToArray();

}

else

returnnull;

}

Liste 3.14: Yönetmenlerin listesini döndüren metod.

[WebMethod(true,CacheDuration=360)]

publicDvdDukkani.Entity.Oyuncu[]OyuncuListesi()

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.DataLayer.Oyuncu.OyuncuListesi().ToArray();

}

else

returnnull;

}

Liste 3.15: Oyuncu listesini döndüren metod.

[WebMethod(true,MessageName=”TumSiparisler”)]

publicDvdDukkani.Entity.Sepet[]SepetListesi()

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.DataLayer.Sepet.SepetListesi().ToArray();

}

else

returnnull;

}

Liste 3.16: Sepet listesini döndüren metod.

[WebMethod(true,MessageName=”SiparislerDurumaGore”)]

publicDvdDukkani.Entity.Sepet[]SepetListesi(bytedurum)

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.DataLayer.Sepet.SepetListesi(durum).ToArray();

185DVDDukkani.com

Page 190: Yazilim Proje BilgeAdam

}

else

returnnull;

}

Liste 3.17: Siparişlerin durumuna göre Sepet dizisi döndüren metod.

[WebMethod(true,MessageName=“TumTalepler”)]

publicDvdDukkani.Entity.TedarikciIstek[]TalepListesi(inttedarikciId)

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.DataLayer.TedarikciIstek.TalepGetir(tedarikciId).ToArray();

}

else

returnnull;

}

Liste 3.18: Tüm talepleri döndüren metod.

[WebMethod(true,MessageName=“TaleplerDurumaGore”)]

publicDvdDukkani.Entity.TedarikciIstek[]TalepListesi(intdurum,inttedarikciId)

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.DataLayer.TedarikciIstek.TalepGetir(tedarikciId,durum).ToArray();

}

else

returnnull;

}

Liste 3.19: Talep durumuna göre istek listesini döndüren metod

[WebMethod(true)]

publicboolTalepGuncelle(DvdDukkani.Entity.TedarikciIstektalep)

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.DataLayer.TedarikciIstek.TalepGuncelle(talep);

}

else

186 Proje 3

Page 191: Yazilim Proje BilgeAdam

returnfalse;

}

Liste 3.20: Talep güncelleyen metod.

[WebMethod(true)]

publicvoidTedarikciGuncelle(DvdDukkani.Entity.Tedarikcit)

{

if(Session[“Anahtar”]!=null)

{

DvdDukkani.DataLayer.Tedarikci.Guncelle(t);

}

}

Liste 3.21: Tedarikçi bilgilerini güncelleyen metod.

[WebMethod(true)]

publicDvdDukkani.Entity.TedarikciTedarikciBul(inttedarikciId)

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.DataLayer.Tedarikci.TedarikciBul(tedarikciId);

}

else

returnnull;

}

Liste 3.22: Tedarikçi bilgilerini döndüren metod.

[WebMethod(true,CacheDuration=360)]

publicDvdDukkani.Entity.Ilce[]IlceListesi()

{

if(Session[“Anahtar”]!=null)

{

returnDvdDukkani.DataLayer.Ilce.IlceGetir().ToArray();

}

else

returnnull;

}

Liste 3.23: İlçe listesini döndüren metod.

Film eklemek için gereken metod biraz karışıktır. Bir film birden fazla kategoride bulunabilir, bir-den fazla oyuncu, yönetmen ve altyazı seçeneği olabilir. Yapılacak işlem ilk önce film eklemek

187DVDDukkani.com

Page 192: Yazilim Proje BilgeAdam

daha sonra o filmin identity bilgisini alıp ona göre kategori, yönetmen, oyuncu vs. gerekli bilgileri eklemek. Bunun yanı sıra eklenecek afişlerin isimlerini değiştirip sabit bir uzantı vermek afiş gös-terirken ve yüklerken oluşabilecek hataları önleyecek. Liste 3.24’de belirtildiği gibi FilmEkleme metodunu oluşturun.

[WebMethod(true,CacheDuration=360)]

publicvoidFilmEkle(DvdDukkani.Entity.Filmfilm,byte[]afis,List<DvdDukkani.Entity.Dil>altyazilar,List<DvdDukkani.Entity.FilmOyuncu>oyuncuListesi,List<DvdDukkani.Entity.Yonetmen>yonetmenListesi,List<DvdDukkani.Entity.Kategori>kategoriListesi,List<DvdDukkani.Entity.FilmTipUcret>filmTipUcretleri)

{

if(Session[“Anahtar”]!=null)

{

booluploadDurumu=false;

GuidafisAdi=Guid.NewGuid();

//Afis’igonder.

if(afis.Length==0)

{

// eğer afis dizisi boş ise

film.Afis=“AfisYok.afis”;

uploadDurumu=true;

}

else

{

//gelenafisifilestreamileyaz

try

{

film.Afis=afisAdi.ToString()+“.afis”;

FileStreamfs=newFileStream(ConfigurationManager.AppSettings[“AfisUploadKlasor”]+film.Afis,FileMode.Create);

fs.Write(afis,0,afis.Length);

fs.Flush();

fs.Close();

uploadDurumu=true;

}

catch(Exceptionex)

{

//throwex;

uploadDurumu=false;

}

}

intfilmEklemeSonuc=0;

if(uploadDurumu)

188 Proje 3

Page 193: Yazilim Proje BilgeAdam

filmEklemeSonuc=DvdDukkani.DataLayer.Film.FilmEkle(film);

if(filmEklemeSonuc>0)

{

//altyazilariekle

foreach(DvdDukkani.Entity.Dildilinaltyazilar)

{

DvdDukkani.Entity.Altyazialtyazi=newDvdDukkani.Entity.Altyazi();

altyazi.FilmId=filmEklemeSonuc;

altyazi.DilId=dil.DilId;

DvdDukkani.DataLayer.Altyazi.AltyaziEkle(altyazi);

}

// Oyuncuları Ekle

foreach(DvdDukkani.Entity.FilmOyuncuoyuncuinoyuncuListesi)

{

oyuncu.FilmId=filmEklemeSonuc;

DvdDukkani.DataLayer.FilmOyuncu.FilmOyuncularEkle(oyuncu);

}

foreach(DvdDukkani.Entity.YonetmenyonetmeninyonetmenListesi)

{

DvdDukkani.Entity.FilmYonetmenifilmYonetmeni=newDvdDukkani.Entity.FilmYonetmeni();

filmYonetmeni.FilmId=filmEklemeSonuc;

filmYonetmeni.YonetmenId=yonetmen.YonetmenId;

DvdDukkani.DataLayer.FilmYonetmen.FilmYonetmenEkle(filmYonetmeni);

}

foreach(DvdDukkani.Entity.KategorikategoriinkategoriListesi)

{

DvdDukkani.Entity.FilmKategorifilmKategori=newDvdDukkani.Entity.FilmKategori();

189DVDDukkani.com

Page 194: Yazilim Proje BilgeAdam

filmKategori.KategoriId=kategori.KategoriId;

filmKategori.FilmId=filmEklemeSonuc;

DvdDukkani.DataLayer.FilmKategori.FilmKategoriEkle(filmKategori);

}

foreach(DvdDukkani.Entity.FilmTipUcretucretinfilmTipUcretleri)

{

ucret.FilmId=filmEklemeSonuc;

DvdDukkani.DataLayer.FilmTipUcret.FilmTipUcretEkle(ucret);

}

}

}

}

Liste 3.24: FilmEkleme metodu.

Şekil 3.22: Web referansı eklemek.

190 Proje 3

Page 195: Yazilim Proje BilgeAdam

Web servis üzerinde kullanılacak metotları tamamladıktan sonra film tedarikçinin kullanacağı Windows uygulamasını oluşturun. Solution’a DvdDukkani.TedarikciWinUI isminde bir Windows uygulaması ekleyin. Standart olarak eklenen Form1.cs Windows Form’unu silin. FrmMain ismin-de bir Windows Form ekleyin. Bu form uygulamanın başlangıç formu olacak. Uygulama üzerinde sağ tıklayın Add Web Reference menüsüne tıklayarak web servisi için referans ekleyin ve oluş-turduğunuz Web Servisini seçin. Servis ismi olarak DvdServis girin.

DvdDukkani.TedarikciWinUI projesine FrmLogin isminde Windows Form ekleyin. Bu form sa-yesinde tedarikçiler uygulamada oturum açıp işlem yapabilecek. FrmLogin formu üzerine Tablo 3.1’de verilen kontrolleri ekleyin ve özellikleri yapılandırın.

Tablo Tablo 3.1’de verilen kontroller eklendikten sonra tasarım görünümü Şekil 3.23’deki görü-nümde olacak.

Uygulamanın başlangıç formu yani ana formu FrmMain formu olacağı için web servisi kullanmak için oluşturulması gereken nesne FrmMain üzerinde olmalı. Session kullanıldığı için tek bir nesne üretilmeli ve o nesne üzerinden işlem yapılmalı. Eğer her kullanılmak istendiğinde farklı bir nesne oluşturursanız veya nesnenin yeni bir örneğini oluşturursanız servis üzerindeki session bilgisi değişecek ve kullanıcı oturum açmamış gibi işlem yapacak.FrmMain formunda static bir değişken oluşturun.

publicstaticDvdServis.Serviceservis=newDvdDukkani.TedarikciWinUI.DvdServis.Service();

Liste 3.25: FrmMain formundaki static servis nesnesi.

Bir servis üzerinde session kullanabilmek için o servisi kullanacak olan Windows uygulaması CookieContainer nesnesine ihtiyaç duyar. Gerekli CookieContainer’ı oluşturun ve FrmLogin for-munu açtırın.

privatevoidFrmMain_Load(objectsender,EventArgse)

{

servis.CookieContainer=newSystem.Net.CookieContainer();

Tablo 3.1: FrmLogin Formu Kontrol ve ÖzellikleriKontrol Özellik Değer

Label Text Kullanıcı Kodu :Label Text Şifre :

TextBox Name txtKullaniciKodu

TextBox Name txtSifre

Button Text GirişName btnGiris

Şekil 3.23: FrmLogin tasarım görünümü.

191DVDDukkani.com

Page 196: Yazilim Proje BilgeAdam

FrmLoginlogin=newFrmLogin();

this.Hide();

if(login.ShowDialog()==DialogResult.OK)

{

this.Show();

}

else

Application.Exit();

}

Liste 3.26: FrmMain Form_Load olayı.

FrmLogin formunu açın. Bu form üzerinde giriş isteğinde bulunulduğu zaman gerekli soap header bilgileri ile birlikte servisin Login() metodunu asenkron olarak çağırın ve sonucu yakalayın. Frm-Main formu içerisine TedarikciId isminde static bir değişken tanımlayın. Bu değişken giriş yapan tedarikçinin ID bilgisini tutacak.

internalstaticintTedarikciId=0;

Daha sonra giriş işlemini yaptırın.

privatevoidbtnGiris_Click(objectsender,EventArgse)

{

this.Cursor=Cursors.WaitCursor;

DvdServis.Securityguvenlik=newDvdDukkani.TedarikciWinUI.DvdServis.Security();

guvenlik.KullaniciKodu=txtKullaniciKodu.Text;

guvenlik.Sifre=txtSifre.Text;

FrmMain.servis.SecurityValue=guvenlik;

FrmMain.servis.LoginCompleted+=newDvdDukkani.TedarikciWinUI.DvdServis.LoginCompletedEventHandler(servis_LoginCompleted);

FrmMain.servis.LoginAsync();

}

voidservis_LoginCompleted(objectsender,DvdDukkani.TedarikciWinUI.DvdServis.LoginCompletedEventArgse)

{

this.Cursor=Cursors.Default;

if(e.Result>0)

{

FrmMain.TedarikciId=e.Result;

this.DialogResult=DialogResult.OK;

192 Proje 3

Page 197: Yazilim Proje BilgeAdam

}

else

{

MessageBox.Show(“Yanlış Giriş”);

}

}

Liste 3.27: FrmLogin btnGiris button kontrolü Click olayı ve Login metodu.

FrmMain formuna geçip formu Tablo 3. 2‘deki şekilde yapılandırın.

FrmMain üzerine MenuStrip kontrolü ekleyin. Eklenen menüye Tablo 3.3‘deki menü elemanlarını ekleyin.

Gerekli özellikleri ayarladıktan sonra FrmMain formu görüntüsü ‘deki şekilde olmaktadır.

Uygulama içerisinden yeni film ekleyebilmek için FrmYeniFilm isminde form ekleyin. Bu form tedarikçinin yeni bir film eklemesini sağlayacak. Yalnız unutmamak gerekir ki bir film birden fazla kategoride bulunabilir, birden fazla oyuncusu, yönetmen ve, altyazı seçeneği olabilir. FrmYeni-Film formu üzerine Tablo 3.4‘deki belirtilen kontrolleri ekleyin ve özellikleri yapılandırın.

Tablo 3.2: FrmMain Formu Özellikleri ve DeğerleriÖzellik Değer

IsMdiContainer TrueText Tedarikçi İşlem

StartPosition CenterScreen

WindowState Maximized

Tablo 3.3: FrmMain Formu Üzerindeki Menü ElemanlarıÖzellik Değer

Text SiparişlerText Yeni Film Tanımla

Text Film GünceleText Bilgilerim

Şekil 3.24: FrmMain formu tasarım görünümü.

193DVDDukkani.com

Page 198: Yazilim Proje BilgeAdam

Gerekli kontroller eklendikten sonra FrmYeniFilm formu Şekil 3.25‘deki gibi olacak.

Tablo 3.4: FrmYeniFilm Formu Üzerindeki Kontroller ve ÖzellikleriKontrol Özellik Değer

Label Text Adı : Label Text Dili :

Label Text Yapımcı Firma :

Label Text Süre :

Label Text Yıl :

Label Text Afiş

TextBox Name txtAdi

TextBox Name txtSure

TextBox Name txtYil

Combobox Name cmbDili

Combobox Name cmbYapimciFirma

TextBox Name txtAciklama

Multiline True

TextBox Name txtAfis

Button Name btnGözat

Text Gözat

Button Name btnOyuncuEkle

Text Oyuncu Ekle

Button Name btnYonetmenEkle

Text Yönetmen Ekle

Button Name btnKategori

Text Kategori Ekle

Button Name btnAltYaziEkle

Text Altyazı Ekle

Button Name btnTurler

Text Türler ve Ücretler

Button Name btnFilmEkle

Text Film EkleOpenFileDialog

Şekil 3.25: FrmYeniFilm Windows Form’u tasarım görünümü.

194 Proje 3

Page 199: Yazilim Proje BilgeAdam

Bir film eklerken, oyuncuları, yönetmenleri, kategorileri seçileceği için çeşitli button kontolleri ek-leyerek arayüz tasarımını yaptınız. Seçilen filme gerekli bilgileri eklemek için ilgili formları yapın. Yalnız bu form kapatılmadan işlem yapılacağı için FrmYeniFilm formuna static değişkenleri oluş-turun (Liste 3.28). Eklenecek olan bu listeler filme eklenecek ek bilgileri tutacak.

publicstaticList<DvdServis.Yonetmen>YonetmenListesi=newList<DvdServis.Yonetmen>();

publicstaticList<DvdServis.FilmOyuncu>OyuncuListesi=newList<DvdServis.FilmOyuncu>();

publicstaticList<DvdServis.Kategori>KategoriListesi=newList<DvdServis.Kategori>();

publicstaticList<DvdServis.Dil>AltYaziListesi=newList<DvdServis.Dil>();

publicstaticList<DvdServis.FilmTipUcret>filmTipUcretListesi=newList<DvdDukkani.TedarikciWinUI.DvdServis.FilmTipUcret>();

Liste 3.28: FrmYeniFilm static değişkenleri.

Gerekli listeler hazırlandıktan sonra form üzerinde veritabanından gelecek olan verileri listeleyin. Bu verilerden kasıt dil bilgileri ve yapımcı firma bilgileri. Bu verileri çekmeden önce oluşturulan listeleri temizleyin. Bunun sebebi ise static değişkenler ile çalışmaktır.

privatevoidFrmYeniFilm_Load(objectsender,EventArgse)

{

YonetmenListesi.Clear();

OyuncuListesi.Clear();

KategoriListesi.Clear();

AltYaziListesi.Clear();

FilmTipUcretListesi.Clear();

CheckForIllegalCrossThreadCalls=false;

Threadthread=newThread(newThreadStart(Calistir));

thread.Start();

}

voidCalistir()

{

cmbYapimciFirma.DisplayMember=“Adi”;

cmbYapimciFirma.ValueMember=“FirmaId”;

cmbYapimciFirma.DataSource=FrmMain.servis.YapimciFirmaListesi().Tables[0];

cmbDili.DisplayMember=“Adi”;

cmbDili.ValueMember=“DilId”;

cmbDili.DataSource=FrmMain.servis.DilListesi();

}

Liste 3.29: FrmYeniFilm_Load olayı ve verileri bağlama.

195DVDDukkani.com

Page 200: Yazilim Proje BilgeAdam

Burada verileri thread ile çağırmanın amacı , web servisinden asenkron olarak aynı anda birden fazla metod çağıramamaktır. Eklenen button kontrollerinin bazılarının Click olaylarını hazırlayın.

privatevoidbtnYonetmenEkle_Click(objectsender,EventArgse)

{

FrmYonetmenEklefrm=newFrmYonetmenEkle();

frm.ShowDialog();

}

privatevoidbtnKategori_Click(objectsender,EventArgse)

{

FrmKategoriEklefrm=newFrmKategoriEkle();

frm.ShowDialog();

}

privatevoidbtnAltyaziEkle_Click(objectsender,EventArgse)

{

FrmAltYaziEklefrm=newFrmAltYaziEkle();

frm.ShowDialog();

}

privatevoidbtnGozat_Click(objectsender,EventArgse)

{

if(openFileDialog1.ShowDialog()==DialogResult.OK)

{

txtAfis.Text=openFileDialog1.FileName;

}

}

privatevoidbtnTurler_Click(objectsender,EventArgse)

{

FrmCdTurUcretfrm=newFrmCdTurUcret();

frm.ShowDialog();

}

privatevoidbtnOyuncuEkle_Click(objectsender,EventArgse)

{

FrmOyuncuEklefrm=newFrmOyuncuEkle();

frm.ShowDialog();

}

Liste 3.30: FrmYeniFilm formu üzerindeki button kontrolleri Click olayları.

Liste 3.30’da belirtilen olaylarda farklı formlar açılmak istendi. Bu formları DvdDukkani.Tedarik-ciWinUI proje içerisine oluşturun. Eklenecek formlar FrmOyuncuEkle, FrmCdTurUcret, FrmAlt-

196 Proje 3

Page 201: Yazilim Proje BilgeAdam

yaziEkle, FrmYonetmenEkle ve FrmKategoriEkle formları.Eklenen FrmKategori formunu açın. Tablo 3.5’de belirtilen kontolleri forma ekleyin.

Eklenen kontrolleri Şekil 3.26‘daki gibi form üzerine yerleştirin. Bu form sayesinde filmin hangi kategoriler altında duracağı belirtilecek. Dikkat edilmesi gereken nokta eklenmiş bir kategoriyi bir daha ekleyememektir.

Kateogori listesini doldurun. Gerekli kontrolleri yaparak işlemi tamamlayın. Gerekli kodlar Liste 3.31‘de verilmiştir.

privatevoidFrmKategoriEkle_Load(objectsender,EventArgse)

{

ListeGuncelle();

FrmMain.servis.FilmKategoriListesiCompleted+=newFilmKategoriListesiCompletedEventHandler(servis_FilmKategoriListesiCompleted);

FrmMain.servis.FilmKategoriListesiAsync();

}

voidservis_FilmKategoriListesiCompleted(objectsender,FilmKategoriListesiCompletedEventArgse)

{

Tablo 3.5: FrmKategori Formu Kontrol Listesi ve ÖzellikleriKontrol Özellik Değer

Label Text KategoriButton Text Ekle

Name btnEkle

Button Text Kaldır

Name btnKaldir

Combobox Name cmbKategori

ListBox Name lstKategoriler

Button Name btnKapatText Kapat

Şekil 3.26: FrmKategori formu tasarım görünümü.

197DVDDukkani.com

Page 202: Yazilim Proje BilgeAdam

cmbKategori.DisplayMember=“Adi”;

cmbKategori.ValueMember=“KategoriId”;

cmbKategori.DataSource=e.Result;

}

privatevoidbtnEkle_Click(objectsender,EventArgse)

{

boolvarmi=false;

foreach(DvdServis.KategorikinFrmYeniFilm.KategoriListesi)

{

if(k.Adi==(cmbKategori.SelectedItemasDvdServis.Kategori).Adi)

{

varmi=true;

break;

}

}

if(!varmi)

{

FrmYeniFilm.KategoriListesi.Add((DvdServis.Kategori)cmbKategori.SelectedItem);

ListeGuncelle();

}

}

voidListeGuncelle()

{

lstKategoriler.Items.Clear();

foreach(DvdServis.KategorikinFrmYeniFilm.KategoriListesi)

{

lstKategoriler.Items.Add(k);

}

}

privatevoidbtnKaldir_Click(objectsender,EventArgse)

{

if(lstKategoriler.SelectedItems.Count==0)

{

MessageBox.Show(“Kalırılacak kategoriyi listeden seçin”);

198 Proje 3

Page 203: Yazilim Proje BilgeAdam

return;

}

FrmYeniFilm.KategoriListesi.Remove((DvdServis.Kategori)lstKategoriler.SelectedItem);

ListeGuncelle();

}

Liste 3.31: FrmKategori formu gerekli metodlar.

FrmOyuncuEkle, FrmCdTurUcret, FrmAltYaziEkle ve FrmYonetmenEkle formlarını aynı şekilde yapılandırın. FrmCdTurUcret formunda dikkat edilmesi gereken cd türlerinin veritabanından gel-meyeceği, elle ekleneceğidir. Örneğin CD, DVD ve HD. Formları yaptıktan sonra FrmFilmEkle formunu açın. Yapılacak en son işlem filmi eklemek. Filmi eklemeden önce gerekli alanların boş olup olmadığını kontrol edin.

privateboolKontrol()

{

boolvarmi=false;

if(FilmTipUcretListesi.Count<0)

{

MessageBox.Show(“Satışa çıkacak Cd Tip ve ÜcretleriBelirtin”);

}

foreach(Controlclinthis.Controls)

{

if(clisTextBox)

{

if(string.IsNullOrEmpty(cl.Text))

{

cl.BackColor=Color.Red;

varmi=true;

}

}

}

return!varmi;

}

privatevoidbtnFilmEkle_Click(objectsender,EventArgse)

{

if(Kontrol())

{

//afis’ibyte[]çevir.

FileInfoafis=newFileInfo(txtAfis.Text);

199DVDDukkani.com

Page 204: Yazilim Proje BilgeAdam

byte[]dosya=newbyte[Convert.ToInt32(afis.Length)];

FileStreamakis=File.OpenRead(txtAfis.Text);

akis.Read(dosya,0,dosya.Length);

akis.Close();

DvdServis.Filmfilm=newDvdDukkani.TedarikciWinUI.DvdServis.Film();

film.Adi=txtAdi.Text;

film.DilId=Convert.ToInt32(cmbDili.SelectedValue);

film.Ozet=txtAciklama.Text;

film.Sure=Convert.ToInt32(txtSure.Text);

film.YapimciFirmaId=Convert.ToInt32(cmbYapimciFirma.SelectedValue);

film.Yil=Convert.ToInt32(txtYil.Text);

//film.TedarikEdilenFirmaId=FrmMain.

FrmMain.servis.FilmEkleCompleted+=newDvdDukkani.TedarikciWinUI.DvdServis.FilmEkleCompletedEventHandler(servis_FilmEkleCompleted);

FrmMain.servis.FilmEkleAsync(film,dosya,AltYaziListesi.ToArray(),OyuncuListesi.ToArray(),YonetmenListesi.ToArray(),KategoriListesi.ToArray(),FilmTipUcretListesi.ToArray());

}

}

voidservis_FilmEkleCompleted(objectsender,AsyncCompletedEventArgse)

{

MessageBox.Show(“FilmEklendi”);

}

Liste 3.32: Film ekleme işlemi.

Tedarikçi firmanın kendi bilgilerini güncellemesini sağlamak için FrmBilgilerim isminde bir Win-dows Form ekleyin.

Uygulama: Şekil 3.27’de ekran çıktısı verilen bilgilerim formunu yapılandırın ve tedarikçinin bilgi-lerini güncellemesini sağlayın.

200 Proje 3

Page 205: Yazilim Proje BilgeAdam

Site sahibinin tedarikçiden isteyeceği siparişleri, tedarikçinin yönetebilmesini sağlamak için uygu-lamaya FrmGelenSiparisler formu ekleyin. Bu form sayesinde tedarikçi, gelen ve giden siparişleri-ni görebilecek, ek açıklama ekleyebilecek. Eklenen form üzerine Tablo 3.6’da belirtilen kontrolleri ekleyin ve yapılandırın.

Gerekli kontrolleri ekledikten sonra tasarımı Şekil 3.28’deki gibi yapın.

Şekil 3.27: FrmBilgilerim formu tasarım görünümü.

Tablo 3.6: FrmGelenSiparisler Formu Kontrol ListesiKontrol Özellik Değer

GroupBox Text Sipariş DurumuRadioButton Text Cevaplananlar

Name rCevaplananlar

RadioButton Text Cevapsızlar

Name rCevapsizlar

RadioButton Text Tümü

Name cTumu

DataGridView Name dgSonuc

GroupBox Text Güncellemeler

Label Text Durum

Label Text Açıklama

RadioButton Text Teslim Edildi

Name rbAktif

RadioButton Text Teslim Edilmedi

Name rbPasif

TextBox Name txtAciklama

Button Name

201DVDDukkani.com

Page 206: Yazilim Proje BilgeAdam

Web servisi üzerinde gerekli işlemleri yapan metodları çağırın. Gelen siparişlerin yönetimini varsa ek not düşülmesini sağlayın. Gereken kodları Liste 3.33’deki gibi yazın.

privatevoidFrmGelenSiparisler_Load(objectsender,EventArgse)

{

this.TalepDoldur();

}

DvdServis.TedarikciIstek[]talepler=null;

voidTalepDoldur()

{

talepler=null;

if(rCevaplananlar.Checked)

talepler=FrmMain.servis.TalepListesi(1,FrmMain.TedarikciId);

elseif(rCevapsizlar.Checked)

talepler=FrmMain.servis.TalepListesi(2,FrmMain.TedarikciId);

else

talepler=FrmMain.servis.TalepListesi(FrmMain.TedarikciId);

dgSonuc.DataSource=talepler;

this.Listele();

}

privatevoidrCevapsizlar_CheckedChanged(objectsender,EventArgse)

{

this.TalepDoldur();

Şekil 3.28: FrmGelenSiparisler tasarım görünümü.

202 Proje 3

Page 207: Yazilim Proje BilgeAdam

}

privatevoidrCevaplananlar_CheckedChanged(objectsender,EventArgse)

{

this.TalepDoldur();

}

privatevoidrTumu_CheckedChanged(objectsender,EventArgse)

{

this.TalepDoldur();

}

privatevoidbtnGuncelle_Click(objectsender,EventArgse)

{

if(dgSonuc.SelectedRows.Count>0)

{

DvdServis.TedarikciIstektalep=talepler[dgSonuc.SelectedRows[0].Index];

talep.EkNot=txtAciklama.Text;

talep.GerceklestiMi=rbAktif.Checked;

boolsonuc=FrmMain.servis.TalepGuncelle(talep);

if(!sonuc)

{

MessageBox.Show(“Kayıt tamamlanamadı”);

}

else

{

this.TalepDoldur();

MessageBox.Show(“Kayıt başarı ile tamamlandı”);

}

}

else

{

MessageBox.Show(“Güncellemeyapabilmekiçinbirtalepseçmelisiniz”);

}

}

203DVDDukkani.com

Page 208: Yazilim Proje BilgeAdam

privatevoiddgSonuc_SelectionChanged(objectsender,EventArgse)

{

Listele();

}

privatevoidListele()

{

if(dgSonuc.SelectedRows.Count>0)

{

DvdServis.TedarikciIstektalep=talepler[dgSonuc.SelectedRows[0].Index];

txtAciklama.Text=talep.EkNot;

if(talep.GerceklestiMi)

rbAktif.Checked=true;

else

rbPasif.Checked=true;

}

}

Liste 3.33: FrmGelenSiparisler formu metodları.

Tedarikçi firmanın kullanacağı arayüz tamamlandıktan sonra Solution’a DvdDukkani.WebUI is-minde web uygulaması ekleyin. Uygulama içerisinde kullanılacak olan flash animasyonları için http://www.flash-control.net/ adresinden FlashControl bileşenini indirip toolbox’a ekleyin.

Web uygulamasında stil kullanmak için Style is-minde bir klasör oluşturun. İçine size kitap ile birlikte verilen uygulamadan stil.css dosyasını ekleyin. Web uygulamasının tasarımının temelini

atmak için uygulamaya master page ekleyin ve ismini ana.master verin. Eklenen ana.master say-fasının tasarımını Liste 3.34’deki şekilde yapın.

<%@MasterLanguage=”C#”AutoEventWireup=”true”CodeFile=”ana.master.cs”Inherits=”ana”%>

<%@RegisterAssembly=”FlashControl”Namespace=”Bewise.Web.UI.WebControls”TagPrefix=”Bewise”%>

<!DOCTYPEhtmlPUBLIC“-//W3C//DTDXHTML1.0Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<htmlxmlns=”http://www.w3.org/1999/xhtml”xml:lang=”en”lang=”en”>

<head>

<metahttp-equiv=”Content-Type”content=”text/html;charset=iso-8859-1”/>

<title>Dvd Dükkanı - [ Bizde yoksa daha o film çekilmemiştir ]</title>

<linkhref=”style/stil.css”rel=”stylesheet”type=”text/css”/>

</head>

Bu uygulamada kullanılacak olan tasarım Microsoft’tun ücretsiz dağıttığı taslaklardan alınmıştır (http://msdn2.microsoft.com/en-us/asp.net/aa336613.aspx).

204 Proje 3

Page 209: Yazilim Proje BilgeAdam

<body>

<formid=”masterForm”runat=”server”>

<asp:ScriptManagerID=”ScriptManager1”runat=”server”>

</asp:ScriptManager>

<divid=”mainnav-container”>

<divid=”mainnav”>

<ul>

<li><ahref=”default.aspx”>AnaSayfa</a></li>

</ul>

</div>

<divid=”mainnav-side”>

<ul>

<li>

<asp:HyperLinkID=”hlYeniUye”runat=”server”NavigateUrl=”~/YeniUye.aspx”>ÜyeOlun</asp:HyperLink>

</li>

<li>

<asp:LinkButtonID=”lnkCikis”runat=”server” OnClick=”lnkCikis_Click”>Çıkış</asp:LinkButton>

</li>

<li>

<asp:LinkButtonID=”lnkDurum”runat=”server”OnClick=”lnkDurum_Click”>LinkButton</asp:LinkButton></li>

</ul>

</div>

<divclass=”clear”>

</div>

</div>

<divid=”header”>

<ahref=”#”title=”Sitenamehomepage”>Dvd</a>Dükkan&#305;<divid=”slogan”>

E&#287;erbizdebirfilmyokisedahaofilmçekilmemi&#351;tir</div>

</div>

<divid=”breadcrumb-container”>

<divid=”breadcrumb”>

<asp:SiteMapPathID=”SiteMapPath1”runat=”server”Font-Names=”Verdana”Font-Size=”0.8em”

PathSeparator=”:“>

<PathSeparatorStyleFont-Bold=”True”ForeColor=”#990000”/>

<CurrentNodeStyleForeColor=”#333333”/>

205DVDDukkani.com

Page 210: Yazilim Proje BilgeAdam

<NodeStyleFont-Bold=”True”ForeColor=”#990000”/>

<RootNodeStyleFont-Bold=”True”ForeColor=”#FF8000”/>

</asp:SiteMapPath>

</div>

<divid=”breadcrumb-side”style=”width:219px”>

<fieldset>

<legend>Ara</legend>

<inputonfocus=”this.select()”onblur=”if(this.value==’’){this.value=’entersearchphrase’}”

id=”search”name=”search”type=”text”class=”searchbox”accesskey=”4”size=”20”/>&nbsp;

<inputclass=”button-search”name=”Search”type=”button”value=”Ara”/>

</fieldset>

</div>

<divclass=”clear”>

</div>

</div>

<divid=”content-container”>

<divid=”content-side”style=”left:0px;top:0px;”>

<ulclass=”link-list-vertical”>

<asp:RepeaterID=”Repeater1”runat=”server”DataSourceID=”SqlDataSource1”>

<ItemTemplate>

<li><ahref=’kategoridetay.aspx?Kategori=<%#DataBinder.Eval(Container.DataItem,“KategoriId”)%>’>

<%#DataBinder.Eval(Container.DataItem,“Adi”)%>

</a></li>

</ItemTemplate>

</asp:Repeater>

<asp:SqlDataSourceID=”SqlDataSource1”runat=”server”ConnectionString=”<%$ConnectionStrings:DvdDukkaniConnectionString%>”

SelectCommand=”SELECT[KategoriId],[Adi]FROM[Kategoriler]ORDERBY[KategoriId]”>

</asp:SqlDataSource>

<asp:PanelID=”pnlSepet”runat=”server”>

<br/>

<br/>

206 Proje 3

Page 211: Yazilim Proje BilgeAdam

<asp:DataListID=”dlSepet”runat=”server”Font-Bold=”True”Font-Size=”X-Small”OnItemDataBound=”dlSepet_ItemDataBound”Width=”150px”BorderColor=”#E0E0E0”BorderStyle=”Solid”BorderWidth=”1px”>

<ItemTemplate>

<tablestyle=”width:100%”>

<tr>

<tdalign=”left”width=”200”>

<asp:LabelID=”lblFilm”runat=”server”Text=’<%#Eval(“FilmAdi”)%>’></asp:Label></td>

<tdalign=”right”width=”35”>

<asp:LabelID=”lblAdet”runat=”server”Text=’<%#Eval(“Adet”)%>’></asp:Label></td>

<tdalign=”right”width=”50”>

<asp:LabelID=”lblToplam”runat=”server”Text=’<%#Eval(“SatirToplam”,”{0:N}”)%>’></asp:Label></td>

</tr>

</table>

</ItemTemplate>

<HeaderTemplate>

<tablestyle=”width:100%”>

<tr>

<tdalign=”center”width=”200”>

Film</td>

<tdalign=”center”width=”35”>

Adet</td>

<tdalign=”center”width=”50”>

Fiyat</td>

</tr>

</table>

</HeaderTemplate>

<FooterTemplate>

<divstyle=”text-align:right”>

<tablestyle=”width:100%”>

<tr>

<tdstyle=”width:100%”>

207DVDDukkani.com

Page 212: Yazilim Proje BilgeAdam

<asp:LabelID=”Label1”runat=”server”Text=”Toplam:“></asp:Label>

<asp:LabelID=”lblToplam”runat=”server”Text=’<%#genelToplam%>’></asp:Label></td>

</tr>

</table>

</div>

<asp:LinkButtonID=”LinkButton1”runat=”server”OnClick=”LinkButton1_Click”>SepetiGöster</asp:LinkButton>

<br/>

<asp:LinkButtonID=”LinkButton2”runat=”server”OnClick=”LinkButton2_Click”>SepetiOnayla</asp:LinkButton>

</FooterTemplate>

</asp:DataList>

<asp:LabelID=”lblBosBilgi”runat=”server”Visible=”False”></asp:Label></asp:Panel>

</ul>

</div>

<divid=”content”>

<asp:ContentPlaceHolderID=”ContentPlaceHolder1”runat=”server”>

</asp:ContentPlaceHolder>

<divid=”footer”>

<p>

Copyright&copy;2007DvdDukkan&#305;</p>

</div>

</div>

<divid=”content-side-2”>

<p>

</p>

<p>

</p>

<p>

<bewise:flashcontrolid=”FlashControl1”runat=”server”height=”100px”

movieurl=”~/Resimler/Untitled-7.swf”width=”100px”></bewise:flashcontrol></p>

</div>

208 Proje 3

Page 213: Yazilim Proje BilgeAdam

</div>

</form>

</body>

</html>

Liste 3.34: ana.master dosyası html tasarımı.

Web uygulamalarınıza Entity ve Facade projelerini referans olarak ekleyin.Uygulama içerisindeki web.config dosyasına kullanılması gereken connection string için gerekli eklemeyi yapın.

<addname=”DvdDukkaniConStr”connectionString=”server=.;database=DvdDukkani;Integrated_Security=SSPI”/>

Yapılan tasarımın görsel çıktısı Şekil 3.29’da gösterilmektedir.

Sepete atılacak ürün bilgilerini tutabilmek için uygulamaya Urun isminde Class ekleyin. Eklenen Class’ın App_Code dosyasına eklenmesi hakkında bir uyarı alacaksınız. Uyarıyı onaylayıp de-vam edin.

usingSystem;

usingSystem.Data;

usingSystem.Configuration;

usingSystem.Web;

usingSystem.Web.Security;

usingSystem.Web.UI;

usingSystem.Web.UI.WebControls;

usingSystem.Web.UI.WebControls.WebParts;

usingSystem.Web.UI.HtmlControls;

publicclassUrun

{

publicUrun()

Şekil 3.29: ana.master dosyası tasarım görünümü.

209DVDDukkani.com

Page 214: Yazilim Proje BilgeAdam

{

}

privateint_FilmId;

publicintFilmId

{

get{return_FilmId;}

set{_FilmId=value;}

}

privatestring_FilmAdi;

publicstringFilmAdi

{

get{return_FilmAdi;}

set{_FilmAdi=value;}

}

privateint_Adet;

publicintAdet

{

get{return_Adet;}

set{_Adet=value;}

}

privatedecimal_Birimfiyat;

publicdecimalBirimfiyat

{

get{return_Birimfiyat;}

set{_Birimfiyat=value;}

}

privatedecimal_SatirToplam;

publicdecimalSatirToplam

{

get{return_SatirToplam;}

set{_SatirToplam=value;}

}

}

Liste 3.35: Urun.cs.

Eklenen master dosyasındaki yapılacak işlemleri Liste 3.36‘daki şekilde yazın.

protectedvoidPage_Load(objectsender,EventArgse)

{

this.PreRender+=newEventHandler(ana_PreRender);

210 Proje 3

Page 215: Yazilim Proje BilgeAdam

}

voidana_PreRender(objectsender,EventArgse)

{

if(HttpContext.Current.User.Identity.IsAuthenticated)

{

lnkDurum.Text=HttpContext.Current.User.Identity.Name;

if(Session[“sepet”]!=null)

{

List<Urun>sepet=Session[“sepet”]asList<Urun>;

lblBosBilgi.Visible=false;

dlSepet.DataSource=sepet;

dlSepet.DataBind();

}

else

{

lblBosBilgi.Visible=true;

lblBosBilgi.Text = “Sepetiniz Henüz Boş”;

}

lnkCikis.Visible=true;

}

else

{

lnkDurum.Text = “Giriş Yapın”;

pnlSepet.Visible=false;

lnkCikis.Visible=false;

}

}

protectedvoidlnkDurum_Click(objectsender,EventArgse)

{

if(!HttpContext.Current.User.Identity.IsAuthenticated)

FormsAuthentication.RedirectToLoginPage();

else

{

Response.Redirect(“Bilgilerim.aspx?Email=”+lnkDurum.Text);

}

}

decimaltoplamFiyat=0;

protectedstringgenelToplam=“”;

protectedvoiddlSepet_ItemDataBound(objectsender,DataListItemEventArgse)

211DVDDukkani.com

Page 216: Yazilim Proje BilgeAdam

{

if(e.Item.DataItem!=null)

{

Urunu=e.Item.DataItemasUrun;

toplamFiyat+=u.SatirToplam;

genelToplam=toplamFiyat.ToString(“N”);

}

}

protectedvoidlnkSepetGoster_Click(objectsender,EventArgse)

{

Response.Redirect(“Sepet.aspx”);

}

protectedvoidlnkSepetOnayla_Click(objectsender,EventArgse)

{

Response.Redirect(“SepetOnay.aspx”);

}

protectedvoidlnkCikis_Click(objectsender,EventArgse)

{

FormsAuthentication.SignOut();

Response.Redirect(“Default.aspx”);

}

Liste 3.36: Ana.master dosyası metodları.

Kullanıcıların giriş yapmalarını sağlayacak olan Login.aspx sayfasını uygulamaya ekleyin. Uygu-lamaya yeni bir sayfa eklerken master page seçtirmeyi unutmayın. Kullanıcıların kayıt olmalarını sağlayacak olan bu sayfa için Liste 3.37’deki html tasarımını yapın.

<%@PageLanguage=”C#”MasterPageFile=”~/ana.master”AutoEventWireup=”true”CodeFile=”Login.aspx.cs”Inherits=”Login”Title=”UntitledPage”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”ContentPlaceHolder1”Runat=”Server”>

<table>

<tr>

<tdstyle=”width:100px”>

E-Mail</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtEmail”runat=”server”></asp:TextBox></td>

<tdstyle=”width:100px”>

<asp:RequiredFieldValidatorID=”rfvKullaniciAdi”runat=”server”ControlToValidate=”txtEmail”

212 Proje 3

Page 217: Yazilim Proje BilgeAdam

ErrorMessage=”E-Mail Boş Geçilemez” SetFocusOnError=”True”>*</asp:RequiredFieldValidator></td>

</tr>

<tr>

<tdstyle=”width:100px”>

Şifresi</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtSifre”runat=”server”TextMode=”Password”></asp:TextBox></td>

<tdstyle=”width:100px”>

<asp:RequiredFieldValidatorID=”RequiredFieldValidator2”runat=”server”ControlToValidate=”txtSifre”

ErrorMessage=”rfvSifre”SetFocusOnError=”True”>*</asp:RequiredFieldValidator></td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

<asp:LinkButtonID=”lbGiris”runat=”server”OnClick=”lbGiris_Click”>Giriş</asp:LinkButton></td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

<asp:LabelID=”lblHata”runat=”server”ForeColor=”Red”Text=”Label”Visible=”False”></asp:Label></td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

</asp:Content>

Liste 3.37: Login.aspx sayfası html tasarımı.

Yapılan tasarım sonucunda ortaya çıkan ekran görüntüsü Şekil 3.30’da verilmiştir.

213DVDDukkani.com

Page 218: Yazilim Proje BilgeAdam

Giriş yapmayı sağlamak için Login.aspx sayfasının gerekli metodlarını yazın.

SqlConnectioncn=newSqlConnection(WebConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

protectedvoidlbGiris_Click(objectsender,EventArgse)

{

SqlCommandcmd=newSqlCommand(“SelectUyeIdfromUyelerwhereEmail=@EmailandSifre=@SifreandAktivasyon=1”,cn);

cmd.Parameters.AddWithValue(“@Email”,txtEmail.Text);

cmd.Parameters.AddWithValue(“@Sifre”,txtSifre.Text);

int?giris=0;

try

{

cn.Open();

strings=cmd.ExecuteScalar().ToString();

if(!string.IsNullOrEmpty(s))

{

giris=Convert.ToInt32(s);

Session[“UyeId”]=giris;

}

else

{

giris=0;

}

if(giris==0)

{

lblHata.Visible=true;

lblHata.Text = “Yanlış Kullanıcı Adı veya Şifre”;

}

else

Şekil 3.30: Login.aspx sayfa tasarım görünümü.

214 Proje 3

Page 219: Yazilim Proje BilgeAdam

{

FormsAuthentication.RedirectFromLoginPage(txtEmail.Text,false);

}

}

catch(SqlExceptionex)

{

throwex;

}

finally

{

cn.Close();

}

Liste 3.38: Login.aspx sayfası lbGiris_Click olayı.

Ödev: Kullanıcıların kayıt olabilmelerini sağlamak için YeniUye.aspx sayfasını uygulama ekleyin ve kullanıcıların kayıt olmalarını sağlayın.

Kullanıcıları karşılacayak olan default.aspx sayfasını uygulamaya ekleyin. Bu formun içerisinde rastgele dvd gösterin. Dvd gösterirken dikkat edilmesi gereken nokta satışa çıkacak ürünlerin onaylı olması ve satışta olmasıdır.

<%@PageLanguage=”C#”MasterPageFile=”~/ana.master”AutoEventWireup=”true”CodeFile=”Default.aspx.cs”Inherits=”_Default”Title=”UntitledPage”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”ContentPlaceHolder1”Runat=”Server”>

<asp:DataListID=”DataList1”runat=”server”CellPadding=”4”DataKeyField=”FilmId”ItemStyle-Wrap=”true”

DataSourceID=”SqlDataSource2”ForeColor=”#333333”RepeatColumns=”3”AlternatingItemStyle-Wrap=”true”>

<FooterStyleBackColor=”#990000”Font-Bold=”True”ForeColor=”White”/>

<AlternatingItemStyleBackColor=”White”/>

<ItemStyleBackColor=”#FFFBD6”ForeColor=”#333333”/>

<SelectedItemStyleBackColor=”#FFCC66”Font-Bold=”True”ForeColor=”Navy”/>

<HeaderStyleBackColor=”#990000”Font-Bold=”True”ForeColor=”White”/>

<ItemTemplate>

<tablestyle=”width:100%”>

<tr>

<tdalign=”center”colspan=”2”>

<imgheight=”150”src=’Resimler/Afisler/<%#Eval(“Afis”)%>’/>

<br/>

<ahref=’filmdetay.aspx?film=<%#Eval(“FilmId”)%>’>

215DVDDukkani.com

Page 220: Yazilim Proje BilgeAdam

<asp:LabelID=”AdiLabel”runat=”server”Text=’<%#Eval(“Adi”)%>’></asp:Label></a></td>

</tr>

<tr>

<tdcolspan=”2”rowspan=”2”>

</td>

</tr>

<tr>

</tr>

</table>

</ItemTemplate>

</asp:DataList><asp:SqlDataSourceID=”SqlDataSource2”runat=”server”ConnectionString=”<%$ConnectionStrings:DvdDukkaniConnectionString%>”

SelectCommand=”selectTop5*fromfilmlerorderbyfilmIddesc“></asp:SqlDataSource>

<h1>Siziniçinseçtiklerimiz</h1>

<asp:DataListID=”DataList2”runat=”server”DataKeyField=”FilmId”DataSourceID=”SqlDataSource1”Width=”100%”>

<ItemTemplate>

<tablestyle=”width:100%”>

<tr>

<tdrowspan=”3”style=”width:48px”>

<imgheight=”150”src=’Resimler/Afisler/<%#Eval(“Afis”)%>’width=”110”/></td>

<tdvalign=”top”align=”left”>

<ahref=’filmdetay.aspx?film=<%#Eval(“FilmId”)%>’>

<asp:LabelID=”AdiLabel1”runat=”server”Text=’<%#Eval(“Adi”)%>’></asp:Label></td>

</tr>

<tr>

<tdvalign=”top”>

<asp:LabelID=”Label1”runat=”server”Text=’<%#Eval(“Ozet”)%>’></asp:Label></td>

</tr>

<tr>

</tr>

</table>

</ItemTemplate>

</asp:DataList><asp:SqlDataSourceID=”SqlDataSource1”runat=”server”ConnectionString=”<%$ConnectionStrings:DvdDukkaniConnectionString%>”

SelectCommand=”SELECTtop10[Afis],[Adi],[FilmId],OzetFROM[Filmler]WHERE(([SatistaMi]=@SatistaMi)AND([OnaylandiMi]=@OnaylandiMi))orderbyfilmIddesc”>

<SelectParameters>

216 Proje 3

Page 221: Yazilim Proje BilgeAdam

<asp:ParameterDefaultValue=”false”Name=”SatistaMi”Type=”Boolean”/>

<asp:ParameterDefaultValue=”false”Name=”OnaylandiMi”Type=”Boolean”/>

</SelectParameters>

</asp:SqlDataSource>

<br/>

<br/>

</asp:Content>

Liste 3.39: Default.aspx sayfasının html tasarımı.

Kategorilere tıklandığı zaman kategorilere göre filmleri listeleyecek olan kategoridetay.aspx say-fasını ekleyin. QueryString ile gelen kategoriId bilgisine göre filmleri listeleyin. Liste 3.40’da belir-tildiği gibi tasarımı yapın.

<%@PageLanguage=”C#”MasterPageFile=”~/ana.master”AutoEventWireup=”true”CodeFile=”KategoriDetay.aspx.cs”

Inherits=”KategoriDetay”Title=”UntitledPage”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”ContentPlaceHolder1”runat=”Server”>

<asp:DataListID=”DataList1”runat=”server”CellPadding=”4”DataKeyField=”FilmId”

DataSourceID=”SqlDataSource2”ForeColor=”#333333”RepeatColumns=”5”Width=”100%”>

<FooterStyleBackColor=”#990000”Font-Bold=”True”ForeColor=”White”/>

<AlternatingItemStyleBackColor=”White”/>

<ItemStyleBackColor=”#FFFBD6”ForeColor=”#333333”/>

<SelectedItemStyleBackColor=”#FFCC66”Font-Bold=”True”ForeColor=”Navy”/>

Şekil 3.31: Default.aspx tasarım görünümü.

217DVDDukkani.com

Page 222: Yazilim Proje BilgeAdam

<HeaderStyleBackColor=”#990000”Font-Bold=”True”ForeColor=”White”/>

<ItemTemplate>

<tablestyle=”width:100%”>

<tr>

<tdalign=”center”colspan=”2”>

<imgheight=”150”src=’Resimler/Afisler/<%#Eval(“Afis”)%>’width=”110”/>

<br/>

<ahref=’filmdetay.aspx?film=<%#Eval(“FilmId”)%>’>

<asp:LabelID=”AdiLabel”runat=”server”Text=’<%#Eval(“Adi”)%>’></asp:Label></a></td>

</tr>

<tr>

<tdcolspan=”2”rowspan=”2”>

</td>

</tr>

<tr>

</tr>

</table>

</ItemTemplate>

</asp:DataList>

<asp:SqlDataSourceID=”SqlDataSource2”runat=”server”ConnectionString=”<%$ConnectionStrings:DvdDukkaniConnectionString%>”

SelectCommand=”SELECT[Adi],[FilmId],[KategoriId],[Ozet],[Sure],[DilId],[YapimciFirmaId],[Yil],[Afis],[SatistaMi],[OnaylandiMi],[TeminEdilenTedarikciId]FROM[vw_FilmDetay]WHERE([KategoriId]=@KategoriId)”>

<SelectParameters>

<asp:QueryStringParameterName=”KategoriId”QueryStringField=”Kategori”Type=”Int32”

DefaultValue=”1”/>

</SelectParameters>

</asp:SqlDataSource>

</asp:Content>

Liste 3.40: KategoriDetay.aspx sayfası html tasarımı.

Html tasarımı yapılan sayfanın görsel çıktısı Şekil 3.32’de gösterilmiştir.

218 Proje 3

Page 223: Yazilim Proje BilgeAdam

Listelenen filmlerin detaylarını gösterecek olan filmdetay.aspx syafasını ekleyin. Bu sayfa filmin afişini, bulunduğu kategorileri, oyuncuların ve yönetmenlerin listesini gösterecek.

<%@PageLanguage=”C#”MasterPageFile=”~/ana.master”AutoEventWireup=”true”CodeFile=”filmdetay.aspx.cs”Inherits=”filmdetay”Title=”UntitledPage”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”ContentPlaceHolder1”Runat=”Server”>

<tablestyle=”width:100%”>

<tr>

<tdrowspan=”6”style=”width:104px”align=”left”>

<asp:ImageID=”imgAfis”runat=”server”/></td>

<tdstyle=”width:115px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:115px;height:18px”>

<h1><asp:LabelID=”lblAd”runat=”server”Width=”250px”></asp:Label></h1></td>

<tdstyle=”width:100px;height:18px”>

</td>

</tr>

<tr>

<tdstyle=”width:115px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

Şekil 3.32: KategoriDetay.aspx sayfası tasarım görünümü.

219DVDDukkani.com

Page 224: Yazilim Proje BilgeAdam

<tdcolspan=”2”rowspan=”2”>

<asp:LabelID=”lblAciklama”runat=”server”Text=”Label”></asp:Label></td>

</tr>

<tr>

</tr>

<tr>

<tdstyle=”width:115px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<td>

</td>

<tdstyle=”width:115px”>

<asp:LabelID=”lblYil”runat=”server”Text=”Label”></asp:Label></td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdalign=”right”>

<strong>Oyuncular</strong></td>

<tdstyle=”width:115px”>

<asp:LabelID=”lblOyuncular”runat=”server”></asp:Label></td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdalign=”right”>

<strong>Kategoriler</strong></td>

<tdstyle=”width:115px”>

<asp:PlaceHolderID=”plKategoriler”runat=”server”></asp:PlaceHolder>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdalign=”right”>

<strong>Yönetmen</strong></td>

<tdstyle=”width:115px”>

220 Proje 3

Page 225: Yazilim Proje BilgeAdam

<asp:LabelID=”lblYonetmen”runat=”server”Text=”Label”></asp:Label>&nbsp;

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<td>

</td>

<tdstyle=”width:115px”>

<asp:LabelID=”Label7”runat=”server”></asp:Label>

<asp:PlaceHolderID=”PlaceHolder3”runat=”server”></asp:PlaceHolder>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<td>

</td>

<tdstyle=”width:115px”>

<asp:LabelID=”Label8”runat=”server”></asp:Label>

<asp:PlaceHolderID=”PlaceHolder4”runat=”server”></asp:PlaceHolder>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<td>

</td>

<tdstyle=”width:115px”>

<asp:LabelID=”Label9”runat=”server”></asp:Label>

<asp:PlaceHolderID=”PlaceHolder5”runat=”server”></asp:PlaceHolder>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<td>

</td>

221DVDDukkani.com

Page 226: Yazilim Proje BilgeAdam

<tdstyle=”width:115px”>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdalign=”right”>

<strong>

Adet</strong></td>

<tdstyle=”width:115px”>

<asp:TextBoxID=”txtAdet”runat=”server”Width=”40px”></asp:TextBox></td>

<tdstyle=”width:100px”>

<asp:RequiredFieldValidatorID=”RequiredFieldValidator1”runat=”server”ControlToValidate=”txtAdet”

Display=”Dynamic”ErrorMessage=”AdetGirmelisiniz”InitialValue=”0”SetFocusOnError=”True”>*</asp:RequiredFieldValidator>

<asp:CompareValidatorID=”CompareValidator1”runat=”server”ControlToValidate=”txtAdet”

Display=”Dynamic” ErrorMessage=”Adet tamsayı olmalıdır” Operator=”DataTypeCheck”

SetFocusOnError=”True”Type=”Integer”>*</asp:CompareValidator></td>

</tr>

<tr>

<td>

</td>

<tdstyle=”width:115px”>

<asp:ImageButtonID=”ImageButton1”runat=”server”ImageUrl=”~/Resimler/SepeteEkle.gif”

OnClick=”ImageButton1_Click”/></td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

</asp:Content>

Liste 3.41: FilmDetay.aspx html tasarımı.

Html tasarımı yapılan sayfanın görsel çıktısı Şekil 3.33’de gösterilmiştir.

222 Proje 3

Page 227: Yazilim Proje BilgeAdam

Gelen filmin detayını görüntülemek için Page_Load olayını ve sepete ekleme metodunu Şekil 3.33’deki şekilde yazın.

protectedvoidPage_Load(objectsender,EventArgse)

{

if(Request.QueryString[“film”]==null)

{

Response.Redirect(“default.aspx”);

}

intfilmId=0;

int.TryParse(Request.QueryString[“film”],outfilmId);

if(filmId>0)

{

DvdDukkani.Entity.FilmfilmDetay=DvdDukkani.DataLayer.Film.FilmDetay(filmId);

lblAd.Text=filmDetay.Adi;

lblAciklama.Text=filmDetay.Ozet;

imgAfis.ImageUrl=“Resimler/Afisler/”+filmDetay.Afis;

lblYil.Text=filmDetay.Yil.ToString();

stringoyuncular=DvdDukkani.DataLayer.FilmOyuncu.FilmOyuncuGetir(filmId);

lblOyuncular.Text=oyuncular;

List<DvdDukkani.Entity.Kategori>kategoriler=DvdDukkani.DataLayer.FilmKategori.FilmKategoriGetir(filmId);

foreach(DvdDukkani.Entity.Kategorikinkategoriler)

Şekil 3.33: FilmDetay.aspx sayfası tasarımı.

223DVDDukkani.com

Page 228: Yazilim Proje BilgeAdam

{

HyperLinkhl=newHyperLink();

hl.ID=“hlKategori”+k.KategoriId;

hl.NavigateUrl=“~/Kategoridetay.aspx?Kategori=”+k.KategoriId;

hl.Text=k.Adi+”<br/>”;

plKategoriler.Controls.Add(hl);

}

stringyonetmenler=DvdDukkani.DataLayer.FilmYonetmen.FilmYonetmenGetir(filmId);

lblYonetmen.Text=yonetmenler;

}

}

SqlConnectioncn=newSqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

protectedvoidImageButton1_Click(objectsender,ImageClickEventArgse)

{

intfilmId=0;

int.TryParse(Request.QueryString[“film”],outfilmId);

if(filmId>0)

{

List<Urun>sepet=null;

if(Session[“sepet”]!=null)

{

sepet=Session[“sepet”]asList<Urun>;

}

else

{

sepet=newList<Urun>();

}

SqlCommandcmd=newSqlCommand(“SelectTop1ucretfromfilmtipucretwherefilmId=@FilmId”,cn);

cmd.Parameters.AddWithValue(“@FilmId”,filmId);

cn.Open();

decimalbirimFiyat=Convert.ToDecimal(cmd.ExecuteScalar());

Urunu=newUrun();

u.FilmId=filmId;

224 Proje 3

Page 229: Yazilim Proje BilgeAdam

u.FilmAdi=lblAd.Text;

u.Birimfiyat=birimFiyat;

boolvarMi=false;

foreach(Urunuruninsepet)

{

if(urun.FilmId==filmId)

{

u=urun;

varMi=true;

break;

}

}

if(varMi)

{

u.Adet+=Convert.ToInt32(txtAdet.Text);

}

else

{

u.Adet=Convert.ToInt32(txtAdet.Text);

sepet.Add(u);

}

u.SatirToplam=u.Adet*u.Birimfiyat;

Session[“sepet”]=sepet;

if(!HttpContext.Current.User.Identity.IsAuthenticated)

{

Session[“tmpUrun”]=u;

FormsAuthentication.RedirectToLoginPage();

return;

}

Response.Redirect(“Default.aspx”);

}

}

Liste 3.42: FilmDetay.aspx.cs metodları.

Kullanıcıların kendi kişisel bilgilerini güncelleyebilmelerini sağlamak için bilgilerim.aspx sayfası ekleyin. Bu sayfa üyenin temel bilgilerini güncellemesini sağlayacak. Liste 3.43’deki tasarımı ya-pın.

225DVDDukkani.com

Page 230: Yazilim Proje BilgeAdam

<%@PageLanguage=”C#”MasterPageFile=”~/ana.master”AutoEventWireup=”true”CodeFile=”Bilgilerim.aspx.cs”Inherits=”Bilgilerim”Title=”UntitledPage”%>

<asp:ContentID=”Content1”ContentPlaceHolderID=”ContentPlaceHolder1”Runat=”Server”>

<tablestyle=”width:359px”>

<tr>

<tdstyle=”width:100px”>

İsim</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtIsim”runat=”server”ValidationGroup=”Sayfa1”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

<asp:RequiredFieldValidatorID=”rfvIsim”runat=”server”ControlToValidate=”txtIsim”

ErrorMessage=”İsim Boş Geçilemez” SetFocusOnError=”True”ValidationGroup=”Sayfa1”>*</asp:RequiredFieldValidator>

</td>

</tr>

<trstyle=”color:#666666”>

<tdstyle=”width:100px”>

Soyisim</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtSoyIsim”runat=”server”ValidationGroup=”Sayfa1”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

<asp:RequiredFieldValidatorID=”rfvSoyisim”runat=”server”ControlToValidate=”txtSoyIsim”

ErrorMessage=”Soyisim Boş Geçilemez” SetFocusOnError=”True”ValidationGroup=”Sayfa1”>*</asp:RequiredFieldValidator>

</td>

</tr>

<trstyle=”color:#666666”>

<tdstyle=”width:100px”>

E-Mail</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtEMail”runat=”server”ValidationGroup=”Sayfa1”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

<asp:RequiredFieldValidatorID=”rfvEMail”runat=”server”ControlToValidate=”txtEMail”

226 Proje 3

Page 231: Yazilim Proje BilgeAdam

Display=”Dynamic” ErrorMessage=”E-Mail Boş Geçilemez”SetFocusOnError=”True”

ValidationGroup=”Sayfa1”>*</asp:RequiredFieldValidator>

<asp:RegularExpressionValidatorID=”revEMail”runat=”server”ControlToValidate=”txtEMail”

Display=”Dynamic”ErrorMessage=”GeçersizbirE-Mailgirildi”SetFocusOnError=”True”

ValidationExpression=”\w+([-+.’]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*”ValidationGroup=”Sayfa1”>*</asp:RegularExpressionValidator>

</td>

</tr>

<trstyle=”color:#666666”>

<tdstyle=”width:100px”>

Şifre</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtSifre”runat=”server”TextMode=”Password”ValidationGroup=”Sayfa1”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

<asp:RequiredFieldValidatorID=”rfvSifre”runat=”server”ControlToValidate=”txtSifre”

ErrorMessage=”Şifre Boş Geçilemez” SetFocusOnError=”True”ValidationGroup=”Sayfa1”>*</asp:RequiredFieldValidator>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

Şifre (Tekrar)</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtSifreTekrar”runat=”server”TextMode=”Password”ValidationGroup=”Sayfa1”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

<asp:RequiredFieldValidatorID=”rfvSifreTekrar”runat=”server”ControlToValidate=”txtSifreTekrar”

Display=”Dynamic” ErrorMessage=”Şifre (Tekrar) Boş Geçilemez” SetFocusOnError=”True”

ValidationGroup=”Sayfa1”>*</asp:RequiredFieldValidator>

<asp:CompareValidatorID=”cvSifre”runat=”server”ControlToCompare=”txtSifre”ControlToValidate=”txtSifreTekrar”

Display=”Dynamic” ErrorMessage=”Şifre ile Şifre (Tekrar) aynı olmalıdır” SetFocusOnError=”True”

227DVDDukkani.com

Page 232: Yazilim Proje BilgeAdam

ValidationGroup=”Sayfa1”>*</asp:CompareValidator>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

GizliSoru</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtGizliSoru”runat=”server”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

GizliCevap</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtGizliCevap”runat=”server”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

&nbsp;</td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

<br/>

<table>

<tr>

<tdstyle=”width:100px”>

Açıklama</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtAciklama”runat=”server”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

228 Proje 3

Page 233: Yazilim Proje BilgeAdam

<tr>

<tdstyle=”width:100px”>

Adres</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtAdres”runat=”server”Height=”100px”TextMode=”MultiLine”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

Telefon</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtTelefon”runat=”server”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

Yedek Kişi</td>

<tdstyle=”width:100px”>

<asp:TextBoxID=”txtYedek”runat=”server”></asp:TextBox>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

Ilce</td>

<tdstyle=”width:100px”>

<asp:DropDownListID=”ddlIlce”runat=”server”>

</asp:DropDownList>

</td>

<tdstyle=”width:100px”>

</td>

</tr>

<tr>

<tdstyle=”width:100px”>

</td>

<tdstyle=”width:100px”>

229DVDDukkani.com

Page 234: Yazilim Proje BilgeAdam

&nbsp;<asp:LinkButtonID=”LinkButton1”runat=”server”OnClick=”LinkButton1_Click1”>Güncelle</asp:LinkButton></td>

<tdstyle=”width:100px”>

</td>

</tr>

</table>

<asp:UpdatePanelID=”UpdatePanel1”runat=”server”>

<ContentTemplate>

<asp:PanelID=”pnlIslem”runat=”server”Visible=”false”>

&nbsp;&nbsp;<br/>

<br/>

<asp:TimerID=”Timer1”runat=”server”Enabled=”False”Interval=”1000”OnTick=”Timer1_Tick”>

</asp:Timer>

<asp:LabelID=”lblBilgi”runat=”server”Text=”Label”></asp:Label><br/>

<asp:LabelID=”lblSayac”runat=”server”Font-Bold=”True”Font-Size=”XX-Large”ForeColor=”Red”

Text=”5”></asp:Label></asp:Panel>

&nbsp;

</ContentTemplate>

<Triggers>

<asp:AsyncPostBackTriggerControlID=”LinkButton1”EventName=”Click”/>

</Triggers>

</asp:UpdatePanel>

</asp:Content>

Liste 3.43: Bilgilerim.aspx sayfası html tasarımı.

Tasarımı yapılan bilgilerim.aspx sayfası dizayn görünümü Şekil 3.34’de verilmiştir.

Bilgilerim.aspx sayfasında gerekli işlemleri yapan metodları yazın. (Liste 3.44)

protectedvoidPage_Load(objectsender,EventArgse)

{

if(!this.IsPostBack)

{

if(Request.QueryString[“EMail”]==null)

Response.Redirect(“Default.aspx”);

else

{

stringemail=Request.QueryString[“EMail”];

230 Proje 3

Page 235: Yazilim Proje BilgeAdam

DvdDukkani.Entity.UyeAdresuyeadres=null;

DvdDukkani.Entity.Uyeuye=DvdDukkani.DataLayer.Uye.UyeBul(email,outuyeadres);

if(uye!=null&&uyeadres!=null)

{

txtIsim.Text=uye.Ad;

txtSoyIsim.Text=uye.Soyad;

txtEMail.Text=uye.Email;

txtGizliCevap.Text=uye.GuvenlikCevabi;

txtGizliSoru.Text=uye.GuvenlikSorusu;

txtSifre.Text=uye.Sifre;

txtSifreTekrar.Text=uye.Sifre;

txtTelefon.Text=uyeadres.Telefon;

txtYedek.Text=uyeadres.TeslimatiAlacakYedekKisi;

txtAdres.Text=uyeadres.Adres;

txtAciklama.Text=uyeadres.TanimlamaAdi;

}

}

this.IlceGetir();

}

}

voidIlceGetir()

{

SqlCommandcmd=newSqlCommand(“Select*fromIlceler”,cn);

DataTabledtIlce=newDataTable();

Şekil 3.34: Bilgilerim.aspx tasarım görünümü.

231DVDDukkani.com

Page 236: Yazilim Proje BilgeAdam

SqlDataAdapterda=newSqlDataAdapter(cmd);

da.Fill(dtIlce);

ddlIlce.DataSource=dtIlce;

ddlIlce.DataTextField=“Adi”;

ddlIlce.DataValueField=“IlceId”;

ddlIlce.DataBind();

}

protectedvoidLinkButton1_Click(objectsender,EventArgse)

{

Response.Redirect(“Default.aspx”);

}

SqlConnectioncn=newSqlConnection(WebConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);

protectedvoidTimer1_Tick(objectsender,EventArgse)

{

lblSayac.Text=(Convert.ToInt32(lblSayac.Text)-1).ToString();

if(Convert.ToInt32(lblSayac.Text)<=0)

Response.Redirect(“Default.aspx”);

}

protectedvoidLinkButton1_Click1(objectsender,EventArgse)

{

DvdDukkani.Entity.Uyeu=newDvdDukkani.Entity.Uye();

u.Ad=txtIsim.Text;

u.Email=txtEMail.Text;

u.GuvenlikCevabi=txtGizliCevap.Text;

u.GuvenlikSorusu=txtGizliSoru.Text;

u.Sifre=txtSifre.Text;

u.Soyad=txtSoyIsim.Text;

DvdDukkani.Entity.UyeAdresua=newDvdDukkani.Entity.UyeAdres();

ua.Adres=txtAdres.Text;

ua.IlceId=Convert.ToInt32(ddlIlce.SelectedValue);

ua.TanimlamaAdi=txtAciklama.Text;

ua.Telefon=txtTelefon.Text;

ua.TeslimatiAlacakYedekKisi=txtYedek.Text;

DvdDukkani.DataLayer.Uye.UyeGuncelle(u,ua);

lblBilgi.Text=“5saniyeiçerisindeanasayfayayönlendirileceksiniz!!!<br/><br/>”;

232 Proje 3

Page 237: Yazilim Proje BilgeAdam

lblSayac.Text=“5”;

pnlIslem.Visible=true;

Timer1.Enabled=true;

}

Liste 3.44: Bilgilerim.aspx.cs dosyası metodları.

Uygulama: Kullanıcıların birden fazla adres eklemelerini sağlayacak, bu adreslere isim verebile-cekleri adreslerim.aspx sayfasını yapın.

Kullanıcının sepetini görebileceği, değişiklik yapacağı veya ürün kaldıracağı Sepet.aspx sayfasını uygulamaya ekleyin.

233DVDDukkani.com

Page 238: Yazilim Proje BilgeAdam
Page 239: Yazilim Proje BilgeAdam

A Terimler Sözlüğü

Page 240: Yazilim Proje BilgeAdam
Page 241: Yazilim Proje BilgeAdam

Teknik Terimler SözlüğüA$PARTITION: Belirli bir bölüm fonksiyonu için bir değerin bölüm numarasını döndüren bir fonk-siyon.

.NET Framework 2.0 Configuration aracı: .NET Framework tarafından sağlanan, uygulamala-rın ve assembly’lerin görsel konfigürasyonuna ve yönetimine imkan veren bir araç.

abstract class (soyut sınıf): Sadece türetilmiş bir class için bir base class olarak kullanılabilecek bir class. Bir abstract class’ın instance’ı oluşturulamaz. Bu tip class’da NotInheritable tanımlayıcı-sı kullanılır (C# için bu tanımlayıcı abstract’dır).

access control list – ACL (erişim kontrol listesi): Genellikle bir Discretionary Access Control List (DACL) için kullanılan bir terim. Bir nesne üzerinde atanan veya reddedilen erişim izinleri için kullanıcıları ve grupları tanımlayan bir yetkilendirme kısıtlama mekanizması.

access keys (erişim tuşları): Belirli bir kontrol için bir klavye kısayolunu tanımlayan, birden fazla tuş basışının bir kombinasyonu.

access rule (erişim kuralı): Verilen veya reddedilen bir izin, bir kullanıcı veya rolün kombinas-yonu.

accessibility aid (erişim yardımı): Windows uygulamalarını kullanan görsel, işitsel veya hareket engelli kullanıcılara yardım eden bir uygulama. Windows kurulurken varsayılan durumda Acces-sories bölümüne kurulan bir uygulama grubu.

accessible design (erişilebilir tasarım): Uygulamanın farklı becerilere sahip engelli kişiler tara-fından erişilebilir olmasına imkan vermek üzere belirli ilkelere uyacak şekilde bir kullanıcı arayüzü tasarlama ilkesi.

ACID özellikleri: Bir transaction’ın dört temel özelliğini tanımlayan bir kısaltma; atomicity (atomik-lik), consistency (tutarlılık), isolation (izolasyon) ve durability (dayanıklılık).

activation (etkinleştirme): Mesajlar kuyruğa yerleştirildiğinde stored procedure’lerin otoma-tik olarak başlatıldığı süreç. Bu süreç aynı zamanda, yükle uyum sağlamak için bir tek stored procedure’ün mü yoksa birden fazla procedure’ün mü başlatılacağını da kontrol eder.

active log (etkin günlük): Bir transaction log’unun commit edilmiş ama henüz yedeklenmemiş transaction’ları içeren kısmı. Ayrıca açık transaction’ları da içerir.

activity diagram (etkinlik diyagramı): Bir UML akış tablosu gibi bir şema. Birbiri ardına mey-dana gelen eylemleri, bu eylemlere yol açan kararları ve paralel olarak meydana gelen eylemleri gösterir. Bir etkinlik şeması, ticari iş akışlarını ve karmaşık algoritmaları modellemek için kulla-nışlıdır.

activity diagram (etkinlik diyagramı): UML akış tablosu gibi bir şema. Birbiri ardına meydana gelen eylemleri, bu eylemlere yol açan kararları ve paralel olarak meydana gelen eylemleri göste-rir. Bir etkinlik şeması, ticari iş akışlarını ve karmaşık algoritmaları modellemek için kullanışlıdır.

adaptive rendering: Bir kontrolün, web sayfasını talep eden tarayıcıya göre fraklı render edil-mesi.

ADO.NET: ADO, COM dönemi teknolojisinde kullanılan Active Data Objects anlamındadır. ADO.NET, bu teknolojinin managed koda doğal evrimidir. System.Data namespace’inde bulunabilir. (Veri kaynaklarına bağlanmak için kullanılır.)

Page 242: Yazilim Proje BilgeAdam

Advanced Encryption Standard (AES): 128 ila 256 bit anahtar boyutlarını kullanan simetrik bir kriptolama algoritması olan Rijndael ile eş anlamlıdır.

agent: Yük, stres veya performans testini çalıştıran bir bilgisayar. Genellikle bir tek agent birden fazla thread’i çalıştırır. Her thread, testlerin tamamını çalıştırır.

aggregate function (topluluk fonksiyonu): Her bir değer yerine satır setleri üzerinde çalışan bir fonksiyon.

aggregation (birleştirme): Bir nesnenin üyelerinin, kapsayan bir nesne aracılığıyla açığa çıkarıl-dığı nesne yönelimli programlama kavramıdır.

alert (uyarı): Bir operatöre haber vermek veya bir işi çalıştırmak gibi bir cevabı tetikleyen bir sistem durumu.

alerts (uyarılar): Belirli sistemlere ve/veya bireylere gönderilen belirli olayların bildirimi.

alignment (hizalama): Bir tablonun tüm indeksleri ve tablonun kendisi aynı bölümleme fonksiyo-nu kullanılarak bölümlendiğinde meydana gelir.

AppDomain: .NET’te AppDomain nesnesi, içinde uygulamaların çalıştırıldığı izole edilmiş bir uy-gulama domain’ini temsil eder. İzolasyon, bir AppDomain’indeki süreçlerin ikinci bir AppDomain için ayrılan belleğe doğrudan erişememesinden kaynaklanır.

application caching (uygulama ön belleğine alma): Daha sonra doğrudan bellekten elde et-mek üzere, nesnelerin Cache nesnesinde programsal olarak depolanması için bir teknik.

application container (uygulama konteyneri): Uygulamanızın host’u veya birincil biçimi. Bir uygulama konteyneri, navigasyon ve pencere yönetimi gibi servisleri sağlar.

application domain (uygulama domain’i): Birden fazla assembly’nin bir tek süreç içinde çalış-malarına izin verirken, bu assembly’lerin bellek (ram) üzerinde birbirlerinin belleklerine doğrudan erişmelerini engelleyen mantıksal bir yapıdır.

application flow-logic diagram (uygulama akış mantığı şeması): Bir uygulamayı meydana getiren bileşenleri ve bu bileşenlerin birbiriyle ilişkilerini açıklayan şema.

application library (uygulama kütüphanesi): Çözümünüzde kullanabileceğiniz bileşenler kü-mesi.

application scope (uygulama kapsamı): Çalışma zamanında salt okunur ayarlar. (Uygulama ayarlarından (Application Settings) bahsederken).

application server (uygulama sunucusu): Sunucu kodunuzu (genellikle ASP.NET ve .NET Framework) çalıştıran sunucu yazılımı. Internet Information Server (IIS), bir uygulama sunucu-sudur.

application setting (uygulama ayarı): Uygulamanın okuduğu, yazdığı veya hem okuyup, hem de yazdığı özel bir ayar.

application settings (uygulama ayarları): Uygulamayı çalıştıran her kullanıcı için mevcut olan ayarlar. Genellikle bu ayarlar veritabanı bağlantılarını, versiyon bilgilerini ve web servisi uç nok-talarını içerir.

application state (uygulama durumu): Web uygulamasındaki tüm sayfalardan erişilebilen glo-bal bir depolama mekanizması.

application URL (uygulama URL’i): Uygulama için benzersiz bir konumu tanımlamak üzere kullanılan bir uygulama URL’i (Uniform Resource Locator).

238 Ek - A

Page 243: Yazilim Proje BilgeAdam

assembly evidence (assembly kanıtı): Assembly’nin kimliğini (hash, yayımcı veya güçlü ad gibi) tanımlayan, assembly tarafından sunulan kanıt.

assertion (iddia): Bir noktada true olmasını beklediğiniz bir koşulu temsil eder. Koşul true değil-se, iddia başarısız olur.

asymmetric algorithm (asimetrik algoritma): Public key şifrelemesi olarak da bilinen bu metot, bir anahtar çiftini içerir. Public key (birden fazla party’ye dağıtılabilir) ile imzalanan mesajlar sade-ce private key ile çözülebilir.

asymmetric encryption (asimetrik şifreleme): Verileri şifrelemek ve çözmek için ayrı private ve public key’leri kullanan bir şifreleme tekniği. Public key şifreleme olarak da bilinir.

asymmetric key (asimetrik anahtar): Private key’i ve buna karşılık gelen public key’i birleştirir. Bir asimetrik anahtar, simetrik anahtardan daha güçlüdür ama aynı zamanda daha kaynak yo-ğunlukludur. (Bkz. sertifika; simetrik anahtar.)

asynchronous (asenkron): İşlemenin meydana gelmesini engellemeyen bir çağırma (asenkron bir çağrı, işleme meydana gelirken programın çalışmasını engellemez). Aynı anda birden fazla işlem yapılmasını sağlayan mekanizmadır.

asynchronous processing (asenkron işleme): Diğer çalışma gerçekleştirilirken başlatılan ve çalışmaya bırakılan bir işlem. İşlemin başlatıcısı işlemin zamanlamasını veya çalıştırılmasını kon-trol etmez.

Asynchronous Programming Model: Belirli metotların asenkron çalıştırılmasını sağlamak üze-re Begin/End metot çiftlerini kullanan özel tiplerdeki .NET sınıflarıyla çalışma deseni. Örneğin: BeginReceive, EndReceive

attribute: .NET Framework’te, kodun deklaratif olarak bağlanmasına imkan veren özel bir class tipi.

authentication (kimlik denetimi): Oturum açmak için gelen bir talebin göndericisinin kimliğini doğrulama teşebbüsü süreci. Kimlik denetimi yapılan gönderici bir bilgisayar programı veya bir bilgisayarı kullanan bir kişi olabilir.

authorization (yetkilendirme): Bir kullanıcının istenen bir kaynağa erişmesine izin verildiğini doğrulama süreci. Kullanıcının rolü. Örneğin; site yöneticisi veya normal bir kullanıcı.

Bbackup (yedek): Genellikle ciddi bir veritabanı hatası veya bir sistem başarısızlığı sonrasında verileri geri yüklemek için kullanılabilecek bir veritabanı, dosya grubu, dosya veya transaction log kopyası.

backup device (yedekleme aygıtı): Bir yedekleme konumuna önceden tanımlanmış bir işaretçi. Bir yedekleme aygıtı, backup komutunun içinde bir manyetik bant veya disk konumunu dinamik olarak belirtmek yerine, fiziksel konuma bir isim atar ve daha sonra bu isim yeniden kullanılabilir.

backup file (yedekleme dosyası): Veritabanı, transaction log veya dosya ve dosya grubu yede-ğinin tamamını veya bir kısmını depolayan bir dosya.

backup strategy (yedekleme stratejisi): Mesleki gereksinimleri karşılamak üzere geri yüklene-bileceğinden emin olmak için, belirli bir veritabanı için kullanılan yedeklerin kombinasyonu. (Bkz. geri yükleme stratejisi.)

base class (taban sınıf): Türetilen class’ın kendisinden temel işlevselliği aldığı class. Eğer Class B, Class A’dan türetilirse, Class A base class olarak kabul edilir ve bu class’a, base class denir.

239Terimler Sözlüğü

Page 244: Yazilim Proje BilgeAdam

base64 encoding (64 tabanlı kodlama): İkilik (binary) verileri SMTP ve HTTP protokollerinde aktarım için uygun bir 7-bit biçime eşleyen karakter seti kodlaması.

bcp: Bulk Copy Program komut satırı yardımcı programı. SQL Server sürecinin dışında çalışan, verileri SQL Server’a veya SQL Server’dan toplu olarak kopyalayan harici bir program.

best-effort restore: restore komutunun CONTINUE_AFTER_ERROR seçeneğinin etkinleştir-mesi için kullanılan genel terim. Bu süreç, yedekleme ortamında hatalar bulunsa bile geri yükleme işleminin devam etmesini sağlar.

BinaryFormatter: System.Runtime.Serialization.Formatters.Binary namespace’inde bulunan bu biçimlendirici, sadece .NET Framework tabanlı uygulamalar tarafından okunacak nesnelerin serialization’ı için en verimli yoldur.

binding (bağlama): Belirli bir spesifikasyona uyan bir XML Web metodunu belirtme yöntemi veya herhangi bir data’yı kontrole bağlama işlemi.

BindingSource: Bir veri kaynağına veri bağlama kontrollerini (data binding controls) sağlayan bir Windows Form bileşeni.

black box testing (kara kutu testi): Bir geliştiricinin bir uygulamaya girdi sağladığı ve daha sonra uygulamanın çıktısını veya davranışını belirli testler için beklenen sonuçlarla karşılaştırdığı testleri temsil eden bir test tipi. Entegrasyon testleri ve yük testleri bu test tipine örnektir.

BLOB: Bir BLOB, büyük bir ikilik düzen (1 – 0 formatında) nesnesidir; grafikler, müzik dosyaları, çalıştırılabilir dosyalar veya ikilik biçimde temsil edilen herhangi bir öğe gibi büyük öğeleri temsil eden bir byte dizisi.

blocking (engelleme): Çok kullanıcılı bir erişim kontrolü mekanizması. SQL Server, birden fazla kullanıcı tarafından erişilebildiğinde veri bütünlüğünü kontrol etmek için kilitleme mekanizmalarını kullanır. Veriler diğer bir süreç tarafından kilitlendiğinde, bir süreç verileri talep ederse bir engel-leme meydana gelir.

Bir değer döndürülene kadar bir thread’in kesilmesi.

boundary points (sınır noktaları): Bir tablo veya indeks içindeki verilerin nerede bölümlere ay-rıldığını belirlemek için kullanılan değerler.

bounds check (sınır kontrolü): Bir birimin parametresinin sınırlarında nasıl çalıştığını kontrol eden bir test. Bir sınırın tanımı, parametrenin beklenen değerlerine veya parametrenin veri tipine bağlıdır. Bu sınırların yakınında veya ötesinde genellikle hatalar meydana gelir.

bounds check (sınır kontrolü): Bir birimin parametresinin sınırlarında nasıl çalıştığını kontrol eden bir test. Bir sınırın tanımı, parametrenin beklenen değerlerine veya parametrenin veri tipine bağlıdır. Bu sınırların yakınında veya ötesinde genellikle hatalar meydana gelir.

boxing: Bir değer tipinin bir referans tipine dönüştürülmesi; genellikle dolaylı olarak meydana gelir.

broken ownership chain (kırılmış sahiplik zinciri): Bir nesnenin kullanılmasını engelleyen, bağımlı nesneler arasındaki bir izin çakışması.

B-tree (B ağacı): Üzerinde indekslerin inşa edildiği, dengeli bir ağaç yapısı. B-tree simetrik oldu-ğundan, belirli bir değeri bulmak için bir sorgu aynı miktarda kaynak gerektirir.

buffering (tamponlama): Oynatmaya başlamadan önce, akan bir medya dosyasının önceden tanımlanmış miktarını elde etme eylemi. Tamponlama, geçerli içerik oynatılırken gelecekteki içe-rik elde edildiğinden, oynatmanın daha pürüzsüz görünmesini sağlar.

240 Ek - A

Page 245: Yazilim Proje BilgeAdam

bugs (hatalar): Hatalar veya eksik ya da yanlış işlevsellik biçiminde görünen uygulama sorunla-rı.

BULK INSERT: Verileri bir SQL Server tablosuna veya görünümüne yerleştirmek için kullanılan bir Transact-SQL komutu.

Bulk-Logged recovery model: Veritabanı motorunun SELECT INTO ve BULK INSERT gibi top-lu işlemleri minimum düzeyde log’a kaydettiği bir süreç. Bu recovery modelinde, bir log yedeği herhangi bir bulk işlemi içerirse, veritabanı, zaman içindeki bir noktaya değil, log yedeğinin so-nuna geri yüklenebilir. Bulk-Logged recovery model, büyük bulk işlemler sırasında geçici olarak kullanılmak üzere tasarlanmıştır. (Bkz. Full recovery model; Simple recovery model.)

Business Access Layer (BAL): Uygulama için tüm mesleki mantığı içeren bir veya daha fazla sınıf. Mantığı kendi sınıf setine ayırmak, mesleki mantığı ve veri erişimini kullanıcı arayüzünden ayırma sürecinin bir parçasıdır.

business domain (iş (business) alanı): Mantıksal modelinizden ve ORM şemasından türetilen sınıfları temsil eden bir domain. Bu sınıflar, uygulamanın birincil iş (business) fonksiyonlarını çö-zer.

business logic (iş (business) mantığı): Bir bileşenin iş (business) olaylarına yardım etmek üze-re veri erişim bileşenlerine eklenen herhangi bir işlevsellik.

business requirement (iş (business) gereksinim): Proje hissedarlarının perspektifinden başarı faktörlerini tanımlayan bir gereksinim. Bir iş (business) gereksinim, projenin başarısı için önemli olan şeyleri temsil eder.

business rule validation (iş kural geçerlilik kontrolü): Verilerin kabul edilebilir olup olmadığını belirlemek üzere, biçimlendirmenin kapsamı dışına düşen bir kural setini kullanan bir veri geçer-liliği kontrolü tipi.

Ccache dependency (ön bellek bağımlılığı): Bir nesnenin ön bellekten ne zaman kaldırıldığını belirleyen bir dosya, veritabanı, süre veya diğer bir nesne.

caching (ön belleğe alma): Sık erişilen verilerin, bir dosya veya veritabanına göre daha hızlı elde edilebileceği belleğe depolanması için kullanılan bir teknik.

callback (geri çağırma): İşleme süreci tamamlandıktan sonra çağrıyı yapana bildirimde buluna-cak bir metoda gönderilen bir nesne. Asenkron programlama kullanılan programlama yöntemi-dir.

capacity planning (kapasite planlaması): Performans temeline ve kapsamlı testlere dayanan, öngörücü uygulama kaynak kullanımı planlaması.

CAS (code access security): Yöneticilerin ve geliştiricilerin, kullanıcıları yetkilendirdikleri gibi uygulamaları yetkilendirmelerini sağlayan bir güvenlik sistemi.

cascading dependency (basamaklı bağımlılık): Bir assembly’nin ikinci bir assembly’e ve ikin-cisinin de üçüncü bir assembly’ye bağımlı olma durumu.

case expression (durum deyimi): Geliştiricilerin karmaşık anahtar mantığını, Transact-SQL içinde geçerli bir deyimin kullanılabileceği her yerde ifade etmesini sağlayan bir Transact-SQL yapısı.

cast (tip ataması): Bir tipten diğerine bir dönüşüm.

catalog of changed pages (değiştirilen sayfalar katalogu): Bir Database Snapshot oluşturul-duktan sonra bir veritabanında değiştirilen sayfaların bir listesi. Bu katalog, verilerin hangi sayfa-

241Terimler Sözlüğü

Page 246: Yazilim Proje BilgeAdam

dan alınacağını belirlemek için kullanılır: Kaynak veritabanındaki sayfa veya Database Snapshot içindeki sayfa.

catalog population (katalog popülasyonu): Bir veya daha fazla sütun içinde bulunan benzersiz sözcüklerin bir listesini çıkarmak ve bir indeks içinde oluşturmak üzere metin ve görüntü sütun-larını çözümlemek için, word breaker’ları, noise word dosyalarını, dil dosyalarını ve (isteğe bağlı olarak) filtreleri ve protokol yöneticilerini yükleyen bir arka plan süreci.

CCW (COM Callable Wrapper): Bir .NET assembly’si ve bir COM bileşeni arasında yer alan bir proxy sınıfı; COM bileşeninin .NET assembly’sine erişip içindeki metotların kullanılmasını sağ-lar.

certificate (sertifika): Bir public key sertifikası, public key’e karşılık gelen private key’i tutan bir kişiyi, aygıtı veya servisi tanımlamak üzere bir public key’in değerini eşleyen, dijital olarak imza-lanmış bir ifadedir.

channel (kanal): Bir iletişim kanalı, bir istemci uygulaması ve uzak nesneleri barındıran bir su-nucu arasındaki iletişim için bir yol olarak hizmet eder. Dağıtık uygulama mimarisi içerisinde kul-lanılır.

child node: Diğer bir node’un içinde yer alan bir node.

cipher text (şifre metni): Bir şifreleme algoritması tarafından üretilen ve bir gizli anahtar olmak-sızın düz metne dönüştürülemeyen şifrelenmiş metin.

class diagram (sınıf şeması): Kodunuzu meydana getiren class’ların, enumaration yapıların ve arayüzlerin statik bir temsili olan bir şema. Bir class şeması, ilişkileri ve mirası (inheritance) gösterir.

ClickOnce: Bir uygulamanın bir web sitesinde veya dosya paylaşımında çabuk yayınlanmasını ya da bir uygulamanın bir bilgisayara çabuk kurulmasını sağlayan yeni bir yayım teknolojisi. Clic-kOnce uygulamaları genellikle varsayılan güvenlik ayarları altında çalışır.

client (istemci): Bir uygulamanın kullanıcılara nasıl sunulacağı hakkında teknoloji tercihi. İstemci tercihleri; Windows, konsol, Office ve Mobile’ı içerir.

CLS-compliant exception (CLS uyumlu istisna): .NET Framework tarafından yönetilen her-hangi bir exception nesnesi. CLS uyumlu tüm exception’lar System.Exception hiyerarşisinden türetilir. CLS, Common Language Specification’ın kısaltmasıdır.

clustered index: Veri sayfalarındaki satırların ve veri sayfalarının kendilerinin clustering anah-tarına göre sıralanmasına neden olan bir indeks. Bir tablo sadece bir tek clustered index’e sahip olabilir.

clustering key: Bir clustered index’i tanımlamak için kullanılan sütun (veya sütunlar).

code (kod): Bir dağıtım yerinin bir UML temsili. Genellikle bir donanım parçasını temsil eder (bir sunucu gibi).

code access security (CAS): Yöneticilerin ve geliştiricilerin, kullanıcıları yetkilendirdikleri gibi uygulamaları yetkilendirmelerini sağlayan bir güvenlik sistemi.

code analysis (kod analizi): Visual Studio 2008 Team Edition’da yerleşik olan, kaynak kodunu-zu bir kural setine karşı gözden geçiren bir araç. Bu kurallar sürdürülebilirlik, okunabilirlik, globali-zasyon ve performans gibi alanlar için kabul edilen en iyi uygulamaları tanımlar. Ayrıca statik kod analizi olarak da adlandırılır.

code analysis (kod analizi): Visual Studio’da yerleşik olan, kaynak kodunuzu bir kural setine karşı gözden geçiren bir araç. Bu kurallar sürdürülebilirlik, okunabilirlik, globalizasyon ve perfor-

242 Ek - A

Page 247: Yazilim Proje BilgeAdam

mans gibi alanlar için kabul edilen en iyi uygulamaları tanımlar. Ayrıca statik kod analizi olarak da adlandırılır.

code coverage (kod kapsamı): Belirli bir test (genellikle birim testi) sonucu elde edilen kod yüz-desini tanımlayan bir ölçü. Kod kapsamı, test edilmekte olan uygulama kodu bölümünün ölçüle-bilir şekilde anlaşılmasını sağlar. Test edillen kodun arka planı farklı bir biçimde renklendirilmekte dolayısıyla kodun test edilmeyen kısmı çok rahat bir biçimde görünmektedir.

code group (kod grubu): Assembly’leri izin setleriyle ilişkilendirilen yetkilendirme aygıtı.

code page (kod sayfası): Belirli bir sırada seçilmiş karakter kodlarının bir listesi (karakterler kod noktaları olarak temsil edilir). Kod sayfaları, genellikle ortak yazma sistemlerini paylaşan belirli diller veya grupları desteklemek üzere tanımlanır. Windows kod sayfaları 256 kod noktasını içerir ve sıfır tabanlıdır.

code review (kod gözden geçirme): Bilinen standartlara ve en iyi uygulamalara karşı kodu doğ-rulamak için üzerinden geçme süreci. Kod gözden geçirmeleri genellikle peer-to-peer temelinde yapılır.

codec: Verileri bir biçimden diğerine kodlamaktan ve çözmekten sorumlu bir yazılım veya dona-nım parçası. Genellikle bu terim, internette sunulan ses ve video içeriği için kullanılır.

collaboration diagram (beraber çalışma şeması): Bir kullanım durumunu anlamak için nes-nelerin birlikte nasıl çalıştığını gösteren bir şema. Mesaj etkileşiminin sırası, numaralandırılmış mesajlarla gösterilir.

collation: Verilerin nasıl karşılaştırıldığını, sıralandığını ve sunulduğunu belirleyen bir kurallar seti. Karakter verileri collation bilgileri (coğrafi konum, sıra ve harf kipine duyarlılık) kullanılarak sıralanır.

collection (koleksiyon): Öğelerin listelerde toplanmasına ve öğeler üzerinde yinelemeye imkan veren herhangi bir class.

COM (Component Object Model): .NET’ten önce, Microsoft’un temel geliştirme framework’ü COM’du.

COM Callable Wrapper (CCW): Bir .NET assembly’si ve bir COM bileşeni arasında yer alan bir proxy sınıfı; COM bileşeninin .NET assembly’sine erişip içindeki metotların kullanılmasını sağ-lar.

Common Language Runtime (CLR): .NET Framework için kodu yöneten ana motor.

complexity (karmaşıklık): Bir bilgisayar programının anlaşılmasının ne kadar zor olduğunun ölçüsü. Karmaşıklıktan, belirli bir programın ne kadar anlaşılır olduğunu ve belirli bir değişikliğin bir program üzerinde ne gibi istenmeyen yan etkiler doğuracağı görülebilir.

component (bileşen): 1. Kurumsal uygulama tasarımında mantıksal olarak ilişkili class’lar ve metotlar grubu. Bileşenler genellikle .dll dosyaları olur. 2. .NET Framework’te, System.Compo-nentModel.IComponent arayüzünü uygulayan veya IComponent’ı uygulayan bir class’tan doğ-rudan veya dolaylı olarak türeten bir class. Genelde, yeniden kullanılabilir ve diğer class’larla ve nesnelerle çalışan bir class veya nesne.

component diagram (bileşen şeması): Bileşenleri ve bunların ilişkilerini (referansları) gösteren bir şema. Ayrıca, bu bileşenlerin node’lar üzerine nasıl dağıtıldığını da gösterebilir.

Component Management yönetim konsolu: Administrative Tools menüsünde yer alan, servis verilen bileşenlerinizi izlemek ve yapılandırmak için kullanabileceğiniz araç.

243Terimler Sözlüğü

Page 248: Yazilim Proje BilgeAdam

composite control (kompozit kontrol): (1) Diğer kontrollerden meydana gelen ve UserControl base class’ından miras alan, kullanıcı tarafından yazılan bir kontrol. (2) Tamamlayıcı kontrolleri içerebilen bir kontrol; tamamlayıcı kontroller, kontrolü tanımlayan sınıf dosyasındaki kod aracılı-ğıyla kompozit kontrole eklenir. Sınıf dosyası, uygulamalar arasında paylaşılabilen bir .dll dosya-sına derlenir ve isteğe bağlı olarak GAC’ye (global assembly cache) kurulabilir.

composition: Bir ilişkili tablolar setinin XML verilerine dönüştürülme süreci.

compression (sıkıştırma): Dijital bir medya dosyasından veya akışından, boyutunu ve kullanılan bant genişliğini azaltmak üzere gereksiz verilerin kaldırılması süreci.

Computer Management konsolu: Administrative Tools menüsünde yer alan, bilgisayarınızın çeşitli bölümlerini (Message Queuing de dahil olmak üzere) izlemek ve yapılandırmak için kulla-nabileceğiniz araç. Bu araç Start > Run komutundan sonra compmgmt.msc komutu girilerek de başlatılabilir.

configuration management (konfigürasyon yönetimi): Bir uygulamanın nasıl kurulacağının ve yapılandırılacağının yönetimi.

conflict resolver (çakışma çözücü): Birleştirme replikasyonunda meydana gelebilecek çakış-maları çözmek için tasarlanmış bir .NET Framework (managed code) veya COM (unmanaged code) bileşeni.

Connection nesnesi: Bir veri kaynağına bir bağlantının temsili.

connection pool (bağlantı havuzu): Sürekli bağlantı oluşturma ve kaldırma sonucu doğan za-man kaybını azaltan, yeniden kullanılabilecek bağlantıların bir koleksiyonu.

connection pooling (bağlantı havuzunda toplamak): Veritabanına bir talep yapıldığında yeni-den bağlantıları kullanmak yerine mevcut etkin bağlantıları yeniden kullanma süreci.

connection string (bağlantı string’i): Bir veri kaynağına bağlanmak için gereken, veritabanı su-nucu adı, veritabanı adı, kullanılacak kimlik bilgileri tipi gibi bilgiler. Tüm ODBC ve OleDB uyumlu veritabanları (tüm ana tedarikçilerin veritabanları) bir bağlantı string’i kullanır.

constraint (kısıtlama): Bir tip parametresi üzerinde yer alan, ona sağlayacağını tip argümanını kısıtlayan bir koşul. Bir kısıtlama, tip argümanının belirli bir interface’e uygulamasını, belirli bir class olmasını veya belirli bir class’tan miras almasını, erişilebilir parametresiz bir yapılandırıcıya sahip olmasını veya bir referans tipi ya da bir değer tipi olmasını gerektirebilir. Bu kısıtlamaları birleştirebilirsiniz ama en fazla bir class belirtebilirsiniz.

consumers (tüketiciler): Bir bileşeni kullanacak olan kod parçası veya mimari.

container control (konteyner kontrol): Panel kontrolü, GroupBox kontrolü veya TabControl kontrolü gibi diğer kontrolleri içerebilen bir kontrol.

content page (içerik sayfası): Standart bir .aspx sayfasına çok benzeyen ama bir master sayfa-da konumlandırılmış ContentPlaceHolder kontrolleri için içerik sağlayan bir sayfa.

content placeholders (içerik yer tutucuları): Bir master sayfanın verilerin, kontrollerin ve içerik sayfasına özgü diğer çıktıların yerleştirileceği bölgelerindeki yer tutuculara karşılık gelir. Bir içerik yer tutucu, içeriği barındırmak için ContentPlaceHolder kontrolünü kullanır. Bir tek master sayfaya birden fazla içerik yer tutucu uygulanabilir.

context-sensitive help (bağlama duyarlı yardım): Bağlama duyarlı yardım, genel yardımdan farklı olarak, istenen bağlama özel yardıma karşılık gelir. Bu yüzden, eğer odak bir ürün numarası metin kutusundaysa, görüntülenen yardım ürün numarasındaki beklentilere yoğunlaşacaktır.

244 Ek - A

Page 249: Yazilim Proje BilgeAdam

continuous integration (devam eden entegrasyon): Test durumlarını geliştirilen ve kullanıla-bilir çeşitli bileşenler olarak çalıştıran bir test stratejisi. Devam eden entegrasyon testi stratejisi, hataları sürecin erken safhalarında bulacak ve ayıklanmalarını kolaylaştıracaktır.

contract: Bir Service Broker uygulamasında bulunan, bir konuşma için izin verilen mesaj tiplerini ve bir mesaj tipini kullanmasına izin verilen uç noktayı tanımlayan bir bileşen.

control (kontrol): Görsel bir arayüze sahip ve bir form veya konteyner kontrolünde barındırılabi-len bir bileşen. Kontroller, ortak bir işlevsellik oluşturmak üzere birlikte çalışan özellikleri, metotları ve olayları içerir. Button, TextBox ve Label, kontrollere örnektir.

control state (kontrol durumu): Görünüm durumundaki gibi devre dışı bırakılamayan özel bir kontrol içinde depolanmış veriler.

controller (denetleyici): Test agent’larını kontrol etmek için kullanılan bir bilgisayar. Denetleyi-ciler agent’ları başlatır ve durdurur. Ayrıca, gözden geçirilmek üzere performans ölçümlerini de toplarlar.

conversation (konuşma): Bir Service Broker uygulamasındaki uç noktalar arasında, tek yönlü veya iki yönlü sıralı mesaj takası.

cookie (kurabiye): Bir web sunucusunun bir web istemcisinde depoladığı veriler. Web istemcileri her sayfa talebinde kurabiyeleri sunucuya geri aktarır ve bu sayede, sunucunun bir sitedeki farklı sayfaları ziyaret eden kullanıcıyı izlemesine imkan verir.

cooperative multiprocessing (müşterek çoklu işleme): SQL Server’ın bir işlemci üzerinde ça-lıştırılacak thread’leri zamanlamak için dahili olarak kullandığı süreç. Bu süreç, bir işlemci üzerin-de bir seferde bir tek thread’in çalıştırılmasını sağlar ve kaynaklar üzerinde bellekte yer ayrılma-sını bekleyen thread’lerin bir işlemciyi tekellerine almamalarını sağlamak üzere thread akışlarını yönetir.

Copy Files task: Bir log gönderme süreci sırasında, dosyaların birincil bir sunucudan ikincil bir sunucuya kopyalanmasından sorumlu seçenek.

copy-on-write: Verilerin zaman içinde bir noktadaki durumunu oluşturmak üzere, bir veri sayfası-nın önceki görüntüsünün bir DataBase Snapshot’a kopyalanması için kullanılan teknoloji.

corrupt page quarantine (bozuk sayfa karantinası): Bir sayfayı bozulmuş olarak işaretleyen süreç. Tablonun veya veritabanının tamamını çevrim dışına almak yerine, tabloya karşı gerçek-leştirilen sonraki eylemlerin işaretlenen sayfayla etkileşime girmek zorunda kalmamasını sağlar.

covering index (kapsayan indeks): Bir sorguyu bütünüyle karşılamak için kullanılan bir indeks.

crawl: Bir tam metin indeksinin tam veya kısmi olarak doldurulmasını sağlayan süreç.

cross-page posting: Bir kontrol, kontrolün tanımlandığı web sayfasından farklı bir web sayfasına post back yapacak şekilde yapılandırılır.

cross-tabulation (çapraz tablolama): Satırların sütunlara dönüştürüldüğü genel bir mesleki ra-por biçimi.

culture (kültür): Geliştirmede bu terim, bölgesel dile ve biçimlendirme farklılıklarına karşılık gelir. Örneğin ABD’de konuşulan İngilizce, İngiltere veya Avustralya’da konuşulan İngilizceden biraz farklıdır. Her ülke, para birimi ve biçimlendirmesi için de farklı standartlara sahip olabilir. Örneğin ABD’de bir sayı 12,345.67 biçiminde yazılırken, Avrupa’nın bazı bölümlerinde virgül ve nokta işaretleri farklı şekilde kullanılır ve aynı sayı 12.345,67 biçiminde yazılır.

current culture (geçerli kültür): Uygulamanın halihazırda altında çalıştırılmakta üzere yapılan-dırıldığı kültür. Örneğin tr-TR

245Terimler Sözlüğü

Page 250: Yazilim Proje BilgeAdam

current UI culture (geçerli UI kültürü): Görsel arayüz elementlerinin çoğunu görüntülemek için kullanılan kültür. Bu, geçerli kültür ile aynı olabilir veya aynı olmayabilir.

custom action (özel eylem): Bir Windows Installer kurulumunun Install, Commit, Rollback veya Uninstall aşamasında çalıştırılan kod. Özel eylemler Installer class’larında yazılır ve kurulacak projelere eklenir.

custom control (özel kontrol): Kullanıcı arayüzünü render etmek için kendi kodunu sağlayan, kullanıcı tarafından yazılan bir kontrol.

custom exception (özel istisna): Bir özel exception, System.Exception’dan türetilen bir class’tır ve bir exception hakkında ilave bilgileri yakalamak ve nakletmek için gerekli ilave özelliklere ve metotlara sahiptir.

custom Web server control (özel Web sunucusu kontrolü): Kullanıcı arayüzü ve ilişkili işlev-selliği kapsülleyen sunucu taraflı bir bileşen. Özel bir web sunucusu kontrolü, sizin oluşturduğu-nuz bir kontroldür. Web sunucusu kontrolleri System.Web.UI.Control class’ından türetilir.

cyclomatic complexity: Bir uygulamayı meydana getiren elementler ve bileşenler arasındaki bağımsız çizgi ve yol sayısını kullanarak bir uygulamanın karmaşıklığını ölçmek için kullanılan matematiksel bir araç.

cyclomatic complexity: Thomas McCabe tarafından geliştirilen, karmaşıklığı ölçmek için kul-lanılan bir mekanizma. Bir yazılım grafiği üzerinde bağımsız yolların sayısına göre nümerik bir değer çıkarır.

DDAC: Bkz. Dedicated Administrator Connection.

DACL (discretionary access control list): Bir nesne üzerinde atanan veya reddedilen erişim izinleri için kullanıcıları ve grupları tanımlayan bir yetkilendirme kısıtlama mekanizması.

Data Access Layer (DAL): Veritabanına bir arayüz sağlayan bir veya daha fazla sınıf. Mantığı kendi sınıf setine ayırmak, mesleki mantığı ve veri erişimini kullanıcı arayüzünden ayırma süreci-nin bir parçasıdır. Katmanlı mimaride oldukça fazla kullanılan bir yapıdır Veri erişiminde kontrolün tek bir noktadan yapılabilmesini sağlar.

data binding (veri bağlama): Kontrol ve veri kaynağı arasında iki yönlü iletişimi uygulayan bir form üzerindeki bir kontrolde bulunan verileri görüntüleme kavramıdır. Birinde yapılan değişiklik-ler diğerini etkiler.

data definition language (DDL) trigger: CREATE, ALTER ve DROP gibi DDL işlemlerine cevap olarak ateşlenen trigger.

Data Encryption Standard (DES): Şifre kırma saldırılarına karşı savunmasız olan, nispeten kısa anahtar uzunluklarını kullanan bir simetrik şifreleme algoritması.

data file (veri dosyası): Verileri ve tablolar ve indeksler gibi nesneleri içeren bir dosya. (Bkz. log dosyası.)

data manipulation language (DML) trigger: INSERT, UPDATE ve DELETE işlemlerine cevap olarak ateşlenen trigger.

data storage (veri depolama): Uygulamanızın verilerinin nasıl depolayacağını ve onlara erişim sağlayacağını temsil eden depolama.

Data Transfer Object: Bir n katlı (tier) uygulamada, katlar arasında verileri transfer etmek için kullanılan bir nesne. Genel kullanımı, istemci ve mesleki katlar arasındaki verileri içerir.

246 Ek - A

Page 251: Yazilim Proje BilgeAdam

DataAdapter: DataSet’i doldurmak ve veri kaynağını güncellemek için kullanılan SQL komutları setini ve bir veritabanı bağlantısını temsil eder.

Database Engine Tuning Advisor (DTA): SQL Server 2005 ile birlikte gelen bir ayarlama aracı. Girdi olarak bir SQL Server Profiler izini alır ve indeksler, istatistikler veya bölümleme gibi yapısal değişikliklerin sorgu performansını geliştirip geliştirmeyeceğini belirlemek için bu izi canlı bir veri-tabanına karşı analiz eder.

Database Mail hesabı: SQL Server’ın Simple Mail Transfer Protocol (SMTP) sunucusuna e-pos-ta mesajları göndermek için kullandığı bilgileri içerir. Örneğin SMTP sunucu adı, kimlik denetimi tipi ve e-posta adresi gibi.

Database Mail profili: Database Mail hesaplarının bir koleksiyonu. Database Mail profilleri pri-vate veya public olabilir. Private profil için, Database Mail profili kullanabilecek kullanıcıların bir listesini sağlar. Bir public profil için, DatabaseMailUserRole msdb veritabanı rolünün üyeleri profili kullanabilir.

Database Mail: SQL Server 2005 veritabanı motorundan mesaj göndermek için yeni çözüm.

database master key: Bir veritabanındaki sertifikaların ve anahtarların şifresini çözmek için veri-tabanı düzeyinde oluşturabileceğiniz, isteğe bağlı simetrik anahtar.

database mirroring role: Bir veritabanı mirroring oturumunda her bir katılımcının işleyiş durumu-nu tanımlar. Üç olası rol vardır: Principal, mirror ve witness.

database mirroring session: Üç işlem kipinden (High Availability, High Performance veya High Protection) biri kullanılarak veri takası için yapılandırılmış bir principal, mirror veritabanı ve isteğe bağlı bir witness sunucu.

database mirroring: Bir principal ve mirror veritabanı ve isteğe bağlı bir witness sunucu arasın-da yapılandırılan, çok kullanışlı bir SQL Server 2005 teknolojisi. Verilerin senkronizasyonunu ve veritabanı şemasını sağlar ve otomatik başarısızlık seçeneğini sunar.

database partners (veritabanı ortakları): Bir database mirroring oturumuna katılan principal ve mirror veritabanı çifti için kullanılan terim.

database restore (veritabanı geri yükleme): Tüm verileri ve log sayfalarını belirtilen bir yedek-ten belirtilen bir veritabanına kopyalayan (veri kopyalama aşaması) ve yedekte log’a kaydedilen tüm transaction’ları ileri saran (yineleme aşaması), çok aşamalı bir süreç. Bu noktada, varsayılan durumda bir geri yükleme işlemi, tamamlanmamış transaction’ları geri alır (geri alma aşaması) ve veritabanının kurtarılmasını tamamlar ve kullanıcıların kullanımına açar.

database role (veritabanı rolü): Her bir kullanıcı veritabanı tarafından sağlayan yerleşik verita-banı rolleri seti. Yönetimi iyileştirmek üzere, veritabanı rolünü kullanarak veritabanı kullanıcılarını gruplandırabilirsiniz. Ayrıca, veritabanı kullanıcılarını gruplandırmak ve her bir grup bazında izin-ler atamak için kendi veritabanı rollerinizi de oluşturabilirsiniz.

database schema (veritabanı şeması): Bir veritabanındaki ilişkili verilerin, verilerin nasıl depo-landığı, birbirleriyle nasıl ilişkili olduğu ve nasıl kısıtlandığını da içeren yerleşimi.

Database Snapshot: Bir kaynak veritabanının zaman içinde bir noktadaki, salt okunur versiyonu. Bir Database Snapshot’tan döndürülen veriler, Database Snapshot’ı oluşturduğunuz zamandaki örneğe sabitlenir.

DataColumn: Bir DataTable içinde bir veritabanı tablosundaki sütunu temsil eden nesne.

DataColumn: Bir DataTable’da tutulacak verileri tanımlayan bir nesne.

247Terimler Sözlüğü

Page 252: Yazilim Proje BilgeAdam

data-format validation (veri biçimi geçerlik kontrolü): Verinin kabul edilebilir olup olmadığını belirlemek üzere girdinin biçimini kullanan bir geçerlik kontrolü tipi.

DataRow: Bir DataTable’da tutulan verileri içeren bir nesne.

DataSet: Tablolarla ve ilişkilerle bir ilişkisel veritabanı gibi yapılandırılmış verilerin bellek içi tam-ponu.

DataTable: Bir DataSet içinde, döndürülen verilerin bir tek setini temsil eden nesne.

DataView: Bir DataTable içindeki verilerin sıralanabilen, filtrelenebilen ve belirli bir durumdaki (silinen tüm kayıtlar gibi) kayıtları görüntüleyecek şekilde ayarlanabilen, özelleştirilmiş bir görü-nümü.

DDL trigger: Bkz. data definition language (DDL) trigger.

deadlock detection: SQL Server’ın bir deadlock’ı çözmek üzere deadlock kurbanını seçmek için kullandığı algoritma.

deadlock trace: SQL Trace aracılığıyla yakalanan, bir deadlock tarafından oluşturulmuş süreç-leri ve transaction’ları tanımlayan özel bir iz.

deadlock victim (deadlock kurbanı): Bir deadlock’ı çözmek üzere sonlandırılmak için seçilen süreç.

deadlock: İki sürecin, veriler üzerinde rekabet halindeki kilitleri ele geçirdiğinde, süreçlerden hiçbiri diğerinin transaction’ı tamamlamasına izin vermediğinde meydana gelen bir durum.Farklı transaction’ların çakışması sonucu ortaya çıkar.

declarative RBS demands (deklaratif RBS talepleri): Bir metoda bir attribute olarak deklare edilen ve çalışma zamanına, metodu çalıştırmadan önce bir erişim kontrolü gerçekleştirmesi tali-matını veren erişim kısıtlamaları.

Dedicated administrator connection (DAC): SQLCMD aracılığıyla erişilebilen özel bir TCP uç noktası olarak oluşturulan bir bağlantı. Bir DAC kullanarak bir veritabanı yöneticisi, sunucu diğer bağlantılara izin vermek için çok meşgul olsa bile daima bir SQL Server’a bağlanabilir.

default filegroup (varsayılan dosya grubu): Bir veritabanı nesne oluşturduğunuzda bir dosya grubunu belirtmezseniz, nesne varsayılan dosya grubuna ayrılacaktır.

defense-in-depth (derinlemesine savunma): Sisteminizin bir açık durumunda bile korunması-na devam edilmesi için birden fazla koruma düzeyi sağlayan güvenlik prensibi.

deflate: Verileri verimli şekilde ve patentsiz olarak sıkıştırmak için kullanılan bir sektör standar-dı.

delegate (delege): Bir metodu eşzamanlı veya eşzamansız olarak çağırmak için kullanılabilen bir type-date fonksiyonu.

dependent assembly (bağımlı assembly): Bir işlevi doğru şekilde sunmak için bir assembly’nin gerektirdiği diğer bir assembly.

deployment model (dağıtım modeli): Bir uygulamadaki bileşenler arasında bulunan bağımlılık-ları belgeleyen bir diyagram. En azından, uygulamadaki çeşitli bileşenleri ve bunların arasında aktarılan mesajları içerir. Bazı durumlarda, bileşenler ve bileşenlerin dağıtılacağı donanım plat-formları arasında bir eşlemeyi de içerebilir.

deployment plan (dağıtım planı): Uygulama geliştirme döngüsünün tasarım aşamasında oluş-turulması gereken bir plan. Bir uygulama dağıtım planı, bir uygulamanın hedef çalıştırma ortamı-na nasıl dağıtılacağının ayrıntılarını içerir.

248 Ek - A

Page 253: Yazilim Proje BilgeAdam

dequeue (kuyruktan kaldırmak): Mesajların bir kuyruktan kaldırılması süreci.

derived class (türetilmiş sınıf): Bazı temel fonksiyonları bir base class’tan türeten sınıf. Eğer Class B, Class A’dan türetilirse, Class B derived class olarak kabul edilir.

derived table (türetilmiş tablo): Bir tablodan seçilebilen ve bir tablo gibi eklenebilen özel bir tür alt sorgu.

DES (Data Encryption Standard): Şifre kırma saldırılarına karşı savunmasız olan nispeten kısa anahtar uzunluklarını kullanan bir simetrik şifreleme algoritması.

deserialization: Daha önce serialize edilmiş byte sekansını bir nesneye dönüştürme süreci.

design pattern (tasarım deseni): Sık karşılaşılan belirli bir sorun için uygulanan standart bir çözüm. Uygulamanızı tasarlarken bir veya daha fazla tasarım deseni uygulayarak, uygulama domain’inizdeki sorunları bilmeyen ama tasarım desenlerinizi bilen kişiler için tasarımınızı daha okunabilir kılacaksınız.

destination (varış noktası): Bkz. hedef.

deterministic function (deterministik fonksiyon): Çağrıldığında daima aynı değeri döndüren bir fonksiyon. Belirtilen bir açının trigonometrik kosinüsünü döndüren yerleşik SQL Server fonksi-yonu COS, deterministik fonksiyona bir örnektir. (Bkz. nondeterministic function).

device-specific rendering (aygıta özgü rendering): Bir aygıt tipine göre bir kontrol için rendering’i belirtme becerisi.

dialog (iletişim): İki uç nokta arasında meydana gelen konuşma.

differential backup: Son tam yedeklemeden sonra değişmiş olan tüm veri sayfalarını yedekle-yen bir süreç.

differential restore: Bir differential backup kullanan bir geri yükleme işlemi.

DiffGram: DataRow nesnesinin bilgileri de dahil olmak üzere, DataSet nesnenizin tüm verilerini içeren bir XML belgesi.

Diffgram: Hem orijinal, hem de güncellenmiş değerleri içeren, verilerin bir XML temsili. Bu, DataSet’lerin XML’e serialization’ı için varsayılan biçimdir.

digital signature (dijital imza): Dijital imza, geleneksel kağıt tabanlı imzayı alır ve onu elektronik bir parmak izine dönüştürür. Bu parmak izi veya kodlanmış mesaj hem mesaj veya belge, hem de imzalayıcı için benzersizdir. Dijital bir imza, imzalayan kişinin gerçekten de mesajın göndericisi olduğunu gösterir. İmzalandıktan sonra belge üzerinde yapılan herhangi bir değişiklik, imzayı geçersiz kılar ve dolayısıyla, sahtekarlığa karşı koruma sağlar. Dijital imzalar, organizasyonların imza atanın gerçekliğini, sorumluluğunu, veri doğruluğunu ve belgelerin ve transaction’ların red-dedilmemesini sağlamasına yardımcı olur.

Direct Internet Message Encapsulation (DIME): Uygulama tarafından tanımlanan rastgele tip ve boyuttaki bir veya daha fazla payload’u bir tek mesaj yapısına kapsüllemek için kullanılabile-cek hafif sıklet, ikilik mesaj biçimi. WSE 3.0’da, DIME’nin yerini MTOM alır.

discretionary access control list (DACL): Bir nesne üzerinde atanan veya reddedilen erişim izinleri için kullanıcıları ve grupları tanımlayan bir yetkilendirme kısıtlama mekanizması.

Distributed Authoring and Versioning (DAV): Geliştiriciler ekip senaryolarında çalışırken Web sitesi geliştirmeyi basitleştiren, HTTP/1.1’e yapılan eklentiler seti.

DMFs: Bkz. Dynamic Management Functions.

249Terimler Sözlüğü

Page 254: Yazilim Proje BilgeAdam

DML trigger: Bkz. data manipulation language (DML) trigger.

DMVs: Bkz. Dynamic Management Views.

Document Object Model (DOM): Yapıyı tanımlayan W3C tarafından sağlanmış standartları be-lirler ve XML belgeleri için çok çeşitli ortamlarda ve uygulamalarda kullanılabilecek standart bir programlama arayüzü sağlar.

domain: Windows Server 2003 güvenliğinde, görüntüleme ve yönetim amacıyla gruplandırılan ve ortak bir Active Directory dizin servisleri veritabanını paylaşan bir bilgisayar koleksiyonu.

drag-and-drop (sürükle ve bırak): Kullanıcının sol fare düğmesine basarak bir form içindeki ve-rileri tuttuğu, form boyunca sürüklediği ve sol fare düğmesini bırakarak diğer bir kontrolün üzerine bıraktığı bir işlem.

driver (sürücü): Bir entegrasyon testi sırasında iki veya daha fazla bileşen arasındaki koordinas-yonu ve akışı yöneten bir kod parçası.

DTA: Bkz. Database Engine Tuning Advisor.

Dynamic management Functions (DMFs): Sorgu planları gibi ilave verileri görüntülemek için SQL Server araçlarıyla çalışan bir fonksiyon seti.

Dynamic Management Views (DMVs): SQL Server araç çeşitleriyle dinamik olarak doldurulan bir görünüm seti. Bu görünümler çok sayıda dahili işlem boyunca ayrıntılı bir görünüm sağlar.

Eedge case (kenar durumu): Belirli bir kullanım durumu sırasında bir kullanıcının izleyebileceği alternatif bir yol. Bu yol genellikle genel, başarılı yol değildir. Kenar durumları, test etmeniz gere-ken eylemleri temsil ettikleri için önemlidir. Ayrıca alternatif kullanım durumu (alternate use case) olarak da adlandırılır.

edge case (kenar durumu): Bir metot veya class için parametrelerin uçlarından birinde meyda-na gelen bir olay veya durum. Bu uç durum; minimum değer, maksimum değer, boş değer ya da null’dan kaynaklanabilir.

Edge Table: Sekmeli biçimdeki bir XML ağacı için yapıyı temsil eden bir yapı. Her satır, XML yapısını oluşturan node’ların her birinin özelliklerini tanımlar.

encapsulation (kapsüllemek): Bir nesnenin dahili üyelerini gizleme ve sadece istemcinin ihtiya-cı olanları açığa çıkarma becerisini içerir.

encode (kodlamak): Birinden diğerine dönüştürme sürecine karşılık gelen bir terim. Multimedya dünyasında en tipik kullanımı, verilerin HTTP uyumlu olmayan bir biçimden HTTP üzerinden gön-derilebilecek bir biçime dönüştürülmesidir.

encoding (kodlama): Bir XML elementini belirli bir bağlamda tanımlamak için belirli attribute’ların bir XML elementine eklenmesi süreci.

encryption (şifreleme): Bilgileri çözmek için anahtara sahip olmayan kişiler tarafından bilgileri okunmaz kılmak üzere gizleme süreci.

encryption key (şifreleme anahtarı): Verileri şifrelemek ve çözmek için kullanılabilecek bir de-ğer. Simetrik şifreleme kullanıldığında, paylaşılan sır (shared secret) olarak da adlandırılır.

endpoint (uç nokta): Transaction’ları işlemek üzere SQL Server motoruna erişmesi gereken süreçler tarafından kullanılan bir bağlantı mekanizması. Bir konuşma uç noktası, bir konuşmaya katılan iki veritabanı örneğini tanımlar. Bir Service Broker uç noktası, Service Broker uygulama-larının SQL Server örnekleri üzerinden mesaj göndermesini ve almasını sağlayan daha genel bir

250 Ek - A

Page 255: Yazilim Proje BilgeAdam

SQL Server uç noktası için bir payload tipidir. Database mirroring için, database mirroring oturu-muna dahil olan her örnek üzerinde TCP uç noktaları oluşturursunuz.

enqueue (kuyruğa almak): Bir kuyruğa mesaj yerleştirme süreci.

enterprise services: COM+ servislerini kullanarak bileşen tabanlı uygulamalar inşa etme meto-du. Bunlar, transaction’lar ve nesne havuzu gibi servislerden yararlanabilirler.

entity relationship diagram (varlık ilişkisi diyagramı): Bir varlık ilişkisi diyagramı (ER), verita-banları gibi ilişkisel sistemleri modellemek için kullanılan bir diyagramdır. ER diyagramları, genel-likle varlıklardan (entity) ve bunların arasındaki ilişkilerden meydana gelir.

enumaration veya enum (numaralandırma): Birlikte gruplandırılmış, adlandırılmış sabitlerin bir listesi.

event (olay): Bir kontrolden uygulamanın geri kalanına gönderilen ve olayla aynı yapıya sahip metotlar tarafından yönetilebilen bir mesaj.

event handler (olay yöneticisi): Bir olay tetiklendiğinde çalıştırılan metot. Bir event handler, event’ı ile aynı yapıya sahip olmalıdır.

event log: Bir uygulamanın durumu hakkındaki bilgileri kaydetmesini ve kalıcı olarak tutmasını sağlayan bir mekanizma.

event provider (olay sağlayıcı): Bir web olayını depolayarak veya olayın yöneticisine bildirerek web olayını yöneten bir class.

evidence (kanıt): Bir assembly’nin tanımlanma şekli; assembly’nin depolandığı konum, assemb-ly kodunun bir hash’i veya assembly’nin imzası gibi.

exception (istisna): Uygulamanın çalıştırılması sırasında meydana gelen bir hatayı temsil eder.

exception bubbling (istisna kabarcığı): İlk kez Internet Explorer’daki olay mekanizması ta-nımlanırken kullanılan, event bubbling teriminden türetilen bir terim. Exception bubbling, bir exception’ın bir try/catch ifadesi tarafından yakalanana kadar çağrı yığınında (call stack) yukarı doğru seyahat etmesi sürecine karşılık gelir.

explicit localization (açık yerelleştirme): Bu, kontrolleri global kaynaklara elle ilişkilendirir. Bir-den fazla sayfa üzerinde bir tek kaynağı görüntülemek istediğiniz açık yerelleştirmeyi kullanma-lısınız.

expression column (deyim sütunu): Türetilmiş veya hesaplanmış sütun olarak da bilinir. İçeri-ğin bir formüle dayandığı ve değiştirilebilecek atomik verileri temsil etmeyen bir DataColumn’dur. Deyim sütunları, gereken veriler doğru biçimde olmadığında kullanılabilir.

extended control (genişletilmiş kontrol): Önceden var olan bir kontrolü miras alan ve bu kon-trolün işlevselliğini kapsayan, kullanıcı tarafından yazılmış bir kontrol.

extender class (uzatıcı sınıf): Windows form uygulamalarında, bir konteynerin içindeki kontrol-lere özellikler eklemek için kullanılan bir kontrol.

Extensible Markup Language: Bkz. XML.

external fragmentation (harici fragmantasyon): İndeks sayfalarının fiziksel olarak bozukluk derecesi.

extraction, transformation ve loading (ETL): Çıkarma, dönüşüm ve yükleme işlevlerini ger-çekleştirmek üzere kullanılan araçlar için genel bir terim. SQL Server 2000 Data Transformation Services (DTS) ve SQL Server 2005 Integration Services (SSIS), ETL araçlarına örnektir.

251Terimler Sözlüğü

Page 256: Yazilim Proje BilgeAdam

extreme programming (aşırı programlama): Kısa dönemde teslim edilecek projelere ve tamam-lanmamış veya değişmekte olan gereksinimlere sahip projelerin üstesinden gelmek için yüksek düzeyde iletişime odaklanan bir yazılım geliştirme disiplini. Daha fazla bilgi için http://www.xprogramming.com adresini ziyaret edin.

FFagan Inspection: Michael Fagan tarafından tanıtılan ve bir kodun gözden geçirilmesinde nele-rin çalıştığı ve nelerin çalışmadığı üzerine yaptığı kapsamlı araştırmaya dayanan, resmileştirilmiş bir kod gözden geçirme süreci.

file system (dosya sistemi): Dosyaların klasörlerde ve sürücülerde depolanması için işletim sistemi tarafından sağlanan mekanizma.

filegroup (dosya grubu): Veritabanı yöneticilerinin veri dosyalarını gruplandırmasını ve bu dos-yaları mantıksal bir birim olarak yönetmesini sağlayan mantıksal bir yapı.

filegroup backup: Bir veritabanı içindeki her bir dosya grubunu yedekleyen bir süreç.

filegroup restore: Bir veya daha fazla dosya grubunu bir veritabanına geri yükleyen bir süreç.

filter (filtre): Uygulamalarda, dosya seçimi sırasında, sadece belirli uzantılı dosyaların görüntü-lenmesini sağlar.

filtering exceptions (istisnaları filtrelemek): Genel exception tiplerinden önce belirli excepti-on tiplerinin yakalanmasını sağlamak üzere Catch koşullarının sıralanması süreci. Örneğin Sq-lException, FileNotFoundException.

fire and forget: Bir metoda bir çağrıyı başlatmak ve metot bir exception fırlatsa bile, ondan hiçbir sonuç elde etmemek.

fixed server role (sabit sunucu rolü): Oturum açmalara yönetimsel ayrıcalıkları atamanızı sağ-layan, sysadmin veya securityadmin gibi bir rol.

flat file (düz dosya): Dosyadaki her satırın bir veritabanındaki kayda eşdeğer olduğu metne verilen ad.

FLWOR expression: Geliştiricilerin belirtilen bir filtreye eşlenen bir node seti boyunca tekrarla-nan karmaşık sorgu mantığını yazmasını sağlayan, en önemli XQUERY deyimi.

foreign key: İki tablo arasındaki ilişkiyi tanımlamak için kullanılan ilişkili bir tablodan elde edilen primary key değeri.

frame rate (kare hızı): Bir video akışında görüntülenen saniye başına kare sayısı. Belirli bir kare sayısının üzerinde, çıplak gözle aradaki kalite farkı görülemez.

framework (platform): Geliştiriciyi çok sayıda mimari çalışmayla uğraşmaktan kurtaran, base class’lar ve bileşenler seti.

full database backup (tam veritabanı yedeklemesi): Verileri depolamak için ayrılmış bir verita-banındaki tüm veri sayfalarını yedekleyen bir süreç.

full database restore (tam veritabanı geri yüklemesi): Daha önceden mevcut olan her şeyi değiştirerek tam bir yedeği geri yükleyen bir süreç.

Full recovery model: Tüm işlemlerin transaction log’una kaydedildiği ve veritabanı motorunun log’u asla silmediği bir kurtarma modeli. Transaction log’u silmek için transaction log yedekleme-sini gerçekleştirmeni gerekir. Full recovery model, bir veritabanını başarısızlık noktasına (veya SQL Server 2005 Enterprise Edition’da daha önceki bir noktaya) geri yüklemenize izin verir. (Bkz. Bulk-Logged recovery model; Simple recovery model.)

252 Ek - A

Page 257: Yazilim Proje BilgeAdam

full-text catalog (tam metin katalog): Bir veya daha fazla tam metin indeksini içeren harici bir depolama yapısı.

full-text index (tam metin indeks): Bir tam metin katalog içinde yer alan harici bir yapı. Bir tam metin indeks, bir tablonun indekslenmesi için belirtilmiş bir veya daha fazla sütunda bulunan bir sözcük setini temsil eden token’ların ters çevrilmiş, sıkıştırılmış bir yığınıdır.

fully trusted (tam güvenilir): Code access security (CAS) izin kontrollerinden muaf tutulan bir assembly.

function (fonksiyon): Bir tablo değişkenini veya skaler bir değeri döndürebilen ama bir verita-banının durumunu değiştiren herhangi bir komutu çalıştırmasına izin verilmeyen, programsal bir nesnedir.

functional requirement (fonksiyonel gereksinim): Bir geliştiricinin perspektifinden bir özelliği tanımlayan gereksinim. Bir geliştirici, spesifikasyonu veya gereksinimi gözden geçirebilmeli ve o spesifikasyonu uygulayabilmelidir.

functional specification (fonksiyonel spesifikasyon): Bkz. Fonksiyonel gereksinim.

Ggarbage collection: Referans olmaktan çıkarılan öğelerin kaldırılması aracılığıyla heap’teki bel-leğin kurtarılması.

generic type (jenerik tip): Çeşitli veri tipleri için aynı işlevselliği gerçekleştirmek üzere uyarlanan bir tek programlama elementi.Örneğin; List<>,IEnumerable<>.

global resources (global kaynaklar): Bir uygulamada herhangi bir sayfadan erişilebilecek string’ler veya diğer nesneler. Globalizasyon bağlamında global kaynaklar, birden fazla dile çev-rilen ifadeler için merkezi bir depo sağlar.

globalization (globalleştirme): Bir uygulamanın belirli bir kültür için sayıları ve tarihleri biçimlen-dirmesini sağlama süreci.

granularity: Bilginin gerektirdiği veya açıklandığı ayrıntı düzeyi.

Graphics nesnesi: Çizim yüzeyini temsil eden bir nesne. Yazdırma (printing) işleminde, içeriğin sayfaya çizilmesi için Graphics nesnesi kullanılır.

gzip: İlave bilgiler taşımak üzere bir başlığa izin veren sıkıştırma algoritmasını açmak için kul-lanılan bir sektör standardının uzantısı. Uygulamadaki verileri *.zip formatında sıkıştırmak için kullanılır.

Hhash algorithm (hash algoritması): Orijinal veriler belirlenemeyecek şekilde verileri gizlemek için kullanılan bir şifreleme tekniği. Hash algoritmaları, sıklıkla parolaları korumak için kullanılır.

hash: Büyük bir veri parçasını özetleyen ve hash üretildikten sonra verilerin değiştirilmediğini doğrulamak üzere kullanılabilecek bir değer.Bu bilgiyi alabilmek için ise GetHashCode() metodu kullanılır.

heap: .NET Framework’ün, referans tipindeki değişkenler tarafından kullanılacak yeri ayırdığı, bellekteki bir yer. Ayrıca, heap’teki bellek garbage collection’a maruz kalır. Bu, yığında (stack) ayrılan değişkenlerden farklıdır.

heartbeat method (heartbeat metodu): Bir web servisin, harici uygulamaların servisin duru-munu kontrol etmesine izin veren bir metot. Metodun uygulaması, harici talepleri karşılamak için gereken dahili kaynaklar üzerinde bir kontrolü içermelidir.

253Terimler Sözlüğü

Page 258: Yazilim Proje BilgeAdam

hepler service (yardımcı servis): Tam metin indeksleri doldurmak ve tam metin sorgularını gerçekleştirmek için kaydedilmiş bir servis grubu. Bu servisler word breaker’ları, noise word dos-yalarını ve dil dosyalarını içerir.

hidden field (gizli alan): Bir web formu içinde depolanan ve kullanıcı sayfayı web tarayıcısında görüntülendiğinde kullanıcıya görünmeyen veriler.

hidden tables (gizli tablolar): SQL Server içinde bulunan ve depolama motoru tarafından tam anlamıyla tanınan tablolardır. Bu tablolara karşı doğrudan INSERT, UPDATE, DELETE veya SE-LECT ifadelerini uygulayabilirsiniz. Ayrıca indekslenemezler, yapıları değiştirilemez veya kendi-lerine karşı oluşturulmuş trigger’lara sahip olamazlar. Gizli tablolar bir görünüm aracılığıyla açığa çıkarılır.

High Availability işletim kipi: Bir principal, mirror ve witness gerektiren bir veritabanı mirroring işletim kipidir; verileri principal’dan mirror’a senkronize olarak transfer eder ve başarısız olduğun-da, witness sunucusuna erişilebildiği sürece, otomatik başarısızlık tespitine ve otomatik failover’a izin verir.

High Performance işletim kipi: Sadece bir principal ve mirror gerektiren bir veritabanı mirroring işletim kipi. Verileri principal’dan witness’a asenkron transfer eder ve sadece elle gerçekleştirilen failover’a izin verir.

histogram: Her değer aralığına tam olarak kaç satırın eşlendiğini, bir aralığın içine kaç satırın düştüğünü ve bir aralık içindeki değer yoğunluğunun bir hesaplamasını veya kopya değer örnek-lerini belirtir.

horizontal prototype (yatay prototip): Bkz. Mockup.

host evidence (host kanıtı): Assembly’nin host’unun, assembly’nin orijinini (uygulama dizini, URL veya site gibi) açıkladığını gösteren kanıt.

HTML server control (HTML sunucu kontrolü): Eşlenen HTML etiketine benzer ama aynı za-manda runat=”server” attribute’unu içerir ve programsal olarak erişebileceğini sunucu taraflı bir nesne sağlar.

HTTP endpoint (HTTP uç noktası): Geliştiricilerin, bir SQL Server 2005 veritabanı içindeki sto-red procedure’leri ve fonksiyonları, SOAP protokolü kullanılarak herhangi bir uygulamadan çağrı-labilecek web metotları olarak sunmasını sağlayan bir uç noktası tipi.

HTTP handler (HTTP yöneticisi): Özel dosya tiplerinden cevaplar üretmek için ASP.NET’i etkin-leştiren, IHttpHandler tabanlı bir class.

Hypertext Transfer Protocol (HTTP): Web sunucusundan web sayfalarını talep etmek ve web tarayıcısına cevapları geri göndermek için kullanılan, metin tabanlı bir iletişim protokolü.

IILogFormatter arayüzü: Enterprise Library’nin Logging Application Block’u içindeki biçimlendiri-ciler tarafından kullanılan arayüzün adı.

IMessageFormatter arayüzü: .NET’te MessageQueque class’ı tarafından bir biçimlendirici ola-rak kullanılmak üzere bir class’ın uygulaması gereken arayüz.

InnerException property (InnerException özelliği): Bu, exception’lar birbirine zincirlendiğinde bir Exception nesnesi üzerinde kullanılan bir özelliktir. Bazı durumlarda exception yakalanır ve yeni bir exception tipi örneklendirilir. Orijinal exception, yeni exception üzerinde bu özelliğe atan-malıdır.

InstallException: Bir Installer class’ı tarafından fırlatılabilen bir exception Bir özel eylemde Instal-lException exception’ının fırlatılması, kurulumun geri alınmasına neden olacaktır.

254 Ek - A

Page 259: Yazilim Proje BilgeAdam

Interop: Interoperation için bir kısaltma; managed ve unmanaged kodun birlikte çalışması anla-mına gelir. Office Interop buna örnek gösterilebilir. .Net ile yazılmayan bir bileşenin .Net ile birlikte kullanılmasını sağlar.

IsPostBack: Bir ASP.NET web sayfasında bulunan, verilerin web sunucusuna geri gönderilmek-te olup olmadığını veya sadece web sayfasının talep edilmekte olup olmadığını belirlemek için kullanılan bir özellik.

IV (initialization vector): Şifrelenmekte olan verilerin ilk bloğunu daha da gizlemek için simetrik şifreleme algoritmalarını kullanan veriler; bu, yetkisiz şifreleme çözümünü daha zor hale getirir.

IXmlSerializable arayüzü: Bir sınıfın, özel bir XML temsili sağlamak için uygulaması gereken arayüz.

İimmutable (değişmez): Bir immutable (değişmez) nesne, nesne oluşturulduktan sonra özellik-lerinin değiştirilemediği nesnedir.

imperative role-based security (RBS) talepleri: Kodunuzun içinde deklare edilen ve kodun belirli bölümlerine erişimi kısıtlamak için kullanılabilecek erişim kısıtlamaları.

impersonation (taklit etme): Bir süreci kaynaklara tanıtmak için son kullanıcının kimlik bilgilerini kullanma süreci. Örneğin bir web uygulamasının bir veritabanındaki bir tabloyu okuması gereki-yorsa ve sadece Managers grubunun üyeleri tabloyu okuma iznine sahipse, web uygulamasının tabloya erişmek için yetkilendirilmiş kullanıcıyı taklit etmesi gerekir.

implicit localization (dolaylı yerelleştirme): Bu, ASP.NET’in kontrolleri otomatik olarak yerel kaynaklarla ilişkilendirme becerisini tanımlar. Dolaylı yerelleştirme, sayfa sayfa çeviriler sağlama-nın en iyi yoludur.

index fragmentation (indeks fragmantasyonu): İndeks sayfalarının bozukluk derecesi veya indeks sayfalarının kısmi doluluk derecesi.

index population (indeks popülasyonu): Bir tek tam metin indeks için gerçekleştirilen bir inşa süreci. (Bkz. katalog popülasyonu.)

index rebuild (indeksin yeniden inşa edilmesi): İndeksin düşürülmesi ve yeniden oluşturulma-sıyla fragmantasyonun kaldırılması için bir indeksin yeniden inşa edilmesi süreci.

index reorganization (indeksin yeniden düzenlenmesi): Tablolar ve görünümler üzerindeki clustered ve nonclustered indekslerin leaf düzeyinin defragmantasyon süreci. Yeniden düzenle-me süreci, indeks sayfalarını küçültürken, leaf node’ların mantıksal, soldan sağa sırasına eşlen-mek üzere leaf düzeyindeki sayfaları fiziksel olarak yeniden sıralar.

indexed view (indekslenmiş görünüm): Daha hızlı performans için döndürülen verilerin disk üzerinde somutlaştırılması için bir clustered indeks üzerinde oluşturulan bir view.

infoset (XML Information Set): İyi biçimlendirilmiş (well-formed) bir XML belgesinin içerdiği bil-giler. Bir infoset’e sahip olması için XML belgesinin iyi biçimlendirilmiş olması ve namespace koşullarını karşılaması gerekir.

inheritance (miras): Bir sınıfın temel işlevselliğini ikinci bir sınıftan aldığı ve daha sonra bunu yeni metotlar, özellikler veya uygulamalar ekleyerek genişlettiği, iki sınıf arasındaki ilişki.

inheritance hierarchy (miras hiyerarşisi): Türetilmiş bir sınıf diğer bir sınıf için bir taban sınıf olarak davranabileceğinden, ilişkili tüm sınıflar arasında ağaç benzeri bir yapı oluşturmak müm-kündür. Bu yapı, miras hiyerarşisi olarak bilinir.

inherited permission (miras alınan izin): Bir nesneye parent nesnesinden aktarılan izinler.

255Terimler Sözlüğü

Page 260: Yazilim Proje BilgeAdam

initialization vector (IV): Şifrelenmekte olan verilerin ilk bloğunu daha da gizlemek için simetrik şifreleme algoritmalarını kullanan veriler; bu, yetkisiz şifre çözümünü daha zor hale getirir.

inner join (iç bağ): Bir sorgudaki birden fazla tabloyla çalışırken, her iki tablodan da eşlenen satırları döndüren bir bağ tipi. (Bkz. dış bağ.)

input parameter (girdi parametresi): Bir stored procedure veya fonksiyona aktarılan bir değiş-ken.

instrumentation (enstrümantasyon): Uygulamanın durumu, ilerleyişi ve sorunları hakkındaki bilgilerin uygun kitleye rapor edilebilmesi için bir uygulamanın içine stratejik olarak kod yerleştir-mek.

integrated security (entegre güvenlik): Windows Authentication olarak da bilinir. Bu güvenlik yöntemi, bir veri kaynağına erişmek için mevcut domain kimlik bilgilerini kullanır.

integration test (entegrasyon testi): Her bir uygulama bileşenini bir tek çözümde değerlendiren bir test. Bir entegrasyon testi, her bir birimin istendiği şekilde birlikte çalışıp çalışmadığını kontrol etmek için kullanılır ve bir test durumundan oluşturulur. Test durumu, sisteme girilen girdileri ve beklenen çıktıları tanımlar.

integrity (bütünlük): Bir mesajın aktarım sırasında değiştirilmediğini doğrulama süreci.

interface (arayüz): Arayüzü uygulayan tüm class’ların sağlaması gereken genel bir üye setini tanımlar.Tipler arasındaki sözleşmelerdir.

intermediate level (orta düzey): İndeksin root’unda bir tek sayfanın bulunduğundan emin olmak üzere, oluşturulan bir B-tree içindeki bir veya daha fazla düzey.

internal fragmentation (dahili fragmantasyon): İndeks sayfalarının kısmi doluluk derecesi.

interop assemblies (interop assembly’ler): Bir .NET uygulamasının bir COM bileşenini çağır-ması için bir callable wrapper’ın üretilmesi gerekir. Bir interop assembly, CLR’ın wrapper’ı üretmek için kullanabileceği, bir COM bileşeni tarafından açığa çıkarılan tipleri içeren bir .NET öğesidir.

isolated storage (izole edimiş depolama): Bir kullanıcının sisteminde, bir uygulama için yüksek düzeyde haklar gerektirmeksizin verileri depolamak için kullanılan ve kapsamı kullanıcı, assembly veya uygulama tarafından belirlenen, korunmuş bir yer. Örneğin serialization yapılmış bir dosyayı sadece o işlemi yapan kullanıcının veya o makine üzerindeki herhangi bir kullanıcının deseariali-ze yapmasını sağlamak, dosya başka bir yere kopyalandığı zaman güvenlik sebebi ile desearilize yapılmasını engellemek için kullanılabilir.

isolation levels (izolasyon düzeyleri): Veri ve sorgu bütünlüğünü garantileyen standart ANSI kilitleme davranışları.

iteration (yineleme): Bir öğe koleksiyonu boyunca ilerleme süreci. Örneğin IEnumerable

Jjitter: Multimedyada, veri akışının gecikmesindeki görülen değişim nedeniyle oluşan durum. Bu değişim, akışın görüntülenmesinde duraklamaya veya teklemelere neden olabilir. Bu sorunun en genel çözümlerinden biri, gelen akışın oynatımdan önce depolanması için bir tampon kullanmak-tır. Tampon, bir şok emici gibi davranır ve veri geliş hızındaki değişiklikler asıl oynatımı anında etkilemez.

job (iş): Çalıştırılacak bir veya daha fazla görev. İsteğe bağlı olarak bir işi, belirlenen bir zamanda veya bir kullanıcı eylemine ya da sistem koşuluna cevap olarak çalışacak şekilde yapılandırabilir-siniz. Örneğin her gün saat 15:00’te veritabanının yedeğinin alınması

256 Ek - A

Page 261: Yazilim Proje BilgeAdam

job schedule (iş programı): Bir işi bir tarih veya zaman tabanlı trigger’a göre otomatik olarak çalıştırmak için gereken çalıştırma parametrelerini sağlar.

job step (iş adımı): Çalıştırılacak bir kod bloğu. Her iş adımı genellikle bir tek ayrı mesleki işlemi çalıştırır.

KKerberos: Kimlik denetimi işlevselliğini sağlayan, markaya özgü Microsoft standardı.

kernel mode (çekirdek kipi): Çalışan thread’in normalden daha üst düzey izinlere sahip olduğu, CPU’daki bir kip. Genellikle çekirdek kipinin işleyişi, işletim sistemi tarafından gerektirilen fonksi-yonların performansıyla ilişkilidir.

keyed hash algorithms (anahtarlı hash algoritmaları): Hem göndericinin, hem de alıcının sa-hip olması gereken gizli bir anahtarı kullanarak hash’in şifrelenmesi yoluyla hash’in değiştirilme-sine karşı koruma sağlayan algoritmalar.

Llanguage file (dil dosyası): Bir tam metin indeksi veya tam metin sorgusu için dile özgü attribute’ları belirlemek üzere kullanılan bir dosya.

layers (katmanlar): Yüksel yeniden kullanılabilirlik gibi tasarım hedeflerinizi yerine getirmek için uygulamanızdaki kodun mantıksal bölümü. Katmanlar kullanıcı arayüzünü, middle tier’ı (ara kat) ve veritabanını içerir.

leaf level (leaf düzeyi): Bir indeks içindeki en alt düzey.

leaf node: Hiçbir child içermeyen bir node.

lease (kira): Bir istemci uygulaması üzerindeki uzak bir nesneye bir referans sağlamak için bir le-ase kullanılır. Bir lease, CLR (Common Language Runtime) garbage collector’ın (GC), uzak nes-neye yerel referanslar olmadığı durumda uzak bir nesneyi toplamasını engellemek için kullanılır.

Lightweight Transaction Manager: System.Transactions’ın bir parçası olarak uygulanan bu özellik, gerektiğinde bir (lightweight) transaction’ı tam dağıtılmış bir transaction’a terfi ettirir.

linked server (bağlı sunucu): Harici veri kaynaklarına (uzak bir SQL Server gibi) erişmenizi sağ-layan bir sunucu; sunucunuzdaki diğer bir örnek veya bir Access, Oracle ya da diğer bir veritabanı (yerel Transact-SQL kodunuzdan).

list (liste): Bir uygulamada kullanılabilecek, genellikle bir koleksiyon aracılığıyla kullanılan ilişkili nesnelerin bir grubu. Bir listeyle çalışan bir kontrol, genellikle listenin öğelerini eklemek, kaldırmak ve yönetmek için metotlara sahip olacaktır.

list-based control (liste tabanlı kontrol): Bir item (öğe) listesini açığa çıkarmak veya görüntü-lemek için tasarlanmış bir kontrol. ListBox, ComboBox ve CheckedListBox, sık kullanılan kontrol-lere örnektir.

load test (yük testi): Uygulamanın beklenen yük altında çalışıp çalışmadığını kontrol eden bir test. Yük, aynı anda çalışan kullanıcıları temsil eden bir set boyunca gerçek yükün dağıtımının taklit edilmesiyle tanımlanır.

local resources (yerel kaynaklar): Bir tek web sayfasıyla ilişkili string’ler veya diğer nesneler. Globalleştirme bağlamında ASP.NET, kontrollerle ilişkilendirilmiş yerel kaynakları otomatik olarak kullanıcının tercih ettiği dilde görüntüler.

local system account (yerel sistem hesabı): Yerel bilgisayar üzerinde tam yönetici haklarına sahip olan ama ağ erişim haklarına sahip olmayan bir Windows işletim sistemi hesabı. Bu hesap, geliştirme için veya diğer sunucu uygulamalarıyla entegre olması ya da ağ kaynaklarıyla etkile-

257Terimler Sözlüğü

Page 262: Yazilim Proje BilgeAdam

şime girmesi gerekmeyen test sunucuları için kullanılabilir. Ancak, bu hesaba verilen ayrıcalıklar yüzünden, SQL Server servisi veya SQL Server Agent servisi için bu hesabın kullanılması öne-rilmez.

localization (yerelleştirme): Lokasyona özgü bir şekilde özelleştirilmiş bir kullanıcı arayüzünü görüntüleme süreci.

lock escalation (kilit yükselişi): SQL Server’ın dinamik olarak bir ince ayarlı kilitten daha kaba ayarlı bir kilide geçtiği süreç; örneğin sayfa düzeyindeki bir kilitten tablo düzeyindeki bir kilide geçiş gibi.

locking level (kilitleme düzeyi): Satır, sayfa veya tablo olabilen bir kaynak üzerinde elde edilen kilit düzeyi.

locking promotion (kilit terfisi): Bir kilidin güncellenmesinde meydana gelen bir süreç. Bu tip bir kilit, paylaşılan bir kilit olarak başlar ve sonra, veriler değiştirilmeden hemen önce özel bir kilide değişir.

log file (log dosyası): Bir transaction log’unu içeren bir dosya. (Bkz. veri dosyası.)

log level (log düzeyi): Olası bir log girdisinin işlenmesi için gereken minimum seviyeyi gösteren bir konfigürasyon ayarı.

log pointer (log işaretçisi): Bir transaction log’unda, bir sonraki yazma işleminin meydana ge-leceği konumu izlemek için lazywriter süreci tarafından kullanılan bir referans. Bu, görünürlüğe sahip olmayan ve düzenlenemeyen dahili bir yapıdır.

log shipping (log taşıma): Bir transaction log’unun otomatik olarak birincil bir sunucudaki bir veritabanından yedeklenmesi, kopyalanması ve diğer bir sunucudaki bir veya daha fazla ikincil veritabanına geri yüklenmesi süreci.

log_shipping_monitor_error_detail tablosu: Hata ayrıntılarını izleyen bir log taşıma tablosu.

log_shipping_monitor_history_detail tablosu: Log taşıma görevleri hakkındaki geçmiş bilgile-rini depolayan bir log taşıma tablosu.

logging: Bir uygulamanın durumu, ilerleyişi ve sorunları hakkındaki bilgileri kalıcı bir veri depo-suna yerleştirme süreci.

logical design (mantıksal tasarım): Bir sistemi tasarlamak amacıyla her bir farklı çalışma birimi-nin mantıksal gruplara ayrılması.

looping (döngü oluşturmak): Bir kullanım durumu için olay akışında durum, akışın devamına izin vermek üzere yeniden istenmesi ve daha sonra düzeltilmesi gereken geçersiz bir girdi çağır-dığında bir döngü meydana gelir.

Mmachine.config dosyası: Microsoft .NET Framework tarafından kullanılan birincil konfigürasyon bilgileri dosyası. machine.config dosyası, Microsoft Windows registry’ye benzer. Web.config dos-yaları machine.config dosyasının izin verdiği ölçüde çalışır.

maintainability (sürdürülebilirlik): Zaman içinde bir kod bloğunu düzenlemek, kodu oluştur-maktan daha maliyetlidir. Bu yüzden, gelecekte bakımının yapılabilmesi için kodun açık ve oku-nabilir olması önemlidir.

maintenance job (bakım işi): Maintenance Plan Wizard’ın çıktısı olarak SQL Server Agent için-de oluşturulan bir iş.

258 Ek - A

Page 263: Yazilim Proje BilgeAdam

maintenance plan (bakım planı): Yedeklemeler veya yeniden indeksleme gibi bir veritabanının bakımını gerçekleştirmekle ilgili bir veya daha fazla görevden meydana gelen, bir SQL Server Integration Services (SSIS) paketi.

managed code (managed kod): .NET Framework çalışma zamanı tarafından yönetilen kod.

margin (marj): Kullanıcı arayüzünde, bir kontrolün etrafını çeviren boşluk (piksel) miktarı.

marshal-by-reference (MBR): Bir marshal-by-reference nesnesi, istemci makinede bulunan bir proxy nesnesi tarafından referans verilen uzak bir nesnedir. Marshal-by-reference nesneleri su-nucuda bulunur.

marshal-by-value (MBV): Bir marshal-by-value nesnesi, istemci makineye kopyalanan uzak bir nesnedir; proxy nesnesi gerekli değildir.

marshaling: Tip verilerini farklı çalıştırma ortamları boyunca taşımak.

mask (maske): Bir MaskedTextBox içinde girilecek ve görüntülenecek metnin biçimi.

master page (master sayfa): Bir veya daha fazla ContentPlaceHolder kontrolünü içeren bir şab-lon. İçerik sayfaları, tam bir sayfa oluşturmak için ContentPlaceHolder kontrollerini doldurur. Mas-ter page’ler, tutarlı bir yapıya sahip olmak ve tekrarlanan sayfa elementlerini oluşturmak üzere gereken zamanı azaltmak için bir web sitesinde birden fazla sayfayı etkinleştirir.

MD5: Message Digest hashing algoritması. MD5 algoritması için hash boyutu 128bit’tir.

MDI child: Bir MDI parent formunun içerdiği bir form.

MDI parent: MDI child formları içeren, barındıran ve organize eden bir form.

media set (ortam seti): Bir yedeğin depolandığı dosya ve/veya manyetik bant listesi.

medium trust (orta düzey güven): Microsoft Prescriptive Architecture Group tarafından öneril-diğine göre, ASP.NET’in altında çalıştırılması gereken izinler seti. Bu düzey, registry ve event log erişiminde kısıtlamalar içerir ve davetsiz bir misafirin neden olabileceği zararı en aza indirmeyi amaçlar.

memory leak (bellek sızması): Bellekle ilgili kaynağın geri alınmayacak şekilde sızması soru-nu.

MenuStrip: ToolStripMenuItem kontrollerini barındıracak şekilde özelleştirilmiş bir ToolStrip kon-trolü.

merge replication (birleştirme replikasyonu): Birden fazla sunucunun kopyalanan verileri de-ğiştirmesini sağlayan ve birden fazla sunucu içindeki veri değişikliklerini izlemek üzere benzersiz tanımlayıcı sütunları, trigger’ları ve tabloları kullanan bir replikasyon tipi.

MERGE: Bir bölüm fonksiyonundan bir sınır noktasını kaldıran işlem.

message (mesaj): Bir Service Broker uygulamasındaki temel veri birimi. İşlenmesi gereken tüm bilgileri içerir.

message layer security (mesaj katmanı güvenliği): İstemcinin kimlik denetimini yapmak için kullanılan public key mesaja dahil edilir.

message queue (mesaj kuyruğu): Süreçler arası iletişim için kullanılan bir bileşen. Mesajlaşma için bir kuyruğu veya kontrolün, içeriğin ya da nesnelerin aktarılmasını kullanır. Dağıtık uygulama mimarisinde mesaj gönderilmek istenen istemciye mesaj iletilemezse kuyruk kullanımı hayat kur-tarıcı olacaktır ve mesaj kaybı olmayacaktır.

259Terimler Sözlüğü

Page 264: Yazilim Proje BilgeAdam

Message Transmission Optimization Mechanism (MTOM): Oluşturma becerisini ve optimum veri sıkıştırmasını sağlayan tekniklerin bir kombinasyonuyla, ikili verileri bir SOAP mesajında ilet-mek için kullanılan bir biçim.

message type (mesaj tipi): Bir mesajın belirli bir uygulamasının adı. Bir mesaj gövdesinde izin verilen olası biçimleri tanımlar.

messaging protocols (mesajlaşma protokolleri): İki taraf arasındaki iletişim için metot. Bu metot, hangi tipte nesnelerin oluşturulabileceği ve neleri içerebilecekleri hakkında belirli kuralları içerebilir.

metadata: Diğer verileri açıklayan veriler.

method (metot): Eylem veya komut olarak da bilinir. Metodu izleyen URL’i kullanarak, web sunu-cusu tarafından gerçekleştirilecek eylemi gösterir.

Metot çağrıları arasında veri değerlerini koruma ve dolayısıyla, tüm değişkenleri parametreleri olarak aktarma gerekliliğinden kaçınma becerisini temsil eder.

Microsoft Distributed Transaction Coordinator: Kanıtlanmış transaction işleme teknolojisini kullanan Microsoft Windows platformları için dağıtık bir transaction yardımcı programı. Sistem başarısızlıklarına, süreç başarısızlıklarına ve iletişim başarısızlıklarına karşı dayanıklıdır; ölçekle-nebilir performans sağlamak için gevşek şekilde eşlenmiş sistemleri kullanır. Kurulması, yapılan-dırılması ve yönetilmesi kolaydır.

Microsoft Installer: Microsoft Installer (.msi) dosyası, Microsoft Windows tarafından desteklenen bir dağıtım paketidir. Microsoft Installer, uygulamaları kurmak için kullanılan bir uygulamadır. He-def sistemde bulunan kurulum mantığı sayesinde bir Microsoft Installer dağıtım paketi, genellikle standart kurulum programlarından çok daha küçüktür.

Microsoft Message Queuing (MSMQ): MSMQ teknolojisi, farklı zamanlarda çalışan uygulama-ların, geçici olarak çevrim dışı olabilecek heterojen ağlar ve sistemler üzerinden iletişim kurma-sını sağlar. MSMQ garantili mesaj teslimini, verimli yönlendirmeyi, güvenliği ve öncelik tabanlı mesajlaşmayı sağlar. Hem asenkron, hem de senkron mesajlaşma senaryoları için çözümleri uygulamak üzere kullanılabilir. Cep telefonlarındaki sms’ler bu sisteme örnek gösterilebilir. Mesaj gönderildiği zaman alıcının telefonu açık olmasa bile belirlenen süre zarfında mesaj kuyrukta bekletilecektir.

mirror failover: Bir mirror veritabanının principal’a terfi ettirildiği ve kurtarıldığı süreç. Bu süreç, aynı zamanda veritabanı mirroring oturumundaki principal’ı otomatik olarak mirror’a düşürür.

mirror: Bir veritabanı mirroring oturumunda, Bir kurtarma durumunda bulunan, hiçbir bağlantıya izin vermeyen ve principal’dan değişiklikleri almakta olan veritabanı.

mirrored backup: SQL Server’ın verileri bir defa yedeklediği ama bir tek yedekleme işleminde bir veritabanının birden fazla kopyasını oluşturan bir süreç.

Mixed Mode kimlik denetimi: SQL Server instancelar’ına bağlantı teşebbüslerinin geçerlilik kon-trolü için kullanılan iki mekanizmadan biri. Kullanıcılar, bağlanırken bir SQL Server oturum ID’si ve parolası belirtmelidir. SQL Server örneği, bağlantının başarılı olmasına izin vermeden önce oturum ID’si ve parolasının geçerliliğini kontrol eder. Bir işletim sistemi kullanıcısına eşlenmemiş SQL Server oturumları oluşturabilirsiniz. Windows dışındaki kullanıcılara erişim sağlamak için Mixed Mode kimlik denetimini kullanırsınız. (Bkz. Windows kimlik denetimi.)

mock object (taklit nesne): Gerçek bir class’ı taklit eden bir nesne. Temel işlevselliğin yanında, metot çağrılarının ve özellik değerlerinin de bir taklidini içerir.

260 Ek - A

Page 265: Yazilim Proje BilgeAdam

mockup: Uygulamanın navigasyonunu, gereksinimlerini ve kullanım durumlarını doğrulamaya yardımcı olan kullanıcı arayüzü ekranlarının seti; kullanıcı arayüzü mockup’ı veya yatay prototip (horizontal prototype) olarak da adlandırılır.

modal (kipli): İletişim kutusu görüntüleme kipi. Bir iletişim kutusu kipli olarak görüntülendiğinde, iletişim kutusu kapatılana kadar uygulamanın ana thread’i durdurulur.

modeless (kipsiz): İletişim kutusu görüntüleme kipi. Bir iletişim kutusu (Dialog box) kipsiz olarak görüntülendiğinde, iletişim kutusu açıkken uygulamanın ana thread’i devam edebilir.

module (modül): Bir assembly içindeki tipler için bir tek konteyner. Bir assembly bir veya daha fazla modül içerebilir.

monitor server (izleme sunucusu): Bir log taşıma sürecini izleyen ve süreç başarısız olduğunda uyarı veren bir SQL Server veritabanı motoru örneği.

monitoring (izleme): Bir uygulamanın durumu, ilerleyişi veya sorunları hakkındaki bilgilerin ger-çek zamanlı (veya gerçek zamanlıya yakın) olarak izlenmesi.

monolog: Bir tek uç noktası ve herhangi bir sayıdaki hedef uç noktaları arasında meydana gelen bir konuşma. Bu konuşma tipi SQL Server 2005’te mevcut değildir.

multifile assemblies (çok dosyalı assembly’ler): Gerektiğinde bağımsız olarak yüklenebilecek birkaç modüle bölünen bir assembly.

multiple condition coverage (birden fazla koşulu kapsama): Branch coverage (dallanmayı kapsama) için kullanılan diğer (ve daha doğru) bir ad. Bir If ifadesindeki her bir koşulun, birim testleri tarafından kodun hangi bölümlerine hitap edildiğinin belirlenmesine dahil edilmesi gerçe-ğine karşılık gelir.

multiple-document interface (MDI): Bir tek belge tipinde birden fazla örneği barındıran bir kulla-nıcı arayüzü konteyneri. Örnek olarak, bir çizim programını veya bir çalışma sayfası uygulamasını düşünebilirsiniz.

multiplicity (çokluluk): İki nesne arasındaki bir ilişkide yer alan nesne sayısının tanımı. Bunlar bire bir, birden çoğa veya çoktan çoğa olabilir.

Multipurpose Internet Mail Extensions (MIME) tipi: Web tarayıcısına gönderilmekte olan kay-nak tipinin bir göstergesidir. “Tip” ve “alt tip” olmak üzere iki bölümdür; birinci bölüm kaynak tipi ve ikinci bölüm de kaynak alt tipidir.

Multipurpose Internet Mail Extensions (MIME): Binary verilerin Internet üzerinde yayınlanma-sını ve okunmasını sağlayan bir standart. Binary verilere sahip bir dosyanın başlığı, verilerin MIME tipini içerir. Bu, istemci programlara (Web tarayıcıları ve e-posta istemcileri gibi) verileri düz metin olarak işleyemeyeceklerini bildirir.

Nnamed instance (adlandırılmış örnek): Diğer adlandırılmış örneklerden ve aynı bilgisayar üze-rindeki varsayılan örnekten ayırt edilmesini sağlamak üzere kendisine bir ad verilen bir SQL Ser-ver kurulumu. Adlandırılmış bir örnek, bilgisayar adı ve örnek adıyla tanımlanır.

naming container (adlandırma konteyneri): Kontrol adları için benzersiz bir namespace’i ta-nımlar. Bir adlandırma konteynerinin içinde her kontrol benzersiz şekilde tanınabilmelidir.

narrowing (daraltma): Hedef tip kaynak tipten gelen olası tüm değerleri barındıramadığında, bir değerin bir tipten diğerine dönüştürülmesi. Bu dönüşümler C# ve eğer Option Strict etkinse, Visual Basic’te açık olmalıdır.

261Terimler Sözlüğü

Page 266: Yazilim Proje BilgeAdam

nested trigger (iç içe yerleştirilmiş trigger): Diğer bir trigger’ın ateşlenmesine neden olan kodu çalıştıran bir trigger.

Network Service hesabı: Kimlik denetimi yapılmış kullanıcıların hesaplarına benzeyen özel bir yerleşik sistem hesabı. Bu hesap, sistem kaynaklarına ve nesnelerine User grubunun üyeleriyle aynı düzeyde erişime sahiptir. Bu hesap altında çalışan servisler, bilgisayar hesabının kimlik bilgi-lerini kullanarak ağ kaynaklarına erişirler. Bu hesabın SQL Service veya SQL Server Agent servis hesabı için kullanılması önerilmez.

neutral culture (nötr kültür): Sadece bir tek dili belirten bir kültürü tanımlar. Özel kültürlerden farklı olarak, nötr kültürler para birimi veya sayı biçimlendirmesini belirtmez. Nötr kültürler iki harfli kısaltmalara sahiptir; örneğin İspanyolca için “es,” Fransızca için “fr” ve İngilizce için “en.”

No Recovery kipi: Kullanışlılık amacıyla bir log taşıma konfigürasyonunu kullanırken kullandığını bir kip. No Recovery kip, kullanıcıların sorgu için ikincil veritabanını kullanmamasını sağlar.

node: Bir dağıtım yerinin bir UML temsili. Genellikle bir donanım parçasını (bir sunucu gibi) temsil eder.

noise words: Bir dilde sık kullanılan, indeks popülasyonu ve tam metin sorguları tarafından ihmal edilen sözcükler.

nonclustered indeks: Bir tablo içindeki veri sayfalarının sıralanmasına neden olmayan bir in-deks tipi. Tablo başına 249’a kadar nonclustered indeks oluşturabilirsiniz.

nondeterministic function: çağrıldığı her sefer farklı bir değer döndürebilen fonksiyon. Geçerli sistem tarihi ve zamanını döndüren yerleşik SQL Server GETDATE() fonksiyonu buna bir örnek-tir. (Bkz. deterministic function.)

nullable type: Nothing/null olarak değer atanabilen bir değer tipi.

Oobject role modeling – ORM (nesne rolü modelleme): Gerçek dünya kavramlarını ve bunların ilişkilerini temsil eden bir diyagram. Yazılımınızın mantıksal bir modelidir.

one-way (tek yön): İstemci taraflı işlemenin, sunucuda ne olursa olsun devam etmesini sağlayan mekanizma. Yapılan işlemin sonucuna, durumuna bakılmaz.

online index creation (çevrimiçi indeks oluşturma): Altta yatan tabloda meydana gelen iş-lemleri okuyup yazarken bir indeks inşa etmenizi sağlamak üzere satır versiyonlama teknolojisini kullanan bir süreç. Bu özellik sadece SQL Server 2005 Enterprise Edition’da mevcuttur.

operating mode (işletim kipi): Bir veritabanı mirroring oturumunun transaction’ları ve mevcut seçenekleri nasıl senkronize edeceğini yöneten bir konfigürasyon. Üç işletim kipinden birini seçe-bilirsiniz: High Availability, High Performance veya High Protection.

operator (operatör): Bir kişiye veya bir kullanıcı grubuna bir mesaj göndermek için gereken bil-dirim mekanizmasını ve parametreleri tanımlar.

optimistic concurrency (iyimser eşzamanlılık): Çok kullanıcılı veri erişimi için bir teknik. Bu teknikte, bir kullanıcı tarafından okunurken satırlar kilitlenmez ve uygulamanın, kullanıcının bir güncellemeyi göndermesine izin vermeden önce, satırın güncellenmediğini doğrulaması gerekir.

optimistic: Değişiklikler yapılırken kullanıcıları veri parçalarının dışına kilitlemeksizin birden fazla veri değişikliğini yönetmenin bir yolu. Genellikle, eğer veriler son zamanlarda değiştirilmemişse, veri değişikliklerinin kaydedilmesine izin verir.

outer join (dış bağ): Bir sorguda birden fazla tabloyla çalışırken, tablolardan birinden veya her ikisinden tüm satırları ve diğer tablodan eşlenmeyen satırları döndüren bir join tipi. (Bkz. iç bağ.)

262 Ek - A

Page 267: Yazilim Proje BilgeAdam

output parameter (çıktı parametresi): Bir stored procedure’den döndürülen skaler bir değer.

override (ezmek): Bir miras ilişkisinde, eğer türetilen class bir metot için base class’a bağlı olmak yerine metodun kendi uygulamasını içerirse, base class’taki metodun ezildiği kabul edilir. En çok kullanılanı ToString() metodudur.

ownership chain (sahiplik zinciri): Bir parent nesneden bir veya daha fazla bağımlı nesneye giden, basamaklı izinler seti.

Ppadding (dolgu): Bir kontrolde, kontrolün kenarı ve kontrolün içindeki diğer öğeler arasındaki boşluk (piksel) miktarı. Örneğin bir form padding’e sahip olduğundan, kontroller kenara çok yakın hizalanmaz.

page (sayfa): Sanal bir paging sistemi oluşturmak için, en küçük inşa bloğu olan bellek bölümü. Sanal paging, bir işletim sisteminin sayfaları fiziksel bellekten fiziksel bir dosyaya taşıyarak, daha fazla belleğe sahip olmasını sağlar.

page fault (sayfa hatası): Bir bilgisayar belirli bir bellek sayfasını talep ettiğinde, sayfa fiziksel bellekte değilse meydana gelen bir kesilme. Bir sayfa hatasının sonucunda, sayfanın fiziksel bir dosyadan yeniden elde edilmesi için ilave işleme gerekir.

page output caching (sayfa çıktısını ön belleğe alma): Gelecekteki talepler için dinamik olarak üretilmelerini gerektirmemek üzere, render edilen ASP.NET sayfalarının kopyalarını depolayan bir ASP.NET özelliği.

page split (sayfa bölmek): Bir sayfa verilerle doldurulduğunda ve veri sırasını korumak üzere o sayfaya diğer bir satırın yazılması gerektiğinde meydana gelen süreç. Daha sonra SQL Server, indeks veya tabloya yeni bir sayfa ayırır ve tam sayfanın üstündeki verilerin yarısını yeni sayfaya taşır.

pair programming (eş programlama): Kodu tasarlamak ve yazmak üzere iki geliştiricinin bir tek iş istasyonunda (workstation) çalışması. Sıklıkla aşırı programlamanın (extreme programming) bir parçası olarak kullanılır.

parameter (parametre): Veritabanı sorgularını oluştururken, SQL ifadeleri ve stored procedure’ler gibi deyimlere alternatif değerler sağlamak için kullanılan bir değişken.

parent node: Diğer node’ları içeren bir node.

parse (çözümleme): Bir XML yapısını analiz ve traverse etmek.

partial backup (kısmi yedekleme): Bir veritabanının sadece bir kısmının yedeklenmesi süreci.

partial restore (kısmi geri yükleme): Bir veritabanının sadece bir kısmının geri yüklenmesi sü-reci.

partially trusted code (kısmen güvenilir kod): Korunan bir kaynağa her erişiminde code ac-cess security (CAS) izin kontrollerinden geçmesi gereken bir assembly.

partition function (bölüm fonksiyonu): Verileri bölümlere ayırmak için sınır noktalarını tanım-layan bir standalone nesne.

partition schema (bölüm şeması): Bir bölüm fonksiyonunu fiziksel depoya eşler.

partitioning (bölümleme): Metodun çıktısına göre eşdeğerlerine dayanan gruplardaki girdi de-ğerleri aralığının bölümü.

payload: Bir uç noktası için izin verilen işlemleri kısıtlar; TCP veya HTTP tipinde olabilir.

263Terimler Sözlüğü

Page 268: Yazilim Proje BilgeAdam

peer review (peer gözden geçirme): Resmi veya gayri resmi olarak bir kodun gözden geçirilme-sine çalışma arkadaşlarının dahil olması süreci.

peer-to-peer replikasyon: Birden fazla sunucunun aynı şema ve verilere abone olmasını sağla-yarak, birden fazla sunucuda aynı anda değişikliklere izin veren bir tür transaction replikasyonu.

PerfMon: Bkz. System Monitor.

performance alert (performans uyarısı): Performance Monitor aracılığıyla yapılandırılabilen bir uyarı. Bu uyarı, performans sayaçlarına göre bir veya daha fazla kriter içerir. Kriter tarafından tanımlanan eşik aşıldığında, kullanıcı tanımlı bir eylem gerçekleştirilir.

performance baseline (performans taban çizgisi): Bir performans taban çizgisi veya bench-mark, bir uygulamanın belirli kaynaklar ve yüklerle nasıl performans göstereceğini öngörmek için kullanılır.

performance counter (performans sayacı): Performans sayacı, Windows Performance Moni-tor tarafından bir uygulamanın bir unsurunun performansını izlemek için kullanılır. Performans sayaçları, bir uygulama kurulurken uygulamaya dahil edilebilir veya .NET Framework kullanılarak programlamayla oluşturulabilir. Kodun, uygulamanın performansını ölçmek için en ideal yollardan biridir.

performance modeling (performans modelleme): Uygulamanızın, iyi çalışması ve iyi çalışma-ya devam etmesi için gerekecek kaynakları belirlemek üzere prototipini oluşturma süreci.

Performance Monitor: Sistem ve çalışmakta olan uygulamalar hakkındaki çeşitli sayaçların iz-lenmesini sağlamak üzere işletim sistemine dahil edilen Windows uygulaması.

performance objects (performans nesneleri): Uygulama sunucusu üzerindeki işlemciler, disk-ler, bellek gibi belirli bileşenlerin değerlerini ölçmek için kullanılır. Ayrıca, SQL Server ve Speech Server gibi özel yazılım ürünleriyle ilişkili sistem bileşenlerini ölçmek için de kullanılır.

performance spike (performans tıkanması): İşlemci süresinin kullanımında, bellek kaynakla-rında veya bir uygulamanın kullandığı benzer kaynaklarda dikkate değer ve çarpıcı bir artış.

performance test (performans testi): Bir sitenin ve bir sitedeki sayfaların hedef performans gereksinimlerini karşıladığını doğrulayan bir test.

permission (izin): Bir code access security (CAS) access control entry (ACL).

permission set (izin seti): Birden fazla izinden meydana gelen bir CAS ACL.

pessimistic concurrency (kötümser eşzamanlılık): Çok kullanıcılı veri erişimi için kullanılan bir teknik. Bu teknikte, bir kullanıcı tarafından okunurken satırlar kilitlenir ve satırın kullanıcı tarafın-dan istendiği zaman güncellenmesine izin verilir.

physical design (fiziksel tasarım): Bir sistemin her bir çalışma biriminin, ayrı makinelerdeki, süreçlerdeki veya diğer tasarım elementlerindeki gerçek dünya karşılıklarına ayrılması.

physical design (fiziksel tasarım): Bir sistemin, farklı katmanları ayrı bilgisayarların veya veri merkezlerinin üzerine ayıran fiziksel yerleşimi.

Platform Invoke: Managed koddan unmanaged kodu çağırmak için kullanılan bir mekanizma.

point-in-time recovery: Transaction log yedeklemelerini kullanmak için Full recovery modelini kullanan bir veritabanının, veritabanını zaman içinde yedeklemenin alındığı zamanla çakışması gerekmeyen belirli bir zamana kurtarma becerisi. Eğer gece yarısında tam bir veritabanı yedek-lemesi yapılırsa ve saat 04:00’da bir log yedeklemesi yapılırsa, veritabanı gece yarısı ve 04:00 arasındaki herhangi bir zamana kurtarılabilir (örneğin 03:41 veya 02:22 gibi).

264 Ek - A

Page 269: Yazilim Proje BilgeAdam

policy assertion (politika iddiası): Özel bir gereksinim veya ayar.

policy expression (politika ifadesi): Bir veya daha fazla policy assertion’ın gruplandırılması.

policy framework (politika platformu): Belirli bir web servisi veya web servisleriyle ilişkilendiril-miş gereksinimler veya ayarlar seti. Policy framework’lerin genellikle ilgilendiği iki alan; şifreleme ve dijital imzalardır.

polymorphism (çok biçimlilik): Çalışma zamanında, istemci kodu tarafından farklı uygulamala-ra sahip aynı adlı üyeler ile değiştirilerek kullanılabilecek sınıfları tanımlama becerisi.

PostBack: Verileri sunucuya geri gönderir. Adını POST metodundan almasına rağmen, GET metodu kullanılarak da bir PostBack işlemi gerçekleştirilebilir.

precompiling (ön derleme): Bir ASP.NET web uygulamasını ilk talepten önce derleyerek, bir kullanıcı ilk web sayfasını talep ettiğinde meydana gelecek gecikmeyi azaltan bir Publish Web aracı özelliği.

primary data file (birincil veri dosyası): Bir veritabanı kataloğu için bilgileri içeren zorunlu bir veri dosyası. Birincil veri dosyasının önerilen uzantısı .mdf’dir. (Bkz. ikincil veri dosyası.)

primary database (birincil veritabanı): Log taşıma ile diğer sunuculara dağıtılan orijinal verita-banı. Birincil veritabanı, uygulamadan güncellemeleri alır. (Bkz. ikincil veritabanı.)

primary filegroup (birincil dosya grubu): Birincil veri dosyasını içeren dosya grubu. Tüm sis-tem tabloları birincil dosya grubuna ayrılır.

primary key (birincil anahtar): Bir veritabanı tablosunda, bir satırı benzersiz şekilde tanımlamak için kullanılan bir değer.

primary server (birincil sunucu): Birincil veritabanına sahip olan SQL Server veritabanı motoru örneği. (Bkz. ikincil sunucu.)

principal policy: .NET Framework’ün, geçerli principal bir uygulama tarafından kuyruğa alındı-ğında hangi varsayılan principal’ın döndürüleceğini belirlemek için kullandığı şema.

principal: Bir veritabanı mirroring oturumunda kurtarılan ve çevrim içi olan ve kendisine karşı transaction’ların işlenmesine izin veren veritabanı.

PrintDocument: Yazdırmada birincil bileşen. Bir PrintDocument bileşeni, yazdırılan bir belgeyi temsil eder.

PrintPreview: Yazdırılan belgenin ekran üstündeki ön izlemesi. Bir PrintDocument bileşeninin ön izlemesini bir PrintPreviewDialog veya bir PrintPreviewControl içinde görüntüleyebilirsiniz.

private assembly: Bir uygulamanın kurulum dizinine yerleştirilen bir assembly. Buradaki yerle-şiminden dolayı, bu assembly sadece o uygulama tarafından kullanılır ve diğer uygulamalarla paylaşılmaz.

privileged mode (ayrıcalıklı kip): Bazen çekirdek kipi (kernel mode) işlemeye verilen bir ad.

process (süreç): Halihazırda çalışmakta olan bir uygulama. Süreçler kaynak izolasyonuna im-kan verir.

profiling (profil oluşturma): Performansın yanında bellek ve kaynak kullanımı için de kodu test etmek. Profil oluşturma, kendi kaynaklarına sıkı şekilde eşlenmiş (tightly coupled) ve çok düşük düzeyde, özel sonuçları render etmek üzere tasarlanmış araçları kullanarak, uygulamanın ölçüm-lerini izlemenin bir yoludur.

265Terimler Sözlüğü

Page 270: Yazilim Proje BilgeAdam

proof-of-concept prototype: Bir özelliğin, sistemin mimarisi boyunca tam bir uygulaması. Uy-gulamayı yığının tamamında yani tüm katmanlarda (UI, servisler, business objects ve veritabanı) inceler. Teknoloji önerilerini ve yüksek düzeyde tasarımı doğrulamak için kullanılır.

protected configuration (korunumlu konfigürasyon): Konfigürasyon dosyalarıyla kullanılan, dosyanın bölümlerinin işlem anında şifrelenmesine ve çözülmesine izin veren mekanizma.

protocol handler (protokol yöneticisi): Bir word breaker için varbinary ve görüntü sütunların-dan metin verilerini çıkarmak için bir veya daha fazla filtre kullanan bir süreç.

provider classes (sağlayıcı sınıflar): Bir veri deposu ve istemci uygulama arasında veri transferi için kullanabileceğiniz class’lar.

proxy object (proxy nesnesi): Bir proxy nesnesi, diğer bir nesneyi temsil etmek için kullanılır. .NET bağlamında bir proxy nesnesi, sunucu tarafından etkinleştirilmiş marshal-by-reference uzak nesneleri için oluşturulur.

proxy: Bir XML Web servisi proxy’si, bir web servisiyle iletişim kurmak için üretilen ve kullanılan bir class’ı temsil eder.

Pseudo code: Karmaşık bir algoritmayı kod benzeri metin halinde gösteren kod. Kod (model değil) yazanlar ve okuyanlar için kullanışlı olabilir.

publisher policy (yayımcı politikası): Bir assembly’nin yazarı tarafından üretilen, assembly’nin farklı versiyonlarıyla uyumluluğu hakkındaki dijital bir ifade. Assembly’ler yüklenirken, CLR bir assembly’nin hangi versiyonunun yüklenmek için uygun olduğunu belirlemek üzere yayımcı poli-tikasını kullanır.

pull subscription: Distribution Agent veya Merge Agent’ın Distributor’da çalıştığı ve subscription’ı Distributor’dan Subscriber’a çeken bir subscription.

Qquality of service – QOS (servis kalitesi) gereksinimi: Sistem için performans, ölçeklenebilirlik ve standartlar gibi göz önüne alınan unsurlarda işlevsel olmayan gereksinimleri tanımlayan bir gereksinim.

QueryString: URL’in sonuna bir soru işareti (?) eklenerek ve sonra QueryString’e bitiştirilerek web sunucusuna aktarılabilecek, ampersand (&) karakterleriyle ayrılmış anahtar=değer ifadeleri-nin bir koleksiyonu.

queue (kuyruk): SQL Server içindeki, gönderilen veya alınan tüm mesajları içeren gizli bir tab-lo.

queue reader (kuyruk okuyucu): Bir kuyruktan mesajları alan bir nesne. Bu nesne bir stored procedure veya diğer bir uygulama olabilir.

quit network: Test laboratuvarı trafiği dışında hiçbir ilave trafiğe sahip olmayan bir ağ.

RRAID: Redundant Array of Independent Disks. Yazılım aracılığıyla yapılandırılabilir veya bir do-nanım aygıtı olarak bulunabilir. Tekrarlılık sağlamak ve I/O performansını artırmak için kullanır.

RAID 0: Stripe set adında bir disk dosya sistemi oluşturduğundan, disk striping olarak da bilinir. RAID 0, okuma ve yazma işlemleri için performansı geliştirir; çünkü bu işlemleri set içindeki tüm diskler boyunca dağıtır. RAID 0, hata toleransı sağlamaz.

RAID 1: Disk mirroring olarak da bilinir; seçilen diskin fazladan bir kopyasını sağlar. RAID 1 oku-ma performansını geliştirir ama yazma işlemlerinin performansını düşürebilir.

266 Ek - A

Page 271: Yazilim Proje BilgeAdam

RAID 5: En popüler RAID düzeyidir. RAID 0’ın yaptığı gibi verileri RAID setindeki diskler boyunca dağıtır ama RAID 5 aynı zamanda, hata toleransını sağlamak üzere parite bilgilerini de ekler. Parite bilgileri tüm diskler boyunca dağıtılır. RAID 5, RAID 1’den daha iyi performans sağlar ama disk başarısız olduğunda okuma performansı düşer.

RC2: Değişken anahtar boyutlarını kullanan DES’in (Data Encryption Standard) yerini almak üze-re tasarlanmış bir simetrik şifreleme standardı.

RCW (Runtime Callable Wrapper): Bir COM bileşeni ve bir .NET assembly’si arasında yer alan bir proxy sınıfı; .Net assembly’sinin COM bileşenine erişip içindeki metotların kullanılmasını sağ-lar�

read-only filegroup (salt okunur dosya grubu): Değiştirilmemesi gereken veritabanı nesne-lerini (geçmiş tabloları gibi) tutmak üzere yapılandırılmış bir dosya grubu. Birincil dosya grubu dışındaki tüm dosya grupları salt okunur olarak yapılandırılabilir.

receive (almak): Bir mesajın kuyruktan kaldırılması.

recovery model (kurtarma modeli): Transaction’ların log’a nasıl kaydedildiğini kontrol eden bir veritabanı seçeneği; transaction log’unun yedeklenip yedeklenmeyeceğini ve mevcut geri yükle-me seçeneklerini kontrol eder. Ayrıca, kurtarma amacıyla bir veritabanının altında çalıştığı mo-deldir.

recursive trigger: Kendisinin doğrudan veya dolaylı olarak çağrılmasına neden olan bir trigger. Döngüye giren trigger da denebilir. Sınırsız döngüye girmesi veritabanı sunucu üzerinde yapıla-cak ayarlar ile engellenebilir.

reference architecture (referans mimari): Geliştirme ekibi için uygulamanın düşey yığını bo-yunca bir referans uygulaması sağlar. Geliştiricilere, kodlarını nasıl uygulamaları gerektiğini gös-teren bir model sağlar. Bir referans mimari, tıpkı bir proof-of-concept prototipi gibidir.

Registration Entries dosyası: Windows Registry anahtarları ve alt anahtarları hakkında bilgi içeren bir dosya. Bu dosya, registry bilgilerini bir sistemden diğerine ihraç ve ithal etmek için kullanılır.

regular expression: Metnin bazı kısımlarını çıkarmak veya metni değiştirmek üzere kullanılabil-mesi için, string’in belirtilen biçim gereksinimlerini karşılayıp karşılamadığını belirlemek amacıyla bir string ile karşılaştırılabilecek bir karakter seti. Örneğin, e-posta’nın düzgün formatta girilip girilmediğinin kontrolü veya e-posta konusunun kontrolü gibi.

reliability testing (güvenirlik testi): Stres testinin bir diğer adı.

remote method (uzak metot): Kendini çağıran makineden farklı bir makine üzerinde işleyen bir metot.

remote object activation (uzak nesne etkinleştirmesi): Bir istemcinin uzak bir nesnenin bir ör-neğini oluşturabilmesi için, o nesnenin etkinleştirilmesi gerekir. .NET Framework iki etkinleştirme kipini sağlar; sunucu etkinleştirmesi ve istemci etkinleştirmesi. Sunucu tarafından etkinleştirilen nesneler, SingleCall veya Singleton olabilir.

Remoting: Farklı bilgisayarlarda bulunan nesneleri, hepsi aynı uygulamaya aitmiş gibi çağırma-nızı sağlayan dağıtık teknoloji.

replacing an exception (bir istisnayı değiştirmek): Bazı durumlarda, fırlatılan bir exception’ın doğrudan istemciye geri gönderilmemesi gerekir. Bu bir exception’ın sarmalanmasına benzer; ancak değiştirme durumun, InnerException özelliği boş bırakılır.

replay trace (tekrar izi): Bir test sistemine karşı bir iş yükünü tekrarlamak için oluşturulan özel bir iz tipi.

267Terimler Sözlüğü

Page 272: Yazilim Proje BilgeAdam

replication agent (replikasyon agent’ı): Replikasyon sürecini çalıştıran bir program. En önemli replikasyon agent’ları Snapshot, Log Reader, Distribution, Merge ve Queue Reader’dır.

request (talep): Web tarayıcısından web sunucusuna iletişimi yönetir. Aynı zamanda ASP.NET’te Request nesnesi olarak da temsil edilir.

response (cevap): Web sunucusundan web tarayıcısına iletişimi yönetir. Aynı zamanda ASP.NET’te Response nesnesi olarak da temsil edilir.

restore strategy (geri yükleme stratejisi): Bir veritabanının, izin verilen çalışmama ve maksi-mum veri kaybı miktarı için mesleki gereksinimleri karşılarken, kurtarılabilmesini sağlamak üzere tasarlanmış süreç. Bir geri yükleme stratejisi olmazsa, bir veritabanının yedeklenmesinin hiçbir amacı olmayacaktır.

retention (saklama): Bir kuyruğun, konuşma açıkça kapatılana kadar bir konuşmayla ilgili tüm mesajları korumasını sağlar.

reverting a database (bir veritabanını eski durumuna döndürmek): Kaynak veritabanını bir Database Snapshot’tan kurtarma süreci.

rig: Test laboratuvar donanımına (agent’lar ve denetleyiciler) uygulanan bir terim.

Rijndael: 128 ila 256 bit anahtar boyutlarını kullanan simetrik bir şifreleme algoritması. Bir hükü-met şifreleme standardı olan bu algoritma AES olarak da bilinir.

roaming (dolaşım): Kullanıcı şirket ağındaki diğer makinelere oturum açtığında, kullanıcı bilgile-rinin kullanıcıyla birlikte gitmesini sağlayan bir Windows profil oluşturma mekanizması.

role (rol): İzinleri yönetmek için kullanıcıları gruplandırma veya sınıflandırma yöntemi.

role-based security (RBS): Kullanıcıların kimlik denetimini yapmak ve sonra kullanıcı hesapları-na ve grup üyeliklerine atanan izinlere göre onları yetkilendirmek.

Roles: ASP.NET uygulamaları için grup üyeliğini tanımlayan bir class.

roll back (geri sarma): Bir kurulumun başarıyla tamamlanmadığı durumlarda gerçekleştirilen bir eylem. Geri sarma, başarısızlık noktasına kadar yapılan tüm değişikliklerin geri alınması anlamı-na gelir; bunun sonucunda makine, kurulum teşebbüsünden önceki durumuna geri döndürülür.

root node: Diğer bir düğümün içermediği ve tüm diğer node’ların atası olan bir node.

Runtime Callable Wrapper (RCW): Bir .NET assembly’si ve bir COM bileşeni arasında yer alan bir proxy sınıfı; .Net assembly’sinin COM bileşenine erişip içindeki metotların kullanılmasını sağ-lar.

Ssampling rate (örnekleme hızı): Analog bir sesi dijital bir temsiline dönüştürmek için saniye başına toplanan ton (veya veri noktası) sayısı. Saniye başına örnek sayısı arttıkça, sesin kalitesi de artar.

satellite assemblies (uydu assembly’ler): Farklı kültürler için yerelleştirme kaynaklarını içeren ve ana assembly’nin dışında yer alan assembly’ler.

SAX: Bkz. Simple API for XML (SAX).

scalar function (skalar fonksiyon): Bir tek değeri döndüren bir fonksiyon.

schema (şema): Bir tek namespace’den veritabanı nesnelerinin bir koleksiyonu. Şemaların te-mel faydası, şemaların ve kullanıcıların ayrılmasıdır.

268 Ek - A

Page 273: Yazilim Proje BilgeAdam

schema collection (şema koleksiyonu): Bir ad aracılığıyla birbirine bağlanan bir veya daha fazla XML şeması. Bir Service Broker uygulamasında bir mesajın gövdesinin geçerliliğini kontrol etmek için kullanılır.

screen reader (ekran okuyucu): Bir web sayfası üzerindeki metni sesli sözcüklere veya kabart-ma Braille metnine çeviren özelleştirilmiş bir web tarayıcısı aracı.

secondary data file (ikincil veri dosyası): Nesneleri ve verileri içeren isteğe bağlı dosyalar. Bir veritabanı maksimum 32,766 ikincil dosya içerebilir. İkincil bir veri dosyası için önerilen uzantı .ndf’dir. (bkz. birincil veri dosyası.)

secondary database (ikincil veritabanı): Log taşıma sonucunda doğan birincil bir veritabanının dağıtık kopyası. SQL Server, sıkça transaction log geri yüklemeleri aracılığıyla ikincil veritabanını senkronize eder. (Bkz. birincil veritabanı.)

secondary server (ikincil sunucu): İkincil bir veritabanına sahip olan SQL Server veritabanı motoru örneği. Birden fazla ikincil sunucu yapılandırabilirsiniz. (Bkz. birincil sunucu.)

Secure Sockets Layer (SSL): Ağ iletişimlerini korumak için public key şifrelemesi kullanan bir standart.

security access control list (SACL): Dosya veya klasör erişiminin nasıl denetleneceğini belirle-yen bir kullanım event logging mekanizması.

security plan (güvenlik planı): Geliştirme döngüsünün tasarım aşamasında oluşturulması ve uygulama verilerinin gizliliği, bütünlüğü ve kullanılabilirliği için güvenlik politikalarını içermesi ge-reken bir plan.

security policy (güvenlik politikası): Kod gruplarının, izin setlerinin ve özel politika assembly’lerinin mantıksal bir gruplandırması.

semistructured data (yarı yapılandırılmış veri): Örnekten örneğe değişen ve isteğe bağlı ele-mentleri tanımlayan XML verileri. Şema heterojendir ve ilişkisel bir yapı kullanılarak kolayca tem-sil edilemez. (Bkz. yapılandırılmış veri; yapılandırılmamış veri.)

send (gönderme): Bir mesajı kuyruğa almak.

sequence diagram (sekans şeması): Bir kullanım durumunu gerçekleştirmek üzere nesneler arasında birlikte çalışan mesajlar sekansını gösteren bir şema. Bir sekans şeması, bir mesaj akı-şını soldan sağa ve yukarıdan aşağıya gösterir.

serialization: Nesnelerin depolanabilmesi veya transfer edilebilmesi ve daha sonra yeniden oluşturulabilmesi için serialize ve deserialize edilme süreci.

server control (sunucu kontrolü): Kontrolden gelen olaylara cevap vermek üzere sunucu taraflı kod yazılarak programlanabilen bir kontrol.

service (servis): Bir kullanıcı arayüzü olmaksızın, kendi kullanıcı oturumunda, arka planda çalı-şan bir süreç.

service master key (servis ana anahtarı): Bir SQL Server 2005 örneğini kurduğunuzda otoma-tik olarak oluşturulan simetrik bir anahtar. Veritabanı motoru, bağlı sunucu parolalarını, bağlantı string’lerini, hesap kimlik bilgilerini ve veritabanının tüm ana anahtarlarını kriptolamak için servis ana anahtarını kullanır.

session state (oturum durumu): Web sitenize yaptığı belirli bir ziyarette sadece kullanıcı tara-fından görüntülenen sayfalardan erişilen, Session nesnesinin içinde depolanan veriler.

setting (ayar): Property’lerin (özelliklerin) uygulama oturumları arasında kalıcı olabilmesini sağ-layan bir değer. Ayrıca uygulama ayarı olarak da adlandırılır.

269Terimler Sözlüğü

Page 274: Yazilim Proje BilgeAdam

setup project (kurulum projesi): Visual Studio ile oluşturulan kurulum projeleri, bir uygulamayı dağıtmak için kullanılabilecek installer (.msi, .exe) dosyalarını üretmek için kullanılır.

SHA1: Secure Hash Algorithm 1. SHA1 algoritması için hash boyutu 160 bit’tir.

shadow (gölge): Bir uygulamayı türetilmiş class’la bir base class’a gizleme ve değiştirme bece-risi.

shadowing: Türetilmiş bir class’la, bir implementasyonu bir base class’ta gizleme ve değiştirme becerisine karşılık gelir.

shared assembly (paylaşılan assembly): GAC’ye (global assembly cache) yerleştirilen ve bu nedenle bir makinedeki bir veya daha fazla uygulama tarafından kullanılabilen bir assembly.

shared secret (paylaşılan sır): Simetrik bir şifreleme anahtarı.

showplan: Sorgu optimizer’ı tarafından üretilen bir sorgu planının grafiksel veya metin tabanlı bir grafiği

shredding (parçalama): XML verilerini, ilişkili tablolarda depolanmak üzere uygun bir biçime dönüştürme süreci.

signature (imza): Bir üyenin dönüş tipi, parametre sayısı ve parametre tipleri.

Simple API for XML (SAX): Bir XML yapısını traverse etmek için kullanılan bir API (application programming interface). SAX, XML yapısının tamamını belleğe yüklemek ve bir grafiği yeniden oluşturmak yerine, ağaçtaki her bir node tabanında gezinir ve gezilen node’un her çözümleme olayı için bir olay çıkarır (bir node’un başlangıcı veya sonu gibi).

Simple Message Transfer Protocol (SMTP): Standart istemciler e-posta mesajlarını posta su-nucularına ve posta sunucuları, mesajları kendi aralarında aktarmak için kullanır.

Simple recovery model: Veritabanı motorunun işlemlerinin çoğunu minimal olarak log’a kay-dettiği ve her checkpoint’ten sonra transaction log’unu sildiği bir kurtarma modeli. Bir Simple recovery modelde, transaction log’u yedekleyemez veya geri yükleyemezsiniz. Ayrıca, her bir veri sayfasını da geri yükleyemezsiniz. (Bkz. Bulk-Logged recovery model; Full recovery model.)

single-document interface (SDI): Kendilerine özgü uygulama ekranlarını ve kontrollerini yönet-mek için oluşturulan bir kullanıcı arayüzü. Bu uygulama tipi bir belge tipine odaklanmaz. Bunun yerine, mesleki domain’e göre bir özellikler seti sağlar. Açılan her ekran ayrı ayrı açılır.

skin dosyası: Kontrolün nasıl görünmesi gerektiğini tanımlayan bir veya daha fazla kontrol özel-liğini içeren bir dosya. Skin dosyaları ASP.NET temalarının bir parçasıdır.

SMO: Bkz. SQL Server Management Object (SMO).

snapline: Form Designer’da, kontrollerin diğer kontrollere hizalandığını veya marj ve dolgu tara-fından hesaplanan sınırlara ulaştığını gösteren bir gösterge.

snaplines: Kontrol hizalamasına yardımcı olmak üzere IDE’de beliren görsel yardımlar.

snapshot replication (enstantane replikasyonu): Subscriber ve Publisher’ı senkronize etmek üzere her çalıştığında tüm verileri kopyalayan bir replikasyon tipi.

SOAP: Talep ve cevap parametreleri için bir kodlama şeması olarak XML’i kullanan ve transport mekanizması olarak HTTP’yi kullanan, platformdan bağımsız bir veri erişim protokolü.

SOAP with Attachments (SwA): Dosyaları web servislerine ve web servislerinden transfer et-mek için MIME ve SOAP’ın bir kombinasyonunu kullanan bir teknik.

270 Ek - A

Page 275: Yazilim Proje BilgeAdam

SoapSuds: SoapSuds yardımcı programı .NET Framework 2.0 ile gelir ve uzak bir nesneden metadata’nın çıkarılması için kullanılır ve uzak nesneyi yeniden oluşturmak üzere metadata’yı kullanır.

source (kaynak): Bir veritabanını yüklerken, verilerin geldiği yer. Düz bir dosyadan bir veritabanı tablosunu yüklerken, düz dosya kaynaktır. (Bkz. hedef veya varış noktası.)

source database (kaynak veritabanı): Database Snapshot’ın kendisine karşı oluşturulduğu ve-ritabanı.

sparse file (seyrek dosya): Kendi yapısı içinde en az bir ayrılmamış yer bölgesini içeren bir dos-ya. Ayırma tablosu, dosyayı oluşturulduğu zaman belirtilen boyutuyla listeler ama dosya içindeki ayrılmamış bölgeler yüzünden, disk üzerindeki boyut çok daha düşüktür.

specific culture (özel kültür): Hem dile, hem de kültüre özgü biçimlendirme gereksinimlerini belirten bir kültürü tanımlar. Her özel kültür, iki harfli bir dil kısaltmasına ve iki harfli bir kültür kısaltmasına sahiptir. Örneğin “en-US” ABD için İngilizce dilini ve “en-GB” İngiltere için İngilizce dilini temsil eder.

SPID: Bkz. system process ID (SPID).

SPLIT: Bir bölüm fonksiyonuna yeni bir sınır noktası ekleyen bir işlem.

sponsor: Bir sponsor genellikle, bir uzak nesnenin kira süresini veya ömrünü uzatabilen bir is-temci uygulamasıdır.

SQL Server Agent proxy: Bir iş adımının SQL Server içindeki çeşitli alt sistemlere (SQL Server Integration Services çalıştırma motoru veya replikasyon motoru gibi) erişmesini sağlamak için yapılandırdığınız bir güvenlik yapısı.

SQL Server Management Object (SMO): Microsoft Visual Studio 2005 gibi geliştirme ortamla-rıyla kullanılmak üzere tasarlanmış bir class kütüphanesi. SQL Server içindeki nesnelere prog-ramsal bir arayüz sağlar. Uygulamanıza referans olarak ekleyip veritabanı sunucu üzerinde prog-ramsal olarak işlem yapılabilmesini sağlar.

SQL Server Profiler: SQL Server ile birlikte gelen ve SQL Trace için bir grafik kullanıcı arayüzü (GUI) sağlayan bir performans izleme aracı. Herhangi bir zamanda veritabanı sunucunuz üzerin-de yürütülen sorguları, bu sorguların ne kadar sürede yürütüldüğü gibi performansa ait izlemele-rin yapıldığı araç.

SQL Trace: SQL Server’da yer alan ve SQL Server içindeki hemen her alt sistemde bulunan verileri toplamanızı sağlayan bir olay API’ı (application programming interface).

stack (yığın): .NET Framework’ün bellekte değer tiplerine ayırdığı yer. Heap’te ayrılan değişken-lerden farklı olarak, geçerli kod bloğuyla ilişkili çerçeve yığından kaldırıldığında, yığın geri alınır.

stale: Veri kaynağıyla tutarlı olmayan, ön belleğe alınmış bir nesne. Genellikle, kaynak güncel-lendiğinde ama ön bellek geçersiz kılındığında ön belleğe alınan bir nesne stale haline gelir.

Standby mode: Kullanıcılara, ikincil bir veritabanına salt okunur erişim vermek için kullanılan bir kip. Bu konfigürasyon, sorguları birden fazla sunucuya dağıtmanızı ve dolayısıyla birincil sunucu-nun iş yükünü azaltmanızı sağlayarak uygulamanızın ölçeklenebilirliğini artırır.

state veya application state (durum veya uygulama durumu): Bir uygulama için verileri temsil eder. Bu durum, sisteminizin katmanları arasında hareket eder (kullanıcıdan veritabanına ve ve-ritabanından kullanıcıya).Örneğin kullanıcı adının sitenin içindeki sayfalarda session yardımıyla dolaşması.

stateless (durumsuz): Bileşen düzeyinde verileri depolamadan çalışabilmek.

271Terimler Sözlüğü

Page 276: Yazilim Proje BilgeAdam

statistics (istatistik): SQL Server 2005 tarafından oluşturulan, bir sütundaki değerlerin dağıtı-mıyla ilgili istatistik bilgiler.

stored procedure: SQL Server içinde depolanan ve uygulamalardan veya diğer programlama yapılarının içinden çağrılabilen Transact-SQL veya CLR toplu iş kodunun adı. Sorguların tek bir yerde depolanmasını ve izin verilen ölçüde yürütülmesini sağlar.

streaming: Dijital medyayı, bir ağ boyunca süreğen bir akış halinde iletmek. Dijital medya, alınır alınmaz istemci yazılım tarafından oynatılır. Streaming, genellikle bir kullanıcının bir dosyayı oy-natmadan önce indirmesini gereksiz kılar.

stress test (stres testi): Bir uygulamanın aşırı yük altında nasıl davrandığını belirleyen bir test. Stres testi, genellikle uygulamanızdaki kırılma noktalarını bulabilir.

string summary (string özeti): char, varchar, varchar(max), nchar, nvarchar, nvarchar(max), text ve ntext sütunlarında oluşturulan istatistiklerde toplanan ilave bilgiler.

structure (yapı): Diğer tiplerden oluşan, kullanıcı tarafından tanımlanmış bir değer tipi.

structured data (yapılandırılmış veri): Bir kurala uyan XML verileri. İlişkisel bir yapı kullanılarak kolayca temsil edilebilir. (Bkz. yarı yapılandırılmış veri; yapılandırılmamış veri.)

stub: Bir bileşen tarafından sunulan işlevselliği taklit eden bir kod parçası. Bir stub, uygulanabile-cek veya tamamen test edilebilecek sınıfları yönetmek için test sırasında kullanılır.

subquery (alt sorgu): Diğer bir tablodan veya kaynaktan veri döndürmek için daha büyük bir sorgunun bir parçası olarak kullanılabilecek bir sorgu.

supercomputer (süper bilgisayar): İşleme becerilerinde dünyada liderlik eden ve çok sayıda görevi çok yüksek hızlarda yönetebilen bilgisayar.

swallowing the exception (istisnayı yutmak): Bir exception’ı yakalayan ama yeniden fırlatma-yan veya bir Catch bloğu içinden yeni bir exception oluşturmayan bir kodlama deseni.

SWITCH: tablolar arasında iki bölümü takas eden, sonsuz derecede ölçeklenebilen bir işlem.

symmetric algorithm (simetrik algoritma): Private key şifrelemesi olarak da bilinir. Bu metot, bir mesajı imzalamak için kullanılan anahtarın mesajın şifresinin çözülmesi için de kullanılmasını gerektirir. Private key’in dağıtılması gerektiğinden, public key metotlarına göre daha az güvenilir olduğu kabul edilir.

symmetric encryption (simetrik şifreleme): Verileri şifrelemek ve çözmek için bir tek gizli anah-tarı kullanan bir şifreleme tekniği.

symmetric key (simetrik anahtar): Verileri kriptolamak ve şifreyi çözmek için kullanılan bir anah-tar. En hızlı şifreleme mekanizmasıdır ve sık erişilen verilerin şifrelenmesi için uygundur. (Bkz. asimetrik anahtar; sertifika.)

synchronous (senkron): Ardışık olarak meydana gelen (metodun çağrıldığı sırada) bir metodu çağırmanın bir yolu. Programının metot A’yı ve sonra metot B’yi çağırırsa, metot A döndürülene kadar metot B çağrılmaz. .Net uygulamaların standart çalışma prensibidir.

sysjobactivity: msdb veritabanında bulunan, SQL Server Agent’ın SQL Server işlerinin geçerli etkinliğini kaydetmek için kullandığı bir tablo.

sysjobhistory: msdb veritabanında bulunan, SQL Server Agent’ın işlerin geçmiş çalışmalarını izlemek için kullandığı bir tablo.

272 Ek - A

Page 277: Yazilim Proje BilgeAdam

System Monitor: Donanım, Windows alt sistemleri ve istatistiksel sayaçlar sunan diğer uygula-malar için performans sayaçlarını yakalamak üzere kullanılan, Windows’un sağladığı bir perfor-mans izleme aracı. System Monitor, PrefMon olarak da bilinir.

system process ID (SPID): Bir SQL Server sunucusuna her bağlantıyı benzersiz olarak tanım-layan bir sayı.

Ttable (tablo): Bir veritabanı içinde yer alan ve uygulamalar tarafından depolanan tüm verileri tutan temel depolama yapısı.

table-valued function (tablo değerli fonksiyon): Bir tablo değişkenini döndüren bir fonksiyon.

tail of the log (log’un kuyruğu): Bir transaction log’un, henüz yedeklenmemiş commit edilen transaction’ları içeren kısmı.

target veya destination (hedef veya varış noktası): Bir veritabanı yüklenirken, verilerin gittiği yer. Düz bir dosyadan bir veritabanı tablosu yüklenirken, veritabanı tablosu hedef veya varış noktasıdır. (Bkz. kaynak.)

template (şablon): Visual Studio’da yeni bir proje inşa ederken kullanılan varsayılan ayarları ve biçimleri temsil etmek için kullanılır. Şablon, yeni projeniz için bir yapıyı yüklemek için kullanılabilir ve başlamanızı sağlayacak belirli dosyaları içerebilir.

template control (şablon kontrolü): Kullanıcı arayüzünün (sunumun) kontrol verilerinden ve koddan ayrılmasına izin veren bir kontrol. Şablonlu kontroller, doğal olarak bir kullanıcı arayüzü sağlamaz. Bunun yerine kullanıcı arayüzü, yerel şablonlar aracılığıyla bir sayfa geliştiricisi tara-fından sağlanır; bu da, bir sayfa geliştiricisinin kontrol için kullanıcı arayüzünü özelleştirmesine imkan verir.

temporary table (geçici tablo): Karmaşık sorguların inşa edilmesini kolaylaştırmak üzere geçici olarak tanımlanabilen bir tablo. # işareti ile oluşturulur.

test case (test durumu): Bir test durumu, bir kullanıcı gereksinimini veya kullanım durumunu karşılamak üzere test uygulayıcısının çalıştırdığı görevler setidir. Test durumu, testi yapan kişinin atması gereken adımları, test girdisini ve beklenen sonuçları tanımlamalıdır. Test durumları testi yapan kişiler tarafından yazılır ve Web, yük ve entegrasyon testlerini oluşturmak için kullanılır.

test fixture (test fikstürü): Test durumunun çalıştırılmasında kullanılan ama kendisi çalıştırılabi-lir olmayan, bir görüntü veya metin dosyası gibi bir yapı.

test plan (test planı): Uygulamanın birçok açıdan doğrulanması için kullanılacak strateji ve yak-laşımı tanımlayan bir belge. Bir test planı, test yöneticisi tarafından oluşturulur ve yazılım testinin tüm unsurları üzerindeki ayrıntıları içermelidir.

test suite (test paketi): Çalıştırma ve yönetim işlemlerini kolaylaştırmak üzere mantıksal kolek-siyonlarda gruplandırılan bir veya daha fazla test durumu.

test-driven development (test güdümlü geliştirme): Herhangi bir kod yazmadan önce başarı-sız olan bir test yazma sürecini içeren bir geliştirme metodolojisi. Test tamamlandıktan (ve başa-rısız olduktan) sonra, testin geçmesi için kod eklenir. Daha sonra proje, yeni durumla sınıfın (veya sınıfların) tasarımını geliştirmek üzere, tüm testlerin geçmeye devam etmesini sağlayacak şekilde yeniden faktörlere ayrılır.

test-driven development (test güdümlü geliştirme): Kod yazmadan önce testler oluşturma süreci. Test güdümlü geliştirmede, geliştiriciler ilk önce testi ve daha sonra, bu testleri karşılayan kodu yazar.

273Terimler Sözlüğü

Page 278: Yazilim Proje BilgeAdam

theme (tema): Kontroller için varsayılanları tanımlayan veya bir web uygulamasındaki tüm say-falar için tutarlı bir görünüm sağlamak üzere belirli kontrol ayarlarını ezen, skin’ler, CSS sayfaları, görüntüler ve diğer kaynakların bir seti.

themes (temalar): ASP.NET’te, genel bir görünümü tanımlamak üzere bir sayfaya veya web sitesine bir birim olarak uygulanabilecek kontrol özelliklerinin, stil sayfalarının ve görüntülerin bir koleksiyonu.

think times (düşünme zamanları): “Think times” terimi, uygulama taleplerinden önce bir kulla-nıcının “düşünmek” için harcadığı süreyi temsil eder. Kullanıcıların bir ekranı okuması, kararlar vermesi ve veri girmesi gerekir. Test sırasında gerçek kullanıcı yükünü taklit etmek için, bu zama-nı da taklit etmek isteyeceksiniz.

third-party control (third-party kontrol): Proje ekibi tarafından oluşturulmamış veya sağlanma-mış bir kontrol. Geliştiriciler, zamanlama sorunlarını ve riski azaltmak için bu kontrolleri kullanır. Bir third-party kontrol, Visual Studio Toolbox’a gömülü ve bir form üzerinde kullanılan bir araç veya BizTalk veya Commerce Server gibi tam bir uygulama olabilir.

thread safe: Verileri, bozulmadan birden fazla thread’den eşzamanlı olarak kullanabilmek.

thread: Bir uygulamada diğer işlemlerle aynı anda meydana gelen bir işlem. Aynı zamanda, bir thread’i oluşturmak ve yönetmek için kullanılan bir Thread class’ı örneğine de karşılık gelebilir. Örneğin, aynı ayda yapılması gereken işlemler farklı thread’ler sayesinde yapılabilir. Standart bir uygulama içerisinde her işlem sıra ile yapılır ama thread sayesinde aynı anda birden fazla iş parçası asenkron olarak çalıştırılabilir.

timestamp (zaman damgası): Belirli bir eylemin meydana geldiği zamana karşılık gelen dijital bir damga. Genelde bu değerler, kullanıcı etkileşimi olmaksızın sistem tarafından otomatik olarak ayarlanmalıdır.

token: Bir tam metin indeksinde bir sözcüğün sıkıştırılmış özel bir temsili.

Toolbox: Microsoft Visual Studio IDE içindeki, bir kontrolün designer’a sürüklenebileceği pence-re.

ToolStrip: ToolStripItem’ları barındırmak için kullanılan ve kullanıcı tarafından çalışma zamanın-da kolayca yapılandırılabilen bir kontrol.

ToolStripItem: Bir ToolStrip içinde barındırılabilen kontrol. Bir menü öğesini veya ToolStrip için-de barındırılabilen birkaç kontrolden birini temsil edebilir.

ToolStripMenuItem: Bir menü öğesini temsil eden ve genellikle bir MenuStrip içinde barındırılan bir kontrol.

trace (iz): Belirli bir SQL Trace’i çalıştırıldığında çıktı olarak verilen olay ve veri sütunları.

trace events (iz olayları): SQL Server içinde çalıştırılan stored procedure’ler, veritabanı dosya-ları veya büyüyen ya da küçülen log’lar veya üretilen sorgu planları gibi eylemler.

transaction log backup (transaction log yedeği): Bir transaction log’un etkin kısmının bir yede-ği. Bu yedek, sadece commit edilmiş transaction’ları içerir ve alanın yeniden kullanılabilmesi için, log’un yedeklenmiş kısmını kaldırır.

transaction log restore (transaction log geri yüklemesi): Bir veya daha fazla transaction log yedeğini kullanan bir geri yükleme işlemi.

Transaction Undo File (TUF): Standby Mode’un tamamlanmamış tüm transaction’ları kaydettiği dosya. Geri yükleme süreci, transaction bütünlüğünü sağlamak için bu dosyayı kullanır. Bir son-raki geri yükleme süreci meydana geldiğinde, commit edilmiş tüm transaction’ları geri yükler.

274 Ek - A

Page 279: Yazilim Proje BilgeAdam

transaction: Bir grup halinde çalıştırılan komutların mantıksal bir seti.

transactional replication: Yayınlanan makalelerdeki değişiklikleri log’a kaydetmek için transac-tion log’u kullanan ve bu değişiklikleri Subscriber’lara uygulayan bir replikasyon tipi.

transmission queue (aktarım kuyruğu): Gönderilmekte olan mesajları içeren geçici bir kuyruk. Bu kuyruk, bir uç noktasının bulunamaması durumunda yeniden denenmeleri için mesajları da tutar.

Transparent Client Redirection: Visual Studio 2008 ile birlikte gelen ve principal ve mirror bağ-lantılarının bağlantı nesnesinde ön belleğe alınmasını sağlayan yeni MDAC bağlantısındaki yer-leşik işlevselliği tanımlayan süreç. Principal’ın başarısızlığında, geliştirici müdahalesi veya özel kodlama olmaksızın bir istemci bağlantısının mirror’a yeniden yönlendirilmesi için bu kod kulla-nılır.

transport layer security (transport katmanı güvenliği): Secure Sockets Layer (SSL) gibi bir transport kullanılarak, çalışma zamanında bir istemcinin sertifikası elde edilir.

trigger: Girdi parametreleri kabul etmeyen bir stored procedure’ün özel durumu. Belirtilen DDL (data definition language) veya DML (data manipulation language) işlemine cevap olarak, bu kod otomatik olarak çalıştırılır.

Triple DES: 156bit anahtarları kullanan bir simetrik şifreleme standardı. Triple DES, DES’i (Data Encryption Standard) üç defa tekrarlar.

TUF: Bkz. Transaction Undo File (TUF).

Type Library Exporter: Bir .NET tipini COM’a (Component Object Model) ihraç etmek için kul-lanılan bir araç.

Type Library Importer: Bir COM tipini .NET’e ithal etmek için kullanılan bir araç.

type safety (tip güvenliği): Yanlış eşlemelerin meydana gelememesi için belirli bir tipin doğru-lanması.

typed XML data (yazılı XML verileri): Bir XML şema dosyasındaki deklarasyonlara göre yapılan-dırılmış bir XML belgesi veya parçası.

UUMS: Bkz. User Mode Scheduler (UMS).

unboxing: Boxing meydana geldikten sonra, bir referans tipinden bir değer tipine geri dönüştür-me.

Unicode: Dillerin (Latin, Kiril, İbrani, Arapça, Çince dahil olmak üzere) ve script’lerin çoğunu des-tekleyen, on binlerce karakter içeren büyük kod sayfası.

Unified Modeling Language (UML): Yazılım mühendisliğinde kullanılan bir nesne modelleme ve spesifikasyon dili.

Uniform Resource Identifier (URI): Intranet veya internet üzerinde bulunan bir kaynağı temsil eden tanımlayıcının kısaltılmış versiyonu. Uzaktan erişimde, uzak bir nesneyi benzersiz şekilde tanımlamak için bu URI sunucu tarafında kullanılır. URL, istemci tarafından kullanılır.

uninstall (kaldırma): Bir uygulamanın tüm kalıntılarından kurtularak, makinenin uygulama asla kurulmamış gibi görünmesini sağlamak.

unit test (birim testi): Uygulamanın bir kısmını izole eden ve o “birim” üzerinde tüm koşulları test eden bir test. Birim testleri kod olarak yazıldığında ve bir birim test platformu (Visual Studio

275Terimler Sözlüğü

Page 280: Yazilim Proje BilgeAdam

2005’te yerleşik olan gibi) tarafından otomatikleştirildiğinde en etkin şekilde kullanılır. Örneğin bir metodun hata verebileceği durumların testi.

unit test suite (birim test paketi): Bir tek mantıksal varlık üzerinde gerçekleştirilen, birim testle-rin koleksiyonu. Mantıksal varlık genellikle bir class’tır.

unstructured data (yapılandırılmamış veri): Özel bir yapıya uymayan XML verileri. Her örnek tamamen farklı bir yapıyı izleyebilir; bu yüzden, üzerinde kolayca arama yapılamaz ve ilişkisel bir yapıda temsil edilmesi imkansızdır. (Bkz. yarı yapılandırılmış veri; yapılandırılmış veri.)

untyped XML data (yazılmamış XML verileri): Herhangi bir XML şema dosyasındaki deklaras-yonlara uymayan bir XML belgesi veya parçası; bu yüzden yapısının geçerliliği kontrol edilemez.

updateable view (güncellenebilir görünüm): Bir tek tabloda veri değişikliklerine izin veren bir görünüm. Değişiklikleri sadece görünümün WHERE koşuluna eşlenen satır setiyle kısıtlamak için CREATE VIEW komutu üzerinde WITH CHECK OPTION koşulunu kullanırsınız.

updategram: XML elementlerinin görünümlerine göre Transact-SQL işlemlerini formülleştirmek için kullanılan bir XML yapısı. İşlemler, orijinal XML görüntüsünün XML’in geçerli görüntüsüyle karşılaştırılması yoluyla tanımlanır. Tespit edilen değişikliklere göre belirli işlemler çalıştırılır.

use case (kullanım durumu): Genel bir kullanıcı hedefinde odaklanan görevlerin bir açıklaması. Kullanım durumları genellikle bir mesleki analist tarafından yazılır. Kullanıcının bir ürünü satın almak için izlediği görevler seti, bir kullanım durumuna örnek olabilir. Ayrıca kullanıcı senaryosu olarak da adlandırılır. Örneğin bir satış işleminin aşamaları.

user (kullanıcı): Kaynaklara erişim için tanımlanmış bir profil.

user control (kullanıcı kontrolü): GUI designer’daki kullanıcı kontrolüne ve daha sonra kulla-nıcı kontrolünün şablon dosyasına (.ascx dosyası) eklenecek her bir kontrole ekstra davranış sağlayan bir şablon kontrolü. .ascx dosyası, web sayfasının .aspx sayfasına benzer ve sayfa gerisindeki koda sahip olabilir. Yeniden kullanılabilirliği sağlamak için .ascx ve arka plandaki kod dosyalarının, kullanıcı kontrolünü gerektiren her projeye dahil edilmesi gerekir.

user control (kullanıcı kontrolü): Kompozit kontrol için diğer bir terim.

user mode (kullanıcı kipi): işletim sistemi dışındaki fonksiyonlarla ilişkilendirilmiş CPU tarafın-dan gerçekleştirilen işlem kipi. Kullanıcı kipi genellikle uygulamalar kullanıcı tarafından veya kul-lanıcı adına çalıştırıldığında kullanılır.

User Mode Scheduler (UMS): İşlemci kaynaklarını yöneten, SQL Server’ın dahili bir alt sistemi. Ayırma işlemini Windows’a delege etmek yerine, işlemciler üzerindeki tüm thread zamanlama-larını SQL Server dahili olarak yönetir. Bir makindeki her fiziksel veya mantıksal işlemci için bir UMS oluşturulur.

user preferences (kullanıcı tercihleri): Her bir kullanıcının kullanabileceği tercihler. Genellikle bu ayarlar form boyutlarını ve konumlarını, en sık kullanılan dosyaları ve son kullanılan menü seçeneklerini içerir.

user profile (kullanıcı profili): ASP.NET’in bir veritabanında sürekli olarak depolayabileceği, kullanıcıya özgü bilgiler. Kullanıcı profilleri kullanıcı tercihlerinin, demografik bilgilerin ve kişisel verilerin izlenmesi için mükemmeldir.

user requirement (kullanıcı gereksinimi): Kullanıcıların, kendi işlerinin hedeflerini karşılamak üzere gerçekleştirebilmeleri gereken bir görevi tanımlayan bir gereksinim.

user scope (kullanıcı kapsamı): Uygulama ayarlarına karşılık geldiğinde, ayarlar çalışma zama-nında okunur/yazılırdır.

276 Ek - A

Page 281: Yazilim Proje BilgeAdam

user-defined filegroup (kullanıcı tanımlı dosya grubu): İkincil dosyaları gruplandırmak için veritabanı yöneticisi tarafından oluşturulan bir dosya grubu tipi. Bir veritabanı 32,766 kullanıcı tanımlı dosya grubunu içerebilir.

utility modules (yardımcı program modülleri): Kullanılacak üst düzey bileşenler için temel teş-kil eden en alt düzey bileşenden yukarı doğru entegrasyon testi.

Vvalidation (geçerlilik denetimi): Kullanıcı tarafından sağlanan girdinin belirli gereksinimleri kar-şıladığının doğrulanması. Örneğin nümerik değerler, alan uzunlukları, değer aralıkları ve geçerli tarihler gibi.

value-setting control (değer ayarlama kontrolü): Kullanıcının, kullanıcı arayüzünde bir değer ayarlamasına imkan veren kontrol. CheckBox, RadioButton ve TrackBar sık kullanılan kontrollere örnektir.

vertical prototype (düşey prototip): Bkz. proof-of-concept prototype.

view (görünüm): SQL Server’da depolanan, adlandırılmış bir SELECT ifadesi.

ViewState: Web sayfası nesnesi ve child kontrol nesnesi verilerinin sayfa talepleri arasında sür-dürülebildiği mekanizma. Web sayfasında HTML (Hypertext Markup Language) olarak temsil edi-lemeyen nesne verileri, ViewState’e yerleştirilebilir.

virtual directory (sanal dizin): Internet Information Services’ın bir bileşeni; bu, tarayıcı URL penceresinde görünen addır. Gerçek dosyaların yer aldığı dizin aynı ada sahip olmak zorunda değildir. IIS üzerinde tanımlanmış tek bir web sitesi altında duran her web uygulaması için sanal dizin yapılması gerekir.

Wwait type (bekleme tipi): Bir sürecin, çalışmasını tamamlamak üzere beklediği kaynak tipini gösteren sembolik bir değer.

Web browser (Web tarayıcısı): HTML’de yazılmış web sayfalarını görüntülemenin platformdan bağımsız bir yolunu sunar.

Web method (Web metodu): Bir web servisinin web üzerinden çalıştırılabilen [WebMetod] attribute’ü kullanılan metodu.

Web Part: Kullanıcıların gizleyebileceği, taşıyabileceği ve özelleştirebileceği bir web kontrolünü içeren bir bileşen.

Web Parts: Özelleştirme ve kişiselleştirme sağlamak üzere birlikte çalışan tüm kontrollere karşı-lık gelen genel bir terim.

Web server (Web sunucusu): HTTP aracılığıyla tarayıcıdan gelen talepleri alır ve yönetir.

Web server control (Web sunucusu kontrolü): HTML sunucu kontrollerinden daha işlevsel ve daha tutarlı bir programlama modeli sunan bir sunucu kontrolü.

Web service (Web servisi): Hypertext Transfer Protocol (HTTP) ve Simple Object Access Proto-col (SOAP) üzerinden veri transfer etmenizi sağlayan bir uygulama. Dağıtık uygulama mimarisin-de farklı platformları ve uygulamaları birbirine bağlamayı sağlayan en kullanışlı yapıdır. Web Ser-vislerinin herhangi bir sahibi olmadığı için hemen hemen her programlama dili desteklemektedir.

Web Services Description Language (WSDL): Bir web servisi metoduna tam olarak neyin gir-diğini tanımlamak için kullanılan özelleştirilmiş bir XML grameri.

277Terimler Sözlüğü

Page 282: Yazilim Proje BilgeAdam

Web setup project (Web kurulum projesi): Bir ASP.NET web uygulamasını kolayca dağıtmak ve yapılandırmak için bir Web kurulum projesi kullanılır.

Web test: Uygulamanın kullanıcı arayüzünü test etmek için oluşturulmuş bir test. Visual Studio Team Test, web testlerinin kaydedilmesini ve verilerin web test parametrelerine seeding’ini des-tekler.

web.config dosyası: ASP.NET uygulamaları için konfigürasyon ayarlarını depolamak üzere kul-lanılan konfigürasyon bilgileri dosyası.

WebForm: HTML işaretlemesini, istemci taraflı kodu veya sunucu taraflı kodu içerebilen ve yerel programlama modeli kullanılırken bir tek dosyadan, code-behind programlama modeli kullanılır-ken bir çift dosyadan oluşan bir web sayfası.

white box testing: Uygulamanın kodunda görünürlüğe sahip bir test tipi. Geliştiriciler white box testing’i kullanır.

widening (genişletme): Hedef tip kaynak tipten gelen tüm olası değerleri barındırabildiğinde, bir değerin bir tipten bir diğerine dönüştürülmesi. Bu dönüşümler dolaylı olabilir.

Windows authentication (Windows kimlik denetimi): SQL Server 2005 için önerilen ve var-sayılan kimlik denetimi kipi. Sadece kimlik denetimi yapılmış Windows kullanıcıları SQL Server örneğine erişim kazanabilir. Bir SQL Server örneğine erişmesi gereken her Windows kullanıcısı veya grubu için bir Windows oturumu eklemeniz gerekir. (Bkz. Mixed Mode kimlik denetimi.)

Windows collation: SQL Server’ın karakter verilerini nasıl sıraladığını belirleyen bir kural seti. Kurulum sırasında Windows Control Panel ve SQL Server 2005’te adla belirtilir.

Windows Event Log: Çeşitli sistem bileşenleri ve uygulamalar tarafından rapor edilen log girdi-lerinin Windows’taki merkezi deposunun adı.

Windows kernel objects (Windows çekirdek nesneleri): Süreçler arası senkronizasyonu ger-çekleştiren, işletim sistemi tarafından sağlanmış mekanizmalar. Bunlar mutex’leri, semaphore’ları ve event’ları içerir.

Windows Management Instrumentation: Yönetilen bir ortamda, nesneler hakkındaki bilgilere erişim sağlayan bir teknoloji. Özellikle bilgisayarın donanım bilgilerine erişmek için kullanılır.

Windows Media dosyası: Ses, video veya script verilerini içeren bir dosya. Dosyanın içeriği, Windows Media codec’lerinden biriyle kodlanır.

Windows Performance Monitor: Sistem ve çalışmakta olan uygulamalar hakkındaki çeşitli sa-yaçların izlenmesini sağlamak üzere işletim sistemine dahil edilen Windows uygulaması.

Windows Registry: Windows işletim sistemi, third-party yazılım ve donanım aygıtları hakkındaki konfigürasyon bilgilerini depolamak için kullanılan merkezi, hiyerarşik bir veritabanı.

witness (witness server): High Availability işletim kipindeki arbiter (hakem). Witness’ın amacı, veritabanının aynı anda birden fazla örneğe sunulamamasını garantilemektir.

wizard (sihirbaz): Bir iletişim kutusu aracılıyla bir görevi otomatikleştiren bir kullanıcı yardımı biçimi.

word breaker: Tam metin indeksli bir sütun içinden geçerli sözcükleri çıkaran bir rutin. Bu rutin, indeks popülasyonu ve tam metin sorgulama sırasında kullanılır.

working set (çalışma seti): Belirli bir sürece adanmış fiziksel bellek. Geliştiricilerin çoğu için bu, bir uygulamayı çalıştırmak için gereken bellek miktarıdır. Ayrıca memory footprint olarak da adlandırılır.

278 Ek - A

Page 283: Yazilim Proje BilgeAdam

workload file (iş yükü dosyası): DTA (Database Engine Tuning Advisor) için bir girdi olarak kullanılan SQL Server Profiler izi.

wrapping an exception (bir istisnayı sarmalamak): Orijinal bir exception’ın yakalandığı ve fark-lı bir tipe dönüştürüldüğünde meydana gelen bir süreç. Orijinal exception, InnerException özelli-ğine yerleştirilir. Bu nedenle yeni exception orijinal exception’ı “sarmalar.”

WS-*: gevşek şekilde eşlenmiş sistemlerde Security, Reliable Messaging ve Transactions’ı kap-sayan, gelişmekte olan web servisi standartlarının tümü için yaygın olarak kullanılan bir kısalt-ma.

WS-Attachments: Web servis taleplerine eklerin nasıl ekleneceğini tanımlayan bir standardın adı.

XXML (eXtensible Markup Language): Uygulama tarafından okunabilen bilgilerin depolanması için standartlaştırılmış, metin tabanlı bir belge.

XML validation (XML geçerlik kontrolü): Bir XML örneğinin, bir XML şema dosyası tarafından tanımlanan tanımlara uyup uymadığını belirleme süreci.

XML: Verileri tanımlamak üzere kullanılan ve World Wide Web Consortium (W3C) tarafından yönetilen bir işaretleme dili.

XML-Binary Optimized Package (XOP): İkili verileri, verilerin 64 tabanlı kodlamasına başvurul-mayacak şekilde XML belgeleriyle nasıl ilişkilendirileceğini tanımlayan bir standart.

XmlDocument: XML verilerinin bellek içi (bellek (ram)) temsilini sağlayan bir class.

XmlNode: Bir XML node’nun, eğer varsa child node’lar da dahil olmak üzere bellek içi bir temsi-li.

XmlReader: Bir XML dosyasına veya stream’ine ön belleğe alınmamış, forward-only (sadece ileri yönlü) erişimini sağlayan soyut class.

XmlWrite: Forward tabanlı (ileri yönlü) bir XML yazma modelini sağlayan soyut class.

XPATH: Hem XML yapısının, hem de XML içeriğinin geçerliğini kontrol etmek üzere, bir XML örneği içindeki belirli node’ların aranması için bir mekanizma tanımlayan bir W3C (World Wide Web Consortium) spesifikasyonu.

XPATH axes: Bir XPATH deyiminde, deyimin döndürmesi gereken node setini tanımlayan bir adımı temsil eder.

XPATH predicates: Bir XPATH deyimindeki axes tarafından tanımlanan node koleksiyonuna uygulanan koşullu bir filtreyi temsil eder. XPATH deyimi tarafından sadece eşlenen node’lar dön-dürülecektir.

XQUERY: XML verilerini sorgulamak için kullanılan deklaratif bir programlama dilini tanımlayan bir W3C (World Wide Web Consortium) spesifikasyonu.

279Terimler Sözlüğü