Uygulamalı Yazılım Projeleri

Transkript

Uygulamalı Yazılım Projeleri
YAZILIM UZMANLIĞI
Uygulamalı Yazılım Projeleri
Okan Tekeli
Editör C. Banu Üçüncüoğlu
Uygulamalı Yazılım Projeleri
Okan 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]
İçindekiler
Proje 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
Önsöz
Yazı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 bulacaksı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örebilmenizde 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
1
Proje 1:
herkesburada.com
1 Proje 1:
herkesburada.com
•
Görüşmeler
•
Uygulama Tasarımı
Proje 1: herkesburada.com
Görüşmeler
Ahmet Becerikli (Proje Sahibi)
Yapmak istediğimiz web uygulaması sayesinde üyelerimizin site üzerinden arkadaşlıklar kurmaları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.
Tablo 1.1: Müşteri İhtiyaçları Tablosu
Ad
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 mi
Fobileri
Alkol Kullanır mı
İstediğim zaman eğitim durumu, ilgi alanı, şehir, ülke, meslek ve takım tanımlamalarını yapabilmeliyim. 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 arkadaşı 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 arkadaş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 yapabilsin 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çerisinde 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 Analizi
Projeye başlamadan önce bir analiz yapılacak olursa;
1. 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 teknolojisi kullanılacak.
Proje 1
2. Kullanıcılar arası mesajlaşma sistemi olacak.
3. Kullanıcılar sadece onayladıkları kullanıcılar ile mesajlaşabilecek
4. Chat uygulaması olacak.
5. Kullanıcı bazlı fotoğraf galerisi olacak.
6. 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 Command Prompt aracını çalıştırın.
Uygulama kısayolu programlar menüsünde bulunamıyorsa Başlat > Çalıştır > “C:\Program Files\Microsoft Visual Studio 9.0\VC\” komutunu yürütün.

Aspnet_regsql komutunu çalıştırın. Çıkan sihirbazdan HerkesBuradaDb veritabanı seçin ve yapılandırın.
Şekil 1.1: Membership veritabanı oluşturmak.
Veritabanının üyelik sistemini kullanacağı tablolar oluşturulduktan sonra HerkesBuradaDb veritabanı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.
Şekil 1.2: Sehirler tablosu.
Şekil 1.4: Albumler tablosu.
Şekil 1.3: Takimlar tablosu.
Şekil 1.5: ArkadasListesi tablosu.
herkesburada.com
Şekil 1.6: EgitimDurumlari tablosu.
Şekil 1.7: Fotograflar.
Tüm tablolardaki primary key sütunlarınının
identity specification‘ı Yes yapılmalı ve identitty
increment ve seed 1 olarak belirtilmelidir.
Şekil 1 8: Mesajlar tablosu.
Şekil 1.9: Meslekler tablosu.
Oluşturulan tablolardaki ilişkileri yapılandırın.
Kaynak Tablo
Kaynak Sütun
Hedef Tablo
Hedef Sütün
Albumler
KullaniciId
aspnet_Users
UserId
ArkadasListesi
Kim
aspnet_Users
UserId
ArkadasListesi
Kimin
aspnet_Users
UserId
Fotograflar
AlbumId
Albumler
AlbumId
Arayüz Tasarımı
Visual Studio programını açın. New > Web Site > şablonunu seçin. Proje adını HerkesBuradaWebUI şeklinde verin. Dil olarak C# seçin. Version olarak ise .Net Framework 3.5 seçin.
Şekil 1.10 : Yeni web sitesi oluşturma ekranı.
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 (system.web düğümü hemen üzerine) connectionStrings düğümü ekleyin. Mevcut ConnectionString düğümü silinmeli ve daha sonra aşağıdaki düğüm eklenmeli (Liste 1.1).
Proje 1
<connectionStrings>
<clear/>
<add name=”LocalSqlServer” connectionString=”server=.;data
base=HerkesBuradaDb;user id=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.
Şekil 1.11: Asp.Net Web Administration Application.
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ı (“;” kullanmayı 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;
1. Security sekmesi altındaki Users bölümü içerisinden Select authentication type link’ine tıklayın.
2. From Internet seçeneği seçin. Done butonuna tıklayın.
3. Security Sekmesi içerisinden Roles bölümünden Enable Roles link’ine tıklayın.
4. Security Sekmesi içerisinden Roles bölümünden Create or Manage roles link’ine tıklayın.
5. Admin ve Standart olarak 2 adet rol ekleyin.
herkesburada.com
6. Internet Explorer penceresini kapatıp uygulamaya dönün.
7. 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.
8. Solution Explorer penceresinden uygulama üzerinde sağ tıklayın. New Folder menüsünü işaret edin. Klasör ismini admin olarak verin.
9. 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)
10. Security sekmesinden Access Rules bölümünden Create
access rules link’ine tıklayın.
11. 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 kontrolünü seçin. Karşısındaki dropdownlist’ten Admin seçin.
Şekil 1.12: Asp.Net Configuration Tool’u
çalıştırmak.
12. Permission bölünden Allow seçeneğini seçin ve OK butonuna tıklayın.
13. Security sekmesinden Access Rules bölümünden Create access rules link’ine tıklayın.
14. 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.
15. 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ıklayı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 grubuna, 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 yasaklanırsa, daha sonradan izin verilen kullanıcılar bile erişemeyecek. Yanlış kullanıma örnek olarak;
<authorization>
<deny users=”*” />
<allow roles=”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/>
<add name=”AspNetSqlMembershipProvider”
type=”System.Web.Security.SqlMembershipProvider, System.
Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d
50a3a”
connectionStringName=”LocalSqlServer”
Proje 1
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 karakter 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.
Admin kullanıcısı oluşturulurken Admin rolü
seçili olmalı.
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>
<group name=”KisiselBilgiler”>
<add name=”Ad” type=”System.String”/>
<add name=”Soyad” type=”System.String”/>
DateTime”/>
<add name=”DogumTarihi” type=”System.
Boolean”/>
<add name=”Cinsiyet” type=”System.
type=”System.String”/>
<add name=”YasadigiSehirId”
</group>
String”/>
<add name=”EgitimDurumId” type=”System.
<add name=”Hobileri” type=”System.String”/>
<add name=”Fobileri” type=”System.String”/>
<add name=”Hakkinda” type=”System.String”/>
<add name=”MeslekId” type=”System.String”/>
String”/>
<add name=”OkuduguKitaplar” type=”System.
String”/>
<add name=”TuttuguTakimId” type=”System.
herkesburada.com
String”/>
<add name=”YaptigiSporlar” type=”System.
Boolean”/>
<add name=”SigaraKullanirMi” type=”System.
Boolean”/>
<add name=”AlkolKullanirMi” type=”System.
<add name=”ProfilYetki” type=”System.Boolean”
defaultValue=”true”/>
<add name=”ProfilResmi” type=”System.String”
defaultValue=”resimyok.jpg”/>
</properties>
</profile>
Profile düğümü
System.Web içerisinde yer alır.
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.
<authentication mode=”Forms”>
forms>
<forms defaultUrl=”~/kullanici/default.aspx”></
</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: 1px solid #89a5e0;
border-top: none;
}
.AnaIcerik
{
width:100%;
height:100%;
text-align:left;
10
Proje 1
}
#Menu
{
background-color: #89a5e0;
height: 30px;
width: 100%;
}
#Baslik
{
background-color:#3b5998;
}
#Icerik
{
padding: 10px 20px;
}
#SonBlum
{
text-align: center;
font-weight: bold;
color: Gray;
text-decoration: none;
margin-top: 10px;
}
body
{ margin: 0 auto 0 auto;
padding: 0;
color: #000000;
text-align: center;
}
.SolMenu
{
width:20%;
float:left;
}
.KullaniciIcerik
herkesburada.com
{
width:79%;
float:right;
font-size:small;
font-family:Verdana;
}
.KullaniciIcerik a
{
font-size:small;
}
a, a:link, a:visited, a:active
{
color: #000;
text-decoration: none;
}
a:hover
{
text-decoration: underline;
}
#Menu, #Menu a
{
color: #fff;
font-size: 18px;
font-weight: bold;
text-decoration: none;
}
#Menu .Separator
{
font-size: 18px;
}
#Menu .Text
{
font-size: 14px;
}
img
{
border: none;
11
12
Proje 1
}
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çerisindeki 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 kullanı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)
<%@ Control Language=”C#” AutoEventWireup=”true”
CodeFile=”UstMenu.ascx.cs” Inherits=”Controls_Menu” %>
<table cellpadding=”0” cellspacing=”0” style=”width: 700px;
height: 30px;”>
<tr>
<td style=”width: 500px; vertical-align: middle;”>
&nbsp;
herkesburada.com
<a id=”A1” href=”~/” runat=”Server”>Ana Sayfa</a> <span
class=”Separator”>|</span>&nbsp;
<asp:LoginView runat=”server” ID=”lv1”>
<AnonymousTemplate>
<a id=”A4” href=”~/Login.aspx” runat=”Server”>Giriş</a>
</AnonymousTemplate>
<LoggedInTemplate>
<asp:LinkButton ID=”lnkLogout” runat=”server”
OnClick=”lnkLogout_Click” >Çıkış</asp:LinkButton>
</LoggedInTemplate>
<RoleGroups>
<asp:RoleGroup Roles=”Admin”>
<ContentTemplate>
<asp:LinkButton ID=”lnkLogout” runat=”server”
OnClick=”lnkLogout_Click” >Çıkış</asp:LinkButton>
<span class=”Separator”>|</span> <a id=”A5” href=”../
Admin/default.aspx” runat=”Server”>
Yönetim</a>
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
</asp:LoginView>
</td>
<td style=”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ında kullanıcı çıkış işlemini yaptırın. (Web User Control’ün kod dosyası - Liste 1.8.)
protected void lnkLogout_Click(object sender, EventArgs e)
{
FormsAuthentication.SignOut();
Session.Clear();
Response.Redirect(“~/default.aspx”);
}
Liste 1.8: lnkLogout linkbutton kontrolü Click olayı.
13
14
Proje 1
Uygulamanın tasarımda tek bir arayüz kullanabilmek için Ajax Master Page ekleyin ve ismini herkesburada.master olarak belirleyin ve Liste 1.9’da belirtilen tasarımı yapın.
<%@ Master Language=”C#” AutoEventWireup=”true”
CodeFile=”herkesburada.master.cs” Inherits=”herkesburada” %>
<%@ Register Src=”Controls/UstMenu.ascx” TagName=”Menu”
TagPrefix=”uc1” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head id=”Head1” runat=”server”>
<title>Herkes Burada</title>
<link href=”Style/Genel.css” rel=”stylesheet” type=”text/css”
/>
</head>
<body>
<form id=”form1” runat=”server”>
<div id=”SayfaAna”>
<div id=”Baslik”>
<img src=”~/SiteResimleri/Logo.gif” runat=”server”
id=”imgLogo” alt=”Herkes Burada” /></div>
<div id=”Menu”>
<uc1:Menu ID=”Menu1” runat=”server” />
<asp:ScriptManager ID=”ScriptManager1” runat=”server”>
</asp:ScriptManager>
</div>
<div id=”Icerik”>
<asp:ContentPlaceHolder ID=”AnaIcerik” runat=”server”>
</asp:ContentPlaceHolder>
</div>
</div>
<div id=”SonBolum”>
<!-- Daha sonradan buraya copyright bilgileri gelebilir. ->
</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.
herkesburada.com
Şekil 1.13: herkesburada.master sayfa tasarımı.
Bu aşamadan sonra uygulamaya eklenecek tüm Ajax Web Form’larını
herkesburada.master dosyasından türetin. Yeni bir Ajax Web Form eklerken master page seçtirip herkesburada.master dosyasını seçin. Kullanıcıların kayıt olabilmelelerini sağlamak için kayit.aspx isminde bir Ajax
Web Form ekleyin.
Web Form eklerken
master page seçtirmeyi unutmayın.
kayit.aspx içerisine bir fieldset ekleyin. Eklenecek fieldset’i Content Place Holder içerisine ekleyi
unutmayın.
<fieldset style=”width: 320px; height: 260px”>
<legend>Yeni Üye?</legend>
</fieldset>
Eklenen bu fieldset içerisine Create User Wizard kontrolü ekleyin. ID özelliğini KullaniciKayit olarak değiştirin. Özelliklerinde Türkçeleştirilebilen tüm özellikleri Türkçeleştirin. Örneğin PasswordLabelText özelliğini Şifre olarak değiştirin. Ek olarak Tablo 1.2’deki özellikleri atayın.
Tablo 1.2: CreateUserWizard Kontrolünde Değiştirikecek Özellikler
Özellik
Değer
ContinueDestinationPageUrl
~/kullanici/default.aspx
Kayit.aspx formunun tasarımı Şekil 1.14’deki gibidir.
Şekil 1.14: Kayit.aspx sayfası.
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 kontrolünün CreatedUser olayında kullanıcıyı standart rol grubuna alın.
protected void KullaniciKayit_CreatedUser(object sender, EventArgs
e)
{
15
16
Proje 1
MembershipUser user = 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.
Tablo 1.3: Login.aspx Sayfası Üzerindeki Login Kontrolüne Eklenecek Özellikler
Özellik
Değer
CreateUserText
Beni de aranıza alın
CreateUserUrl
~/kayit.aspx
PasswordRecoveryText
Şifremi Unuttum
PasswordRecoveryUrl
~/sifrehatirlat.aspx
Login.aspx sayfasının çıktısı Şekil 1.15‘de gösterilmiştir.
Şekil 1.15: Login.aspx sayfasının tasarım görünümü.
Uygulamaya sifrehatirlat.aspx isimli bir tane Web Form ekleyin. Sayfadaki Content’e PasswordRecovery 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.
Şekil 1.16: SifreHatirlat.aspx sayfasının tasarım görünümü.
herkesburada.com
Bir ziyaretçi web sitesine ilk girdiği zaman kullanıcıyı karşılayacak olan default.aspx sayfasını
uygulamaya ekleyin.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.master”
AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_
Default” Title=”Herkesburada.com” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<center> <asp:Panel ID=”Panel1” runat=”server”
CssClass=”AnaIcerik” Height=”100%” Width=”70%”>
<p>
&nbsp;</p>
<p>
<font style=”font-size: small; color: gray; fontfamily: Verdana”>&nbsp;Album ouşturun,
arkadaşlarınız ile mesajlaşın, yeni arkadaşlar
bulun, profil güncelleyin ve albumlere
göz atın.&nbsp;</font></p>
<center>
<asp:Button ID=”btnKaydol” runat=”server”
BackColor=”Green” Font-Names=”Verdana” Font-Size=”Small”
ForeColor=”White”
OnClick=”btnKaydol_Click” />
Text=”Aramıza Katıl”
</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.
protected void Page_Load(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
Response.Redirect(@”~\kullanici\default.aspx”);
}
protected void btnKaydol_Click(object sender, EventArgs e)
{
Response.Redirect(“login.aspx”);
}
Liste 1.12: Default.aspx kod satırı.
17
18
Proje 1
Şekil 1.17: Default.aspx sayfa tasarım görünümü.
Web sitesinde oluşabilecek hataları kullanıcıya daha güzel ve anlaşılır göstermek için hata sayfaları 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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.master”
AutoEventWireup=”true” CodeFile=”404.aspx.cs” Inherits=”Hata_404”
Title=”Untitled Page” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<font color=”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 hatalar haricinde oluşabilecek her hata için genel bir generic hata sayfası yapın ve ismini hata.aspx
verin.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.master”
AutoEventWireup=”true” CodeFile=”hata.aspx.cs” Inherits=”Hata_
hata” Title=”Untitled Page” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<font color=”Red”>
<center>
&nbsp;</center>
<center>
herkesburada.com
&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ı yerine sizin özelleştirdiğiniz hata sayfalarını (custom error page) gösterecek.
<customErrors mode=”RemoteOnly” defaultRedirect=”~/Hata/hata.
aspx”>
<error redirect=”~/Hata/404.aspx” statusCode=”404”/>
<error redirect=”~/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.
<?xml version=”1.0” encoding=”utf-8”?>
<configuration>
<system.web>
<authorization>
<allow roles=”Standart” />
<allow roles=”Admin” />
<deny users=”?” />
</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 isminde 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.
<%@ Control Language=”C#” AutoEventWireup=”true” CodeFile=”Kullan
iciSolMenu.ascx.cs” Inherits=”Controls_KullaniciSolMenu” %>
<fieldset style=”height: auto; width: auto”>
<legend><font style=”font-size:smaller”>Bilgilerim</font></
legend>
<br />
19
20
Proje 1
<a href=”profilresmi.aspx” title=”Resminizi Guncelleyin”><c
enter><asp:Image ID=”imgUser” runat=”server” AlternateText=”Uye
Resminiz” GenerateEmptyAlternateText=”True” /></center></a><br />
<font style=”font-size:x-small”>&nbsp; Hoşgeldin</font>
<asp:LoginName ID=”LoginName1” runat=”server” FontNames=”Verdana” Font-Size=”X-Small”
ForeColor=”Blue” />
</fieldset>
<br />
<asp:Menu ID=”Menu1” runat=”server” BackColor=”#E3EAEB”
DynamicHorizontalOffset=”2”
Font-Names=”Verdana” Font-Size=”Small” ForeColor=”#666666”
Height=”115px” StaticSubMenuIndent=”10px”
Width=”158px”>
<StaticMenuItemStyle HorizontalPadding=”5px”
VerticalPadding=”2px” />
<DynamicHoverStyle BackColor=”#666666” ForeColor=”White” />
<DynamicMenuStyle BackColor=”#E3EAEB” />
<StaticSelectedStyle BackColor=”#1C5E55” />
<DynamicSelectedStyle BackColor=”#1C5E55” />
<DynamicMenuItemStyle HorizontalPadding=”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:MenuItem Text=”Albumlerim” Value=”Albumlerim”
NavigateUrl=”~/Kullanici/albumlerim.aspx”></asp:MenuItem>
<asp:MenuItem Text=”Bilgilerim” Value=”Bilgilerim”
NavigateUrl=”~/Kullanici/bilgiler.aspx”></asp:MenuItem>
</Items>
<StaticHoverStyle BackColor=”#666666” ForeColor=”White” />
</asp:Menu>
<br />
<fieldset style=”height: auto; width: auto”>
<legend><font style=”font-size:smaller”>Üye Ara</font></legend>
<asp:TextBox ID=”txtRumuz” runat=”server” Width=”125px”></
asp:TextBox><br />
&nbsp;<asp:Button ID=”btnAra” runat=”server” Text=”Ara” /><br
/>
<asp:HyperLink ID=”HyperLink1” runat=”server” FontSize=”Small” ForeColor=”Blue”
NavigateUrl=”~/kullanici/detayliarama.aspx”>Detaylı
Arama</asp:HyperLink><br /></fieldset>
&nbsp;<br />
<br />
herkesburada.com
KullaniciSolMenu.ascx kontrolünde en üstte bir fieldset tanımlandı ve
içerisine kullanıcının resimini gösterebilmek için Image kontrolü eklendi. Hemen altında karşılama mesajı olarak Hoşgeldiniz yazıldı ve
LoginName kontrolü eklendi.
LoginName kontrolü oturum açan kullanıcının oturum adını almayı sağlar.
Orta bölümde kullanıcıların sayfalarda gezinmelerini sağlamak için Menu kontrolü eklendi ve gerekli 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 belirtmemiş 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 doldurmamış kullanıcının resminde gösterilecek. Bundan sonra oluşturulacak her sayfada bu menu
kullanılacak.
protected void Page_Load(object sender, EventArgs e)
{
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ı.
Eklenen her sayfayı
herkesburada.master
sayfasından türetin.
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 KullaniciSolMenu.ascx kontrolünü ekleyin.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”Default.aspx.cs”
Inherits=”Kullanici_Default” Title=”Üye Ana Sayfa” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
</div>
</asp:Content>
Liste 1.18: Default.aspx sayfası html tasarımı.
21
22
Proje 1
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.
Şekil 1.18: Kullanici/default.aspx sayfa tasarım görüntüsü.
Default.aspx sayfasının en üstünde belirtilen declaration haricindeki tüm kodları koplayalıp yapıştırabilirsiniz.
Kullanici klasörü içerisine Mesajlarim.aspx isminde bir Web
Form Ekleyin. Kullanıcının gelen ve giden mesajlarının listeleneceği sayfası olacak. Sayfayı default.aspx’teki gibi iki div
içerisine bölün.
<%@ Register Assembly=”AjaxControlToolkit” Namespace=”AjaxControl
Toolkit” TagPrefix=”cc1” %>
<%@ Register Src=”~/Controls/KullaniciSolMenu.ascx” TagName=”Kull
aniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<script language=”javascript” type=”text/javascript”>
function YeniMesajGoster()
{
window.open(‘yenimesaj.aspx’,’yenimesaj’,’width=350,h
eight=250’);
}
</script>
herkesburada.com
<div class=”KullaniciIcerik”>
<br />
<asp:LinkButton ID=”lnkYeniMesaj” OnClientClick=”YeniMe
sajGoster(); return false;” runat=”server” ForeColor=”Blue”
Width=”67px”>Yeni Mesaj</asp:LinkButton><br />
<asp:UpdatePanel ID=”UpdatePanel1” runat=”server”>
<ContentTemplate>
<br />
<cc1:TabContainer ID=”TabContainer1” runat=”server”
ActiveTabIndex=”0” Width=”625px”>
<cc1:TabPanel ID=”TabPanel1” runat=”server”
HeaderText=”TabPanel1”>
<ContentTemplate>
<asp:GridView ID=”gelenMesajlar” runat=”server”
AllowPaging=”True” AllowSorting=”True”
AutoGenerateColumns=”False” BackColor=”White”
BorderColor=”#CCCCCC” BorderStyle=”None”
BorderWidth=”1px” CellPadding=”4” DataKeyNames=”M
esajId,OkunduMu” DataSourceID=”SqlDataSource1”
EmptyDataText=”Gelen Mesajınız bulunmuyor...”
ForeColor=”Black” GridLines=”Horizontal”
Width=”100%” OnRowDeleting=”gelenMesajlar_
RowDeleting” OnRowDataBound=”gelenMesajlar_RowDataBound”>
<FooterStyle BackColor=”#CCCC99” ForeColor=”Black”
/>
<Columns>
<asp:HyperLinkField DataNavigateUrlFields=”
UserName” DataNavigateUrlFormatString=”~/kullanici/profildetay.
aspx?user={0}”
DataTextField=”UserName” HeaderText=”G&#2
46;nderen” />
<asp:HyperLinkField DataNavigateUrlFields
=”MesajId” DataNavigateUrlFormatString=”~/kullanici/mesajoku.
aspx?mesaj={0}”
DataTextField=”Baslik” HeaderText=”Konu”
/>
<asp:BoundField DataField=”Tarih”
DataFormatString=”{0:d}” HeaderText=”Tarih” HtmlEncode=”False”
SortExpression=”Tarih” />
<asp:TemplateField ShowHeader=”False”>
<ItemTemplate>
<asp:LinkButton ID=”LinkButton1”
OnClientClick=”return confirm(‘Mesajı silmek istediğinizden
emin misiniz?’)” runat=”server” CausesValidation=”False”
CommandName=”Delete”
Text=”Sil”></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
23
24
Proje 1
</Columns>
<SelectedRowStyle BackColor=”#CC3333” FontBold=”True” ForeColor=”White” />
<PagerStyle BackColor=”White” ForeColor=”Black”
HorizontalAlign=”Right” />
<HeaderStyle BackColor=”#333333” Font-Bold=”True”
ForeColor=”White” />
</asp:GridView>
</ContentTemplate>
<HeaderTemplate>
Gelen Mesajlarım
</HeaderTemplate>
</cc1:TabPanel>
<cc1:TabPanel ID=”TabPanel2” runat=”server”
HeaderText=”TabPanel2”>
<ContentTemplate>
<asp:GridView ID=”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%”>
<FooterStyle BackColor=”#CCCC99”
ForeColor=”Black” />
<Columns>
<asp:BoundField
DataField=”UserName” HeaderText=”Kime” SortExpression=”Kimden” />
<asp:BoundField DataField=”Baslik”
HeaderText=”Başlık” SortExpression=”Baslik” />
<asp:BoundField DataField=”Tarih”
DataFormatString=”{0:d}” HeaderText=”Tarih” HtmlEncode=”False”
SortExpression=”Tarih” />
<asp:TemplateField
ShowHeader=”False”>
<ItemTemplate>
<asp:LinkButton
ID=”LinkButton1” runat=”server” CausesValidation=”False”
CommandName=”Delete”
OnClientClick=”return
confirm(‘Mesajı silmek istediğinden emin misiniz?’)” Text=”Sil”></
asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
herkesburada.com
</Columns>
<SelectedRowStyle BackColor=”#CC3333”
Font-Bold=”True” ForeColor=”White” />
<PagerStyle BackColor=”White”
ForeColor=”Black” HorizontalAlign=”Right” />
<HeaderStyle BackColor=”#333333”
Font-Bold=”True” ForeColor=”White” />
</asp:GridView>
<asp:SqlDataSource ID=”SqlDataSource2”
runat=”server” ConflictDetection=”CompareAllValues”
ConnectionString=”<%$
ConnectionStrings:ConStrHerkesBurada %>” DeleteCommand=”DELETE
FROM [Mesajlar] WHERE [MesajId] = @original_MesajId AND [Kimden]
= @original_Kimden AND [Kime] = @original_Kime AND [Baslik] = @
original_Baslik AND [MesajIcerik] = @original_MesajIcerik AND
[Tarih] = @original_Tarih “
InsertCommand=”INSERT INTO [Mesajlar]
([MesajId], [Kimden], [Kime], [Baslik], [MesajIcerik], [Tarih],
[OkunduMu]) VALUES (@MesajId, @Kimden, @Kime, @Baslik, @
MesajIcerik, @Tarih)”
OldValuesParameterFormatString=”orig
inal_{0}” SelectCommand=”SELECT [MesajId], [UserName], [Baslik],
[MesajIcerik], [Tarih] &#13;&#10;FROM [Mesajlar] m &#13;&#10;Inner
Join aspnet_Users a on a.UserId = m.Kime&#13;&#10;WHERE ([Kimden]
= @Kimden And GondericiyeGosterme=’False’) ORDER BY [Tarih]”
UpdateCommand=”UPDATE [Mesajlar]
SET [Kimden] = @Kimden, [Kime] = @Kime, [Baslik] = @Baslik,
[MesajIcerik] = @MesajIcerik, [Tarih] = @Tarih WHERE [MesajId] =
@original_MesajId AND [Kimden] = @original_Kimden AND [Kime] = @
original_Kime AND [Baslik] = @original_Baslik AND [MesajIcerik] =
@original_MesajIcerik AND [Tarih] = @original_Tarih”>
<InsertParameters>
<asp:Parameter Name=”MesajId”
Type=”Object” />
<asp:Parameter Name=”Kimden”
Type=”Object” />
<asp:Parameter Name=”Kime”
Type=”Object” />
<asp:Parameter Name=”Baslik”
Type=”String” />
<asp:Parameter Name=”MesajIcerik”
Type=”String” />
<asp:Parameter Name=”Tarih”
Type=”DateTime” />
</InsertParameters>
<SelectParameters>
<asp:SessionParameter
Name=”Kimden” SessionField=”UserId” />
</SelectParameters>
25
26
Proje 1
<UpdateParameters>
<asp:Parameter Name=”Kimden”
Type=”Object” />
<asp:Parameter Name=”Kime”
Type=”Object” />
<asp:Parameter Name=”Baslik”
Type=”String” />
<asp:Parameter Name=”MesajIcerik”
Type=”String” />
<asp:Parameter Name=”Tarih”
Type=”DateTime” />
<asp:Parameter Name=”OkunduMu”
Type=”Boolean” />
<asp:Parameter Name=”original_
MesajId” Type=”Object” />
<asp:Parameter Name=”original_
Kimden” Type=”Object” />
<asp:Parameter Name=”original_
Kime” Type=”Object” />
<asp:Parameter Name=”original_
Baslik” Type=”String” />
<asp:Parameter Name=”original_
MesajIcerik” Type=”String” />
<asp:Parameter Name=”original_
Tarih” Type=”DateTime” />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name=”original_
MesajId” Type=”Object” />
<asp:Parameter Name=”original_
Kimden” Type=”Object” />
<asp:Parameter Name=”original_
Kime” Type=”Object” />
<asp:Parameter Name=”original_
Baslik” Type=”String” />
<asp:Parameter Name=”original_
MesajIcerik” Type=”String” />
<asp:Parameter Name=”original_
Tarih” Type=”DateTime” />
</DeleteParameters>
</asp:SqlDataSource>
</ContentTemplate>
<HeaderTemplate>
Giden Mesajlarım
</HeaderTemplate>
</cc1:TabPanel>
</cc1:TabContainer><br />
herkesburada.com
<asp:SqlDataSource ID=”SqlDataSource1” runat=”server”
ConflictDetection=”CompareAllValues”
ConnectionString=”<%$ ConnectionStrings:
ConStrHerkesBurada %>”
DeleteCommand=”DELETE FROM [Mesajlar] WHERE
[MesajId] = @original_MesajId AND [Kimden] = @original_Kimden
AND [Kime] = @original_Kime AND [Baslik] = @original_Baslik AND
[MesajIcerik] = @original_MesajIcerik AND [Tarih] = @original_
Tarih “
InsertCommand=”INSERT INTO [Mesajlar] ([MesajId],
[Kimden], [Kime], [Baslik], [MesajIcerik], [Tarih]) VALUES (@
MesajId, @Kimden, @Kime, @Baslik, @MesajIcerik, @Tarih)”
OldValuesParameterFormatString=”origi
nal_{0}” SelectCommand=”SELECT [MesajId], [UserName],
[Baslik], [MesajIcerik], [Tarih] ,OkunduMu&#13;&#10;FROM
[Mesajlar] m &#13;&#10;Inner Join aspnet_Users a on
a.UserId = m.Kimden&#13;&#10;WHERE ([Kime] = @Kime And
AliciyaGosterme=’False’) ORDER BY OkunduMu,[Tarih] &#13;&#10;”
UpdateCommand=”UPDATE [Mesajlar] SET [Kimden] =
@Kimden, [Kime] = @Kime, [Baslik] = @Baslik, [MesajIcerik] = @
MesajIcerik, [Tarih] = @Tarih WHERE [MesajId] = @original_MesajId
AND [Kimden] = @original_Kimden AND [Kime] = @original_Kime
AND [Baslik] = @original_Baslik AND [MesajIcerik] = @original_
MesajIcerik AND [Tarih] = @original_Tarih AND [OkunduMu] = @
original_OkunduMu”>
<DeleteParameters>
<asp:Parameter Name=”original_MesajId”
Type=”Object” />
<asp:Parameter Name=”original_Kimden”
Type=”Object” />
<asp:Parameter Name=”original_Kime”
Type=”Object” />
<asp:Parameter Name=”original_Baslik”
Type=”String” />
<asp:Parameter Name=”original_MesajIcerik”
Type=”String” />
<asp:Parameter Name=”original_Tarih”
Type=”DateTime” />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name=”Kimden” Type=”Object” />
<asp:Parameter Name=”Kime” Type=”Object” />
<asp:Parameter Name=”Baslik” Type=”String” />
<asp:Parameter Name=”MesajIcerik”
Type=”String” />
<asp:Parameter Name=”Tarih” Type=”DateTime”
/>
27
28
Proje 1
<asp:Parameter Name=”original_MesajId”
Type=”Object” />
<asp:Parameter Name=”original_Kimden”
Type=”Object” />
<asp:Parameter Name=”original_Kime”
Type=”Object” />
<asp:Parameter Name=”original_Baslik”
Type=”String” />
<asp:Parameter Name=”original_MesajIcerik”
Type=”String” />
<asp:Parameter Name=”original_Tarih”
Type=”DateTime” />
<asp:Parameter Name=”original_OkunduMu” />
</UpdateParameters>
<SelectParameters>
<asp:SessionParameter Name=”Kime”
SessionField=”UserId” Type=”Object” />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name=”MesajId” Type=”Object”
/>
<asp:Parameter Name=”Kimden” Type=”Object” />
<asp:Parameter Name=”Kime” Type=”Object” />
<asp:Parameter Name=”Baslik” Type=”String” />
<asp:Parameter Name=”MesajIcerik”
Type=”String” />
<asp:Parameter Name=”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ğerinde 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 mesajın okunup okunmadığı bilgisini alıp gerekli değişikliği yapın.
herkesburada.com
protected void gelenMesajlar_RowDataBound(object sender,
GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow)
return;
bool neymis = 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 zaman 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.
protected void gelenMesajlar_RowDeleting(object sender,
GridViewDeleteEventArgs e)
{
Guid mesajId = new Guid(gelenMesajlar.DataKeys[e.
RowIndex].Value.ToString());
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“Update mesajlar set
AliciyaGosterme = ‘True’ Where MesajId = @MesajId”, con);
cmd.Parameters.AddWithValue(“@MesajId”, mesajId);
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
29
30
Proje 1
{
con.Close();
}
SqlDataSource1.DataBind();
}
protected void gidenMesajlar_RowDeleting(object sender,
GridViewDeleteEventArgs e)
{
Guid mesajId = new Guid(gidenMesajlar.DataKeys[e.
RowIndex].Value.ToString());
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“Update mesajlar set
GondericiyeGosterme = ‘True’ Where MesajId = @MesajId”, con);
cmd.Parameters.AddWithValue(“@MesajId”, mesajId);
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
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 veritabanından silinir. Bu yüzden veritabanı üzerine bu işlemi yapacak trigger’ı oluşturun. Liste 1.22’de
belirtilmiştir.
USE herkesburadadb
GO
CREATE TRIGGER MesajSilici
ON Mesajlar
For Update
herkesburada.com
AS
BEGIN
Declare @MesajId uniqueidentifier
Select @MesajId = MesajId From Inserted
Delete From Mesajlar Where GondericiyeGosterme = ‘True’
And AliciyaGosterme=’True’ And MesajId = @MesajId
END
Liste 1.22: MesajSilici trigger kodu.
Mesajlarim.aspx sayfası tasarımı Şekil 1.19’da belirtilmiştir.
Şekil 1.19: Mesajlarim.aspx sayfa tasarım görünümü.
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.
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”yenimesaj.
aspx.cs” Inherits=”Kullanici_yenimesaj” %>
<%@ Register Assembly=”AjaxControlToolkit” Namespace=”AjaxControl
Toolkit” TagPrefix=”cc1” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
<title>Yeni Mesaj Gönder</title>
31
32
Proje 1
<link href=”../Style/Genel.css” rel=”stylesheet” type=”text/
css” />
</head>
<body style=”margin-left:0;margin-top:0”>
<form id=”form1” runat=”server”>
<div style=”text-align:left”>
<table width=”300”>
<tr>
<td style=”width: 55px”>
</td>
<td colspan=”2”>
<asp:ScriptManager ID=”ScriptManager1”
runat=”server”>
</asp:ScriptManager>
<cc1:AutoCompleteExtender
EnableCaching=”false”
id=”AutoCompleteExtender1”
MinimumPrefixLength=”2” runat=”server”
servicemethod=”GetCompletionList”
targetcontrolid=”txtKime”
UseContextKey=”true”
></cc1: AutoCompleteExtender>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 55px”>
Kime :
</td>
<td style=”width: 69px”>
<asp:TextBox ID=”txtKime” runat=”server”></
asp:TextBox></td>
<td style=”width: 69px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 55px”>
Konu :
</td>
<td colspan=”3”>
herkesburada.com
<asp:TextBox ID=”txtBaslik” runat=”server”
Width=”100%”></asp:TextBox></td>
</tr>
<tr>
<td style=”width: 55px; height: 18px”
valign=”top”>
Mesaj :
</td>
<td colspan=”3” style=”height: 18px”>
<asp:TextBox ID=”txtMesaj” runat=”server”
Height=”107px” TextMode=”MultiLine” Width=”100%”></asp:TextBox></
td>
</tr>
<tr>
<td style=”width: 55px”>
</td>
<td style=”width: 69px”>
<asp:Button ID=”btnGonder” runat=”server” Text=”Gönder” OnClick=”btnGonder_Click” />
</td>
<td style=”width: 69px”>
<asp:Button ID=”btnIptal” runat=”server”
Text=”İptal” CausesValidation=”False” OnClientClick=”javascript:
window.close();” /></td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 55px; height: 18px”>
</td>
<td style=”width: 69px; height: 18px”>
&nbsp;</td>
<td style=”width: 69px; height: 18px”>
</td>
<td style=”width: 100px; height: 18px”>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Liste 1.23: Yenimesaj.aspx.
33
34
Proje 1
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.
CREATE proc [ArkadasListem]
(
@UserId uniqueidentifier
)
As
SELECT aspnet_Users.UserName , Kimin As KullaniciId
FROM ArkadasListesi INNER JOIN aspnet_Users
ON ArkadasListesi.Kimin = aspnet_Users.UserId WHERE ArkadasListesi.OnaylandiMi =
‘True’ And (ArkadasListesi.Kim = @UserId)
Union
SELECT aspnet_Users.UserName, Kim As KullaniciId
FROM ArkadasListesi INNER JOIN aspnet_Users
ON ArkadasListesi.Kim = aspnet_Users.UserId WHERE ArkadasListesi.
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ı yazar. Veritabanı ise bir mesajı kaydedebilmesi için kullanıcının ID bilgisine ihtiyaç duyacaktır. Veritabanı üzerinde kullanıcının adını parametre olarak alan ve ID’sini döndüren function’ı yazın.
(Liste 1.25)
CREATE function KullaniciIdAl
(
@UserName nvarchar(50)
)
returns uniqueidentifier
As
begin
Declare @userId uniqueidentifier
Select @UserId =UserId From aspnet_Users Where [UserName] = @
username
return @userId
end
Liste 1.25: KullanıcıIdAl function tanımlaması.
herkesburada.com
Yenimesaj.aspx sayfasına geri dönüp arkadaş listesini döndürecek metodu tanımlayın.
public static List<string> uyeler = new List<string>();
[System.Web.Services.WebMethodAttribute(), System.Web.Script.
Services.ScriptMethodAttribute()]
public static string[] GetCompletionList(string prefixText,
int count, string contextKey)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“ArkadasListem”,con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@UserId”, Membership.
GetUser(HttpContext.Current.User.Identity.Name).ProviderUserKey);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
uyeler.Clear();
foreach (DataRow dr in dt.Rows)
{
if (dr[“UserName”].ToString().StartsWith(prefixText))
uyeler.Add(dr[“UserName”].ToString());
}
return uyeler.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.
protected void btnGonder_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“Insert into mesajla
r(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 );
35
36
Proje 1
int i = 0;
try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
{
con.Close();
}
if (i == 1)
{
Response.Redirect(“~/kullanici/mesajgonderildi.
aspx”);
}
}
Liste 1.27: btnGonder button kontrolü Click olayı.
Şekil 1.20: YeniMesaj.aspx sayfa tasarım görünümü.
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 ekleyin ve master page seçtirmeyin.
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”mesajgond
erildi.aspx.cs” Inherits=”Kullanici_mesajgonderildi” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
herkesburada.com
<title>Mesaj Gönderildi</title>
<link href=”~/Style/Genel.css” rel=”stylesheet” type=”text/
css” />
</head>
<body>
<form id=”form1” runat=”server”>
<div>
<br />
<asp:Label ID=”Label1” runat=”server” Font-Size=”Medium”
ForeColor=”Red” Text=”Mesajınız Gönderildi...”></asp:Label><br />
<br />
<asp:LinkButton ID=”LinkButton1” runat=”server”
OnClick=”lnkYeniMesaj_Click”>Yeni Mesaj</asp:LinkButton>
<asp:HyperLink ID=”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.
protected void lnkYeniMesaj_Click(object sender, EventArgs e)
{
Response.Redirect(“~/kullanici/yenimesaj.aspx”);
}
Liste 1.29: lnkYeniMesaj button kontrol Click olayı.
Bu aşamadan sonra eklenen tüm sayfaları herkesburada.master sayfasından türetin ve default.aspx sayfasındaki şekilde sol ve sağ taraf olacak şekilde bölün.
Şekil 1.21: MesajGonderildi.
aspx tasarım görünümü.
Mesaj gönderme ve gelen/giden mesajları görüntüleme tamamlandıktan sonra mesajoku.aspx
sayfasını Kullanici klasörüne ekleyin.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”mesajoku.aspx.cs”
Inherits=”Kullanici_mesajoku” Title=”Untitled Page” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
37
38
Proje 1
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<asp:Label ID=”lblGonderen” runat=”server” ForeColor=”Blue”
Text=”Gönderen : “></asp:Label>
der ki;
<br />
<br />
<asp:Label ID=”lblBaslik” runat=”server” Font-Bold=”True”
Text=”Selamlar”></asp:Label><br />
<br />
<asp:Label ID=”lblMesaj” runat=”server” Text=”Label”></asp:
Label>&nbsp;<br />
<br />
<asp:Button ID=”btnSil” runat=”server” OnClick=”btnSil_Click”
Text=”Sil” />
<asp:Button ID=”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.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
MesajOku(); }
}
void MesajOku()
{
if (Request.QueryString[“mesaj”] != null)
{
try
{
Guid g = new Guid(Request.QueryString[“mesaj”]);
SqlConnection con = new SqlConnection(Configurati
onManager.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“Select m.*,
[UserName] From Mesajlar m Inner join aspnet_Users a on a.UserId
= m.Kimden Where MesajId = @MesajId And Kime=@Kime”, con);
herkesburada.com
cmd.Parameters.AddWithValue(“@MesajId”, g);
cmd.Parameters.AddWithValue(“@Kime”, Membership.
GetUser(User.Identity.Name).ProviderUserKey);
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
lblBaslik.Text = rdr[“Baslik”].ToString();
lblGonderen.Text = rdr[“UserName”].
ToString();
lblMesaj.Text = rdr[“MesajIcerik”].
ToString();
SqlCommand cmdGuncelle = new
SqlCommand(“Update mesajlar Set OkunduMu=’True’ Where MesajId=@
MesajId”,con);
cmdGuncelle.Parameters.AddWithValue(“@
MesajId”, new Guid(Request.QueryString[“mesaj”]));
cmdGuncelle.ExecuteNonQuery();
}
else
{
Response.Redirect(“~/kullanici/default.
aspx”);
}
}
catch (SqlException ex)
{
throw ex;
}
finally { con.Close(); }
}
catch (FormatException ex)
{
Response.Redirect(“mesajlarim.aspx”);
}
}
}
Liste 1.31: MesajOku.aspx Page_Load olayı ve MesajOku metodu.
39
40
Proje 1
Okunan mesajı cevaplamak ve silmek için btnSil ve btnCevapla button kontrol Click olaylarına
Liste 1.32‘deki kodu ekleyin.
protected void btnSil_Click(object sender, EventArgs e)
{
if (Request.QueryString[“mesaj”] != null)
{
try
{
Guid g = new Guid(Request.QueryString[“mesaj”]);
}
catch { return; }
}
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“Update mesajlar set
AliciyaGosterme = ‘True’ Where MesajId = @MesajId”, con);
cmd.Parameters.AddWithValue(“@MesajId”, new Guid(Request.
QueryString[“mesaj”]));
int i = 0;
try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
{
con.Close();
}
if (i > 0) Response.Redirect(“~/kullanici/mesajlarim.
aspx”);
}
protected void btnYanitla_Click(object sender, EventArgs e)
{
Session[“cevap”] = “Cvp :” + lblBaslik.Text + “|” +
lblGonderen.Text; ;
Response.Redirect(“~/kullanici/cevapla.aspx”);
}
Liste 1.32: btnSil ve btnYanitla button kontrolü Click olayı.
herkesburada.com
MesajOku.aspx tasarım görünümü Şekil 1.22‘de gösterilmiştir.
Şekil 1.22: MesajOku.aspx tasarım görünümü.
btnYanitla button kontrolüne tıklandığı zaman yönlendirilecek olan cevapla.aspx sayfasını Kullanici klasörüne ekleyin. Sayfayı eklerken masterpage seçtirmeyi unutmayın.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”cevapla.aspx.cs”
Inherits=”Kullanici_cevapla” Title=”Untitled Page” %>
<%@ Register Assembly=”AjaxControlToolkit” Namespace=”AjaxControl
Toolkit” TagPrefix=”cc1” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<div style=”text-align:left”>
<table style=”width: 423px”>
<tr>
<td style=”width: 55px”>
</td>
<td style=”width: 69px”>
</td>
41
42
Proje 1
<td style=”width: 69px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 55px”>
Kime :
</td>
<td style=”width: 69px”>
<asp:TextBox ID=”txtKime” runat=”server”></
asp:TextBox></td>
<td style=”width: 69px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 55px”>
Konu :
</td>
<td colspan=”3”>
<asp:TextBox ID=”txtBaslik” runat=”server”
Width=”100%”></asp:TextBox></td>
</tr>
<tr>
<td style=”width: 55px; height: 18px”
valign=”top”>
Mesaj :
</td>
<td colspan=”3” style=”height: 18px”>
<asp:TextBox ID=”txtMesaj” runat=”server”
Height=”107px” TextMode=”MultiLine” Width=”100%”></asp:TextBox></
td>
</tr>
<tr>
<td style=”width: 55px”>
</td>
<td style=”width: 69px”>
<asp:Button ID=”btnGonder” runat=”server” Text=”Gönder” OnClick=”btnGonder_Click” />
</td>
<td style=”width: 69px”>
<asp:Button ID=”btnIptal” runat=”server”
Text=”İptal” OnClick=”btnIptal_Click” /></td>
herkesburada.com
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 55px; height: 18px”>
</td>
<td style=”height: 18px” colspan=”3”>
&nbsp;<cc1:AutoCompleteExtender ID=”AutoCompl
eteExtender1” runat=”server” ServiceMethod=”GetCompletionList”
UseContextKey=”True” TargetControlID=”txt
Kime”>
</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ı otomatik 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.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Session[“cevap”] != null)
{
txtBaslik.Text = Session[“cevap”].ToString().
Split(‘|’)[0];
txtKime.Text = Session[“cevap”].ToString().
Split(‘|’)[1];
}
}
}
protected void btnGonder_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
43
44
Proje 1
SqlCommand cmd = new SqlCommand(“Insert into mesajla
r(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);
int i = 0;
try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
{
con.Close();
}
if (i == 1)
{
Response.Redirect(“~/kullanici/mesajlarim.aspx”);
}
}
protected void btnIptal_Click(object sender, EventArgs e)
{
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.
herkesburada.com
Şekil 1.23: Cevapla.aspx sayfa tasarım görünümü.
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 klasö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.24: Bilgiler.aspx sayfa tasarım görünümü.
45
46
Proje 1
Bilgiler.aspx sayfası üzerindeki Şehir, Eğitm Durumu, Meslek ve Tuttuğu Takım bilgisi veritabanından alınıyor. Diğer bilgiler ise profile’dan alınıyor.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”bilgiler.aspx.cs”
Inherits=”Kullanici_bilgiler” Title=”Untitled Page” %>
<%@ Register Assembly=”System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35”
Namespace=”System.Web.UI” TagPrefix=”asp” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<table style=”width: 100%”>
<tr>
<td style=”width: 280px”>
</td>
<td style=”width: 530px”>
</td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px; height: 26px;”>
Ad :</td>
<td style=”width: 530px; height: 26px;”>
<asp:TextBox ID=”txtAd” runat=”server”
Width=”100%”></asp:TextBox></td>
<td style=”width: 494px; height: 26px;”>
</td>
</tr>
<tr>
<td style=”width: 280px; height: 26px;”>
Soyad :</td>
<td style=”width: 530px; height: 26px;”>
<asp:TextBox ID=”txtSoyad” runat=”server”
Width=”100%”></asp:TextBox></td>
<td style=”width: 494px; height: 26px;”>
</td>
herkesburada.com
</tr>
<tr>
<td style=”width: 280px”>
Doğum Tarihi :</td>
<td style=”width: 530px”>
<asp:TextBox ID=”txtDogumTarihi” runat=”server”
Width=”100%”></asp:TextBox></td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px; height: 24px;”>
Cinsiyet</td>
<td style=”width: 530px; height: 24px”>
<asp:DropDownList ID=”drpCinsiyet” runat=”server”>
<asp:ListItem Value=”True”>Bay</asp:ListItem>
<asp:ListItem Value=”False”>Bayan</asp:
ListItem>
</asp:DropDownList></td>
<td style=”width: 494px; height: 24px;”>
</td>
</tr>
<tr>
<td style=”width: 280px; height: 1px;”>
Yaşadınız Şehir :
</td>
<td style=”width: 530px; height: 1px;”>
<asp:DropDownList ID=”drpYasadiginizSehir”
runat=”server” DataSourceID=”SqlDataSource1”
DataTextField=”SehirAdi” DataValueField=”SehirId”>
</asp:DropDownList></td>
<td style=”width: 494px; height: 1px;”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
Eğitim Durumu :
</td>
<td style=”width: 530px”>
<asp:DropDownList ID=”drpEgitimDurumu”
runat=”server” DataSourceID=”SqlDataSource2” DataTextField=”Egiti
mDurumAdi” DataValueField=”EgitimDurumId”>
</asp:DropDownList></td>
<td style=”width: 494px”>
</td>
47
48
Proje 1
</tr>
<tr>
<td style=”width: 280px; height: 24px”>
Meslek :
</td>
<td style=”width: 530px; height: 24px”>
<asp:DropDownList ID=”drpMeslek” runat=”server”
DataSourceID=”SqlDataSource3” DataTextField=”MeslekAdi” DataValue
Field=”MeslekId”>
</asp:DropDownList></td>
<td style=”width: 494px; height: 24px”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
Fobileriniz :
</td>
<td style=”width: 530px”>
<asp:TextBox ID=”txtFobi” runat=”server”
TextMode=”MultiLine” Width=”100%”></asp:TextBox></td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
Hobileriniz :
</td>
<td style=”width: 530px”>
<asp:TextBox ID=”txtHobi” runat=”server”
TextMode=”MultiLine” Width=”100%”></asp:TextBox></td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px; height: 40px;”>
Kendinizi Anlatın :
</td>
<td style=”width: 530px; height: 40px;”>
<asp:TextBox ID=”txtHakkinda” runat=”server”
TextMode=”MultiLine” Width=”100%”></asp:TextBox></td>
<td style=”width: 494px; height: 40px;”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
herkesburada.com
Okuduğunuz Kitaplar :</td>
<td style=”width: 530px”>
<asp:TextBox ID=”txtOkuduguKitaplar”
runat=”server” TextMode=”MultiLine” Width=”100%”></asp:TextBox></
td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
Tuttuğunuz Takım :
</td>
<td style=”width: 530px”>
<asp:DropDownList ID=”drpTakim” runat=”server”
DataSourceID=”SqlDataSource4” DataTextField=”TakimAdi” DataValueF
ield=”TakimId”>
</asp:DropDownList></td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px; height: 40px;”>
Yaptığınız Sporlar</td>
<td style=”width: 530px; height: 40px;”>
<asp:TextBox ID=”txtYaptigiSporlar” runat=”server”
TextMode=”MultiLine” Width=”100%”></asp:TextBox></td>
<td style=”width: 494px; height: 40px;”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
Sigara kullanırmısınız ? :</td>
<td style=”width: 530px”>
<asp:DropDownList ID=”drpSigara” runat=”server”>
<asp:ListItem Value=”True”>Evet</asp:ListItem>
<asp:ListItem Value=”False”>Hayır</asp:
ListItem>
</asp:DropDownList></td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
Alkol kullanırmısınız ?&nbsp; :</td>
<td style=”width: 530px”>
49
50
Proje 1
<asp:DropDownList ID=”drpAlkol” runat=”server”>
<asp:ListItem Value=”True”>Evet</asp:ListItem>
<asp:ListItem Value=”False”>Hayır</asp:
ListItem>
</asp:DropDownList></td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
Profilimi Arkadaşlarım Görsün</td>
<td style=”width: 530px”><asp:DropDownList
ID=”drpYetki” runat=”server”>
<asp:ListItem Value=”True”>Evet</asp:ListItem>
<asp:ListItem Value=”False”>Hayır</asp:ListItem>
</asp:DropDownList></td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px” valign=”top”>
</td>
<td style=”width: 530px”>
&nbsp;</td>
<td style=”width: 494px” valign=”top”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
</td>
<td style=”width: 530px”>
<asp:Button ID=”btGuncelle” runat=”server”
OnClick=”btGuncelle_Click” Text=”Güncelle” /></td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 280px”>
</td>
<td style=”width: 530px”>
</td>
<td style=”width: 494px”>
</td>
</tr>
</table>
herkesburada.com
<asp:SqlDataSource ID=”SqlDataSource1” runat=”server”
ConnectionString=”<%$ ConnectionStrings:ConStrHerkesBurada %>”
SelectCommand=”SELECT [SehirId], [SehirAdi] FROM
[Sehirler]”></asp:SqlDataSource>
<asp:SqlDataSource ID=”SqlDataSource2” runat=”server”
ConnectionString=”<%$ ConnectionStrings:ConStrHerkesBurada %>”
SelectCommand=”SELECT [EgitimDurumId], [EgitimDurumAdi]
FROM [EgitimDurumlari]”>
</asp:SqlDataSource>
<asp:SqlDataSource ID=”SqlDataSource3” runat=”server”
ConnectionString=”<%$ ConnectionStrings:ConStrHerkesBurada %>”
SelectCommand=”SELECT [MeslekId], [MeslekAdi] FROM
[Meslekler]”></asp:SqlDataSource>
<asp:SqlDataSource ID=”SqlDataSource4” runat=”server”
ConnectionString=”<%$ ConnectionStrings:ConStrHerkesBurada %>”
SelectCommand=”SELECT [TakimId], [TakimAdi] FROM
[Takimlar] ORDER BY [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.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BilgileriGoster();
}
}
void BilgileriGoster()
{
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;
}
51
52
Proje 1
// 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();
}
protected void btGuncelle_Click(object sender, EventArgs e)
{
Profile.KisiselBilgiler.Ad = txtAd.Text;
Profile.AlkolKullanirMi = Convert.ToBoolean(drpAlkol.
SelectedValue);
Profile.SigaraKullanirMi = Convert.ToBoolean(drpSigara.
SelectedValue);
Profile.Fobileri = txtFobi.Text;
herkesburada.com
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 kullanı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. KullaniciSolMenu.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 kontrolünü ekleyin.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”profilresmi.aspx.cs”
Inherits=”Kullanici_profilresmi” Title=”Untitled Page” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<br />
<table style=”width: 100%”>
<tr>
<td rowspan=”5” style=”width: 100px”>
<center><asp:Image ID=”imgUser” runat=”server”
AlternateText=”Profil resminiz” /></center></td>
<td style=”width: 100px”>
53
54
Proje 1
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td colspan=”3”>
Yeni Resim Seç</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td colspan=”2”>
<asp:FileUpload ID=”FileUpload1” runat=”server”
Width=”345px” /></td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
<asp:Button ID=”btnGuncelle” runat=”server”
OnClick=”btnGuncelle_Click” Text=”Güncelle” /></td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
herkesburada.com
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”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.
55
56
Proje 1
Şekil 1.25: ProfilResmi.aspx sayfa tasarım görünümü.
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 kaydetmek, 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 format sorun çıkarmayacaktır. Bunun haricinde karşılaşılacak olduğunuz sorun ise resimlerin isimleridir. 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.
protected void btnGuncelle_Click(object sender, EventArgs e)
{
string resimAdi = Guid.NewGuid().ToString();
try
{
FileUpload1.SaveAs(Server.MapPath(“~/UyeResimleri/”)
+ resimAdi + “.uyeResim”);
Profile.ProfilResmi = resimAdi + “.uyeResim”;
Response.Redirect(“profilresmi.aspx”);
}
catch (HttpException ex)
{
throw ex;
} }
Liste 1.38: btnGuncelle button Click olayı.
herkesburada.com
Form ilk yüklendiğinde mevcut resmi gösterebilmek için ProfilResmi.aspx sayfasının Load olayında mevcut resmi gösterin.
protected void Page_Load(object sender, EventArgs e)
{
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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”arkadaslarim.aspx.cs”
Inherits=”Kullanici_arkadaslarim” Title=”Arkadaşlarım” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<br />
&nbsp;<asp:LinkButton ID=”LinkButton2” runat=”server”
ForeColor=”Blue” OnClick=”LinkButton2_Click”>Gelen Teklifler</
asp:LinkButton>
<asp:LinkButton ID=”lnkTeklifSayisi” runat=”server”
ForeColor=”Red” OnClick=”lnkTeklifSayisi_Click”></asp:
LinkButton><br />
<br />
<asp:UpdatePanel ID=”UpdatePanel1” runat=”server”>
<ContentTemplate>
<asp:DataList id=”dtArkadaslar” runat=”server” ForeColor=”#333333”
OnItemCommand=”dtArkadaslar_ItemCommand” Width=”632px” DataSource
ID=”SqlDataSource1” CellPadding=”4”>
<FooterStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White”></FooterStyle>
57
58
Proje 1
<AlternatingItemStyle BackColor=”White” ForeColor=”#284775”></
AlternatingItemStyle>
<ItemStyle BackColor=”#F7F6F3” ForeColor=”#333333”></ItemStyle>
<SelectedItemStyle BackColor=”#E2DED6” Font-Bold=”True”
ForeColor=”#333333”></SelectedItemStyle>
<HeaderStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White”></HeaderStyle>
<ItemTemplate>
<table style=”width: 100%”>
<tr>
<td rowspan=”2” style=”width: 100px”>
<img src=’<%# ResimAdres(DataBinder.
Eval(Container.DataItem, “UserName”).ToString()) %>’ alt=’<%#
Eval(“UserName”).ToString() %> resmi’ />
</td>
<td style=”width: 100px”>
</td>
<td rowspan=”3” style=”width: 100px”
valign=”top”>
<asp:LinkButton ID=”LinkButton3”
runat=”server” ForeColor=”Blue” CommandName=”MesajGonder”
CommandArgument=’<%# Eval(“UserName”) %>’>Mesaj Gönder</asp:
LinkButton><br />
<asp:LinkButton ID=”LinkButton4”
runat=”server” ForeColor=”Blue” CommandName=”Sil”
CommandArgument=’<%# Eval(“KullaniciId”) %>’ OnClientClick=”return
confirm(‘Arkadaşını silmekten emin misiniz ?’)”>Sil</asp:
LinkButton><br />
<asp:LinkButton ID=”LinkButton1”
runat=”server”
CommandName=”AlbumGoruntule”
ForeColor=”Blue” CommandArgument=’<%# DataBinder.Eval(Container.
DataItem, “UserName”)%>’>Album Görüntüle</asp:LinkButton><br />
<asp:LinkButton ID=”LinkButton5”
runat=”server” CommandArgument=’<%# DataBinder.Eval(Container.
DataItem, “UserName”) %>’
CommandName=”ProfilGoruntule”
ForeColor=”Blue”>Profil Görüntüle</asp:LinkButton></td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
herkesburada.com
</tr>
<tr>
<td style=”width: 100px”>
&nbsp;<asp:Label ID=”UserNameLabel”
runat=”server” Text=’<%# Eval(“UserName”) %>’></asp:Label></td>
<td style=”width: 100px”>
</td>
</tr>
</table>
<br />
<br />
</ItemTemplate>
</asp:DataList><asp:SqlDataSource id=”SqlDataSource1”
runat=”server” SelectCommandType=”StoredProcedure” SelectComm
and=”ArkadasListem” ConnectionString=”<%$ ConnectionStrings:
ConStrHerkesBurada %>”>
<SelectParameters>
<asp:SessionParameter Name=”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ı.
59
60
Proje 1
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ı yazdırın.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
TeklifSayisi();
}
}
void TeklifSayisi()
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“Select Count(Kim) From
ArkadasListesi where kim=@UserId and OnaylandiMi = ‘False’”,
con);
cmd.Parameters.AddWithValue(“@UserId”, Membership.
GetUser(User.Identity.Name).ProviderUserKey);
try
{
con.Open();
int i = 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.
herkesburada.com
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.
protected void lnkTeklifSayisi_Click(object sender, EventArgs
e)
{
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, satıra ait bir işlem yapılacak ise RowCommand kullanılması gerekir. Tanımlanan datalist kontrolünde birden fazla işlem yapılacak ve yapılacak işlemler CommandName içerisinde tanımlanacak.
Örneğin:
<asp:LinkButton ID=”LinkButton1” runat=”server”
CommandName=”AlbumGoruntule”
ForeColor=”Blue” CommandArgument=’<%# DataBinder.Eval(Container.
DataItem, “UserName”)%>’>Album Gö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 yapacak olan datalist’in RowCommand olayını hazırlayın.
protected void dtArkadaslar_ItemCommand(object source,
DataListCommandEventArgs e)
{
if (e.CommandName == “MesajGonder”)
{
Session[“cevap”] = “” + “|” + e.CommandArgument.
ToString();
Response.Redirect(“~/kullanici/cevapla.aspx”);
}
else if (e.CommandName == “AlbumGoruntule”)
{
Response.Redirect(“~/kullanici/albumler.aspx?album=”
+ e.CommandArgument.ToString());
}
else if (e.CommandName == “ProfilGoruntule”)
{
Response.Redirect(“profildetay.aspx?profil=” +
e.CommandArgument.ToString());
}
else
{
61
62
Proje 1
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“delete from
ArkadasListesi Where Kim=@Kim And Kimin=@Kimin”, con);
cmd.Parameters.AddWithValue(“@Kim”, new Guid(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.
protected string ResimAdres(string username)
{
string resimAdres = Profile.GetProfile(username).
ProfilResmi;
return @”../UyeResimleri/” + resimAdres;
}
Liste 1.45: Kullanıcının resim adını döndürmeyi sağlayan metod.
herkesburada.com
Bu metod ise DataList içerisinde Liste 1.46’daki şekilde kullanıldı.
<img src=’<%# 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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”tekliflerim.aspx.cs”
Inherits=”Kullanici_tekliflerim” Title=”Tekliflerim” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<br />
Teklif listeniz.<br />
<br />
<asp:UpdatePanel ID=”UpdatePanel1” runat=”server”>
<ContentTemplate>
<asp:GridView ID=”grdTeklifler” runat=”server”
AllowPaging=”True” AllowSorting=”True”
AutoGenerateColumns=”False” CellPadding=”4” DataSourceID=
”SqlDataSource1” ForeColor=”#333333”
GridLines=”None” Width=”606px” DataKeyNames=”Kim” OnR
owCommand=”grdTeklifler_RowCommand” EmptyDataText=”Listenizde
cevapsız teklifiniz bulunmuyor...”>
<FooterStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
<Columns>
<asp:HyperLinkField DataNavigateUrlFields=”UserName”
DataNavigateUrlFormatString=”~/kullanici/profildetay.aspx?type=r&
amp;value={0}”
DataTextField=”UserName” HeaderText=”Teklifte
Bulunan” />
<asp:TemplateField ShowHeader=”False”>
<ItemTemplate>
63
64
Proje 1
<asp:LinkButton ID=”LinkButton2”
runat=”server” CausesValidation=”False” CommandName=”Onayla”
Text=”Onayla” CommandArgument=’<%#
Eval(“Kimin”) %>’></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader=”False”>
<ItemTemplate>
<asp:LinkButton ID=”LinkButton1”
runat=”server” OnClientClick=”return
confirm(‘Bu teklifi reddetmek istediğinizden emin misiniz?’)”
CausesValidation=”False” CommandName=”Sil”
CommandArgument=’<%# Eval(“Kimin”) %>’
Text=”Sil”></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<RowStyle BackColor=”#F7F6F3” ForeColor=”#333333” />
<EditRowStyle BackColor=”#999999” />
<SelectedRowStyle BackColor=”#E2DED6” Font-Bold=”True”
ForeColor=”#333333” />
<PagerStyle BackColor=”#284775” ForeColor=”White”
HorizontalAlign=”Center” />
<HeaderStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
<AlternatingRowStyle BackColor=”White” ForeColor=”#284775”
/>
</asp:GridView>
<asp:SqlDataSource ID=”SqlDataSource1” runat=”server”
ConnectionString=”<%$ ConnectionStrings:ConStrHerkesBurada %>”
SelectCommand=”SELECT aspnet_Users.UserName,
ArkadasListesi.Kim, ArkadasListesi.Kimin FROM ArkadasListesi
INNER JOIN aspnet_Users &#13;&#10;ON ArkadasListesi.Kimin
= aspnet_Users.UserId WHERE ArkadasListesi.OnaylandiMi =
&#13;&#10;’False’ And (ArkadasListesi.Kim = @UserId)”>
<SelectParameters>
<asp:SessionParameter Name=”UserId”
SessionField=”UserId” />
</SelectParameters>
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</asp:Content>
Liste 1.47: Tekliflerim.aspx html tasarımı.
herkesburada.com
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 onaylamak için veya silmek için DataList kontrolünün RowCommand olayını kullanın.
protected void grdTeklifler_RowCommand(object sender,
GridViewCommandEventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand();
if (e.CommandName == “Onayla”)
{
cmd.CommandText = “Update ArkadasListesi Set
OnaylandiMi=’True’ Where Kim=@UserId And Kimin = @Isteyen And
OnaylandiMi=’False’”; }
else
{
cmd.CommandText = “Delete from ArkadasListesi Where
Kim=@UserId And Kimin = @Isteyen And OnaylandiMi=’False’”;
}
cmd.Parameters.AddWithValue(“@UserId”, new
Guid(Session[“UserId”].ToString()));
cmd.Parameters.AddWithValue(“@Isteyen”, e.CommandArgument.
ToString());
cmd.Connection = con;
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
{
con.Close();
65
66
Proje 1
}
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.
Şekil 1.27: Tekliflerim.aspx tasarım görünümü.
Arkadaş listesindeki bir kullanıcının profilini görüntülemek için veya arama sonrasında çıkan kullanı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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”profildetay.aspx.cs”
Inherits=”Kullanici_profildetay” Title=”Untitled Page” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<table style=”width: 100%”>
<tr>
<td style=”width: 118px”>
herkesburada.com
</td>
<td style=”width: 365px”>
</td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td rowspan=”8” style=”width: 118px” valign=”top”>
<asp:Image ID=”imgProfilResmi” runat=”server”
Height=”175px” Width=”145px” /></td>
<td style=”width: 365px; height: 12px;” valign=”top”>
Ad :</td>
<td style=”width: 530px; height: 12px;”>
<asp:Label ID=”lblAd” runat=”server”></asp:
Label></td>
</tr>
<tr>
<td style=”width: 365px; height: 8px;” valign=”top”>
Soyad :</td>
<td style=”width: 530px; height: 8px;”>
<asp:Label ID=”lblSoyad” runat=”server”></asp:
Label></td>
</tr>
<tr>
<td style=”width: 365px” valign=”top”>
Doğum Tarihi :</td>
<td style=”width: 530px”>
<asp:Label ID=”lblDogumTarihi” runat=”server”></
asp:Label></td>
</tr>
<tr>
<td style=”width: 365px; height: 6px;” valign=”top”>
Cinsiyet :</td>
<td style=”width: 530px; height: 6px”>
<asp:Label ID=”lblCinsiyet” runat=”server”></asp:
Label></td>
</tr>
<tr>
<td style=”width: 365px; height: 1px;” valign=”top”>
Yaşadığı Şehir :
</td>
<td style=”width: 530px; height: 1px;”>
<asp:Label ID=”lblYasadigiSehir” runat=”server”></
asp:Label></td>
</tr>
67
68
Proje 1
<tr>
<td style=”width: 365px” valign=”top”>
Eğitim Durumu :
</td>
<td style=”width: 530px”>
<asp:Label ID=”lblEgitimDurumu” runat=”server”></
asp:Label></td>
</tr>
<tr>
<td style=”width: 365px;” valign=”top”>
Meslek :
</td>
<td style=”width: 530px;”>
<asp:Label ID=”lblMeslek” runat=”server”></asp:
Label></td>
</tr>
<tr>
<td style=”width: 365px” valign=”top”>
Fobileri :
</td>
<td style=”width: 530px”>
<asp:Label ID=”lblFobileri” runat=”server”></asp:
Label></td>
</tr>
<tr>
<td style=”width: 118px”>
</td>
<td style=”width: 365px” valign=”top”>
Hobileri :
</td>
<td style=”width: 530px”>
<asp:Label ID=”lblHobileri” runat=”server”></asp:
Label></td>
</tr>
<tr>
<td style=”width: 118px;”>
</td>
<td style=”width: 365px;” valign=”top”>
Hakkında :
</td>
<td style=”width: 530px;”>
<asp:Label ID=”lblHakkinda” runat=”server”></asp:
Label></td>
</tr>
<tr>
herkesburada.com
<td style=”width: 118px”>
</td>
<td style=”width: 365px” valign=”top”>
Okuduğunu Kitaplar :</td>
<td style=”width: 530px”>
<asp:Label ID=”lblOkuduguKitaplar”
runat=”server”></asp:Label></td>
</tr>
<tr>
<td style=”width: 118px”>
</td>
<td style=”width: 365px” valign=”top”>
Tuttuğu Takım :
</td>
<td style=”width: 530px”>
<asp:Label ID=”lblTuttuguTakim” runat=”server”></
asp:Label></td>
</tr>
<tr>
<td style=”width: 118px;”>
</td>
<td style=”width: 365px;” valign=”top”>
Yaptığı Sporlar</td>
<td style=”width: 530px;”>
<asp:Label ID=”lblYaptigiSporlar”
runat=”server”></asp:Label></td>
</tr>
<tr>
<td style=”width: 118px”>
</td>
<td style=”width: 365px” valign=”top”>
Sigara kullanırmı ? :</td>
<td style=”width: 530px”>
<asp:Label ID=”lblSigara” runat=”server”></asp:
Label></td>
</tr>
<tr>
<td style=”width: 118px”>
</td>
<td style=”width: 365px” valign=”top”>
Alkol kullanırmı ?&nbsp; :</td>
<td style=”width: 530px”>
<asp:Label ID=”lblAlkol” runat=”server”></asp:
Label></td>
</tr>
69
70
Proje 1
<tr>
<td style=”width: 118px”>
</td>
<td style=”width: 365px”>
</td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 118px”>
</td>
<td style=”width: 365px”>
</td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 118px”>
</td>
<td style=”width: 365px”>
</td>
<td style=”width: 494px”>
</td>
</tr>
<tr>
<td style=”width: 118px”>
</td>
<td style=”width: 365px”>
</td>
<td style=”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.
Create Proc KullaniciDetay
(
@EgitimDurumId int,
herkesburada.com
@MeslekId int,
@TakimId int,
@SehirId int
)
AS
DECLARE @Egitim nvarchar(50)
DECLARE @Meslek nvarchar(50)
DECLARE @Takim nvarchar(50)
DECLARE @Sehir nvarchar(50)
Select @Egitim = EgitimDurumAdi From EgitimDurumlari Where
EgitimDurumId = @EgitimDurumId
Select @Meslek = MeslekAdi From Meslekler Where MeslekId = @
MeslekId
Select @Takim = TakimAdi From Takimlar Where TakimId = @TakimId
Select @Sehir = SehirAdi From Sehirler Where SehirId = @SehirId
Select @Egitim As Egitim, @Meslek As Meslek , @Takim as Takim, @
Sehir As Sehir
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örmeye 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.
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString[“profil”] != null)
{
string kullanici = Request.QueryString[“profil”];
if (ProfilYetki(kullanici))
{
ProfilGoruntule(kullanici);
}
else
Response.Redirect(“arkadaslarim.aspx”);
}
else
{
71
72
Proje 1
Response.Redirect(“arkadaslarim.aspx”);
}
}
bool ProfilYetki(string kullanici)
{
if (Profile.GetProfile(kullanici).ProfilYetki)
{
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(“ArkadasListem
”, con);
da.SelectCommand.Parameters.AddWithValue(“@
UserId”,Membership.GetUser(kullanici).ProviderUserKey);
da.SelectCommand.CommandType = CommandType.
StoredProcedure;
DataTable dt = new DataTable();
da.Fill(dt);
bool sonuc = false;
foreach (DataRow dr in dt.Rows)
{
if (dr[“Username”].ToString() == kullanici)
{
sonuc = true;
}
}
return sonuc;
}
else
return true;
}
void ProfilGoruntule(string kullanici)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“ConStrHerkesBurada”].ConnectionString);
SqlCommand cmd = new SqlCommand(“KullaniciDetay”,con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@EgitimDurumId”,Profile.
EgitimDurumId);
cmd.Parameters.AddWithValue(“@MeslekId”,Profile.MeslekId);
herkesburada.com
cmd.Parameters.AddWithValue(“@TakimId”,Profile.
TuttuguTakimId);
cmd.Parameters.AddWithValue(“@SehirId”,Profile.
KisiselBilgiler.YasadigiSehirId);
try
{
con.Open();
SqlDataReader rdr = 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();
}
string url = @”../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);
73
74
Proje 1
lblYaptigiSporlar.Text = Profile.GetProfile(kullanici).
YaptigiSporlar;
}
string CinsiyetGosterici(bool cinsiyet)
{
if (!cinsiyet)
return “Bay”;
else
return “Bayan”;
}
string DurumGosterici(bool durum)
{
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.
Şekil 1.28: ProfilDetay.aspx sayfası tasarım görünümü.
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ş-
herkesburada.com
turma link’i ekleyin ve bu link’te yeni mesaj göndermedeki gibi popup penceresinde yeni album
sayfası açın.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.master”
AutoEventWireup=”true”
CodeFile=”albumlerim.aspx.cs” Inherits=”Kullanici_albumlerim”
Title=”Albümlerim” %>
<%@ Register Assembly=”System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35”
Namespace=”System.Web.UI” TagPrefix=”asp” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1”
runat=”server” />
</div>
<div class=”KullaniciIcerik”>
<script language=”javascript” type=”text/javascript”>
function YeniMesajGoster()
{
window.open(‘yenialbum.aspx’,’yenimesaj’,’width=350,h
eight=80’);
}
</script>
<asp:LinkButton ID=”lnkYeniAlbum” runat=”server” OnClient
Click=”YeniMesajGoster(); return false;”>Yeni Album Oluştur</asp:
LinkButton><br />
&nbsp;<asp:UpdatePanel id=”UpdatePanel1” runat=”server”><
contenttemplate>
<asp:GridView ID=”grdAlbumler” runat=”server” AutoG
enerateColumns=”False” CellPadding=”4”
DataKeyNames=”AlbumId” EmptyDataText=”Tanımlanmış
albümünüz bulunmuyor”
ForeColor=”#333333” GridLines=”None” Width=”100%”
OnRowDeleting=”grdAlbumler_RowDeleting” OnRowEditing=
”grdAlbumler_RowEditing”
OnRowUpdating=”grdAlbumler_RowUpdating” OnRowCancelin
gEdit=”grdAlbumler_RowCancelingEdit”>
75
76
Proje 1
<FooterStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
<RowStyle BackColor=”#F7F6F3” ForeColor=”#333333” />
<Columns>
<asp:TemplateField>
<EditItemTemplate>
<asp:TextBox ID=”txtAlbumAdi”
runat=”server” Text=’<%# DataBinder.Eval(Container.
DataItem,”AlbumAdi”) %> ‘></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<a href=’album.aspx?album=<%# DataBinder.
Eval(Container.DataItem,”AlbumId”) %>’>
<asp:Label ID=”lblAlbumAdi”
runat=”server” Text=’<%# Eval(“AlbumAdi”) %> ‘></asp:Label></a>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField=”OlusturulmaTarihi”
DataFormatString=”{0:d}” HeaderText=”Oluşturulma Tarihi”
HtmlEncode=”False” ReadOnly=”True” SortExpres
sion=”OlusturulmaTarihi” />
<asp:HyperLinkField DataNavigateUrlFields=”albumI
d” DataNavigateUrlFormatString=”resimekle.aspx?albumId={0}”
Text=”Resim Ekle” />
<asp:TemplateField ShowHeader=”False”>
<EditItemTemplate>
<asp:LinkButton ID=”lnkGuncelle”
runat=”server” CausesValidation=”True” CommandName=”Update”
Text=”Güncelle”>
</asp:LinkButton>
<asp:LinkButton ID=”lnkIptal”
runat=”server” CausesValidation=”False” CommandName=”Cancel”
Text=”İptal”></asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
<asp:LinkButton ID=”LinkButton3”
runat=”server” CausesValidation=”False” CommandName=”Edit”
Text=”Düzenle”></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader=”False”>
<ItemTemplate>
<asp:LinkButton ID=”LinkButton1”
runat=”server”
CausesValidation=”False”
CommandName=”Delete” OnClientClick=”return confirm(‘Bu albümü
herkesburada.com
silmek istediğinizden eminmisiniz\rAlbümü silerseniz albümdeki
resimler de silinecek’)”
Text=”Sil”></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle BackColor=”#284775” ForeColor=”White”
HorizontalAlign=”Center” />
<SelectedRowStyle BackColor=”#E2DED6” Font-Bold=”True”
ForeColor=”#333333” />
<HeaderStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
<EditRowStyle BackColor=”#999999” />
<AlternatingRowStyle BackColor=”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.
Şekil 1.29: albumlerim.aspx sayfası tasarım görünümü.
Sayfa ilk yüklendiğinde gerekli datagrid kontrolüne verileri doldurmak için gerekli kodları Liste
1.53’deki şekilde yazın.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
77
78
Proje 1
VerileriDoldur();
}
void VerileriDoldur()
{
SqlConnection con = new SqlConnection(ConfigurationManag
er.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(“SELECT
[AlbumId], [AlbumAdi], [KullaniciId], [OlusturulmaTarihi],
[SadeceArkadaslarGorsun] FROM [Albumler] WHERE ([KullaniciId] = @
KullaniciId)”, con);
da.SelectCommand.Parameters.AddWithValue(“@KullaniciId”,
Membership.GetUser(User.Identity.Name).ProviderUserKey);
DataTable dt = new DataTable();
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 şekilde yazın.
protected void grdAlbumler_RowEditing(object sender,
GridViewEditEventArgs e)
{
grdAlbumler.EditIndex = e.NewEditIndex;
VerileriDoldur(); }
protected void grdAlbumler_RowCancelingEdit(object sender,
GridViewCancelEditEventArgs e)
{
grdAlbumler.EditIndex = -1;
VerileriDoldur();
}
protected void grdAlbumler_RowUpdating(object sender,
GridViewUpdateEventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“update Albumler set
AlbumAdi = @AlbumAdi where albumId=@AlbumId”, con);
cmd.Parameters.AddWithValue(“@AlbumAdi”,
((TextBox)grdAlbumler.Rows[e.RowIndex].FindControl(“txtAlbumAdi”)
).Text);
herkesburada.com
cmd.Parameters.AddWithValue(“@AlbumId”, new
Guid(grdAlbumler.DataKeys[e.RowIndex].Value.ToString()));
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception)
{
throw;
}
finally
{
con.Close();
}
grdAlbumler.EditIndex = -1;
VerileriDoldur();
}
protected void grdAlbumler_RowDeleting(object sender,
GridViewDeleteEventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“delete from Albumler
where albumId=@albumId”, con);
cmd.Parameters.AddWithValue(“@albumId”, new
Guid(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ı.
79
80
Proje 1
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 ekleyin ve value özelliklerini true, false verin. Boş bırakılmaması gereken yerler için gerekli validation
kontrolleri kullanın.
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”yenialbum.
aspx.cs” Inherits=”Kullanici_yenialbum” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
<title>Yeni Albüm Oluştur</title>
<link href=”../Style/Genel.css” rel=”stylesheet” type=”text/
css” />
<script language=”javascript” type=”text/javascript”>
function Kapat()
{
window.opener.location.reload(true);
}
</script>
</head>
<body style=”text-align:left” onunload=”Kapat();”>
<form id=”form1” runat=”server”>
<div>
<br />
&nbsp;&nbsp;
<asp:Label ID=”Label1” runat=”server” Text=”Album Adı :
“></asp:Label>
<asp:TextBox ID=”txtAlbum” runat=”server”></asp:
TextBox>&nbsp;
<asp:RequiredFieldValidator ID=”RequiredFieldValidator1”
runat=”server” ControlToValidate=”txtAlbum”
ErrorMessage=”Albüm adını boş bırakmayın”>!</asp:Req
uiredFieldValidator><asp:Button ID=”btnYeniAlbum” runat=”server”
Text=”Oluştur” OnClick=”btnYeniAlbum_Click” />&nbsp;&nbsp;<br />
&nbsp;&nbsp; İzin:
<asp:DropDownList ID=”drpIzinler” runat=”server”>
<asp:ListItem Selected=”True” Value=”False”>Herkes
G&#246;rebilsin</asp:ListItem>
herkesburada.com
<asp:ListItem Value=”True”>Sadece Arkadaşlarım</asp:
ListItem>
</asp:DropDownList><br />
&nbsp;&nbsp;
<asp:Label ID=”lblSonuc” runat=”server” Font-Size=”Small”
ForeColor=”Red”></asp:Label><br />
<asp:ValidationSummary ID=”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 albumlerim.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.location.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.
protected void btnYeniAlbum_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“insert into Albumler(A
lbumAdi,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();
int i = cmd.ExecuteNonQuery();
if (i > 0)
{
lblSonuc.Text = “Albüm eklendi”;
}
81
82
Proje 1
}
catch (Exception ex)
{
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 sayfayı 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 butonuna tıklandığı zaman resimekle.aspx sayfasına yönlendirme yapıldı. Kullanici klasörüne resimekle.aspx sayfası
ekleyin ve açın. Bu sayfa QueryString ile gelen veriye göre
Şekil 1.30: YeniAlbum.aspx tasarım görünümü.
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 olmadığı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.
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString[“albumId”] != null)
{
try
{
Guid album = new Guid(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ü.
herkesburada.com
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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”resimekle.aspx.cs”
Inherits=”Kullanici_resimekle” Title=”Untitled Page” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<br />
<table style=”width: 100%”>
<tr>
<td style=”width: 100px”>
<asp:Label ID=”lblSonuc” runat=”server”
ForeColor=”Red”></asp:Label></td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td colspan=”3”>
Resim Seç</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td colspan=”2”>
<asp:FileUpload ID=”FileUpload1” runat=”server”
Width=”492px” /></td>
<td style=”width: 100px”>
</td>
83
84
Proje 1
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
<asp:Button ID=”btnEkle” runat=”server”
OnClick=”btnEkle_Click” Text=”Ekle” Width=”156px” /></td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
</table>
herkesburada.com
</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.
Şekil 1.31: ResimEkle.aspx sayfası tasarım görünümü.
Ekle butonuna tıklandığı zaman resmi siteye yükleyecek kodu Liste 1.59‘daki şekilde yazın.
protected void btnEkle_Click(object sender, EventArgs e)
{
string resimAdi = Guid.NewGuid().ToString();
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
try
{
string resimUrl = Server.MapPath(“~/Albumler/”) +
resimAdi + “.albumresmi”;
FileUpload1.SaveAs(resimUrl);
SqlCommand cmd = new SqlCommand(“Insert into fotogra
flar(AlbumId,ResimUrl,EklenmeZamani) values(@AlbumId,@ResimUrl,@
EklenmeZamani)”, con);
cmd.Parameters.AddWithValue(“@AlbumId”, new
Guid(Request.QueryString[“albumId”]));
cmd.Parameters.AddWithValue(“@ResimUrl”, resimAdi+”.
albumresmi”);
cmd.Parameters.AddWithValue(“@EklenmeZamani”,
DateTime.Now);
con.Open();
85
86
Proje 1
cmd.ExecuteNonQuery();
lblSonuc.Text = “Resim eklendi”;
}
catch (HttpException ex)
{
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österen album.aspx sayfasını Kullanici klasörüne ekleyin. Eklenen album.aspx sayfasında da gelen
parametrenin GUID tipinde olup olmadığını kontrol edin.
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString[“album”] != null)
{
try
{
Guid g = new Guid(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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”album.aspx.cs”
Inherits=”Kullanici_album” Title=”Untitled Page” %>
herkesburada.com
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<br />
<asp:Hyperlink ID=”lnkYeniResim” runat=”server”
NavigateUrl=”resimekle.aspx”>Yeni Resim Ekle</asp:Hyperlink><br
/>
<br />
<asp:GridView ID=”GridView1” runat=”server” AutoGenerateColum
ns=”False” CellPadding=”4”
DataKeyNames=”FotografId” DataSourceID=”SqlDataSource1”
ForeColor=”#333333” GridLines=”None”
Width=”100%” AllowPaging=”True”>
<FooterStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
<Columns>
<asp:TemplateField HeaderText=”ResimUrl” SortExpressi
on=”ResimUrl”>
<EditItemTemplate>
<asp:TextBox ID=”TextBox1” runat=”server”
Text=’<%# Bind(“ResimUrl”) %>’></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<img src=’../Albumler/<%# DataBinder.
Eval(Container.DataItem,”ResimUrl”) %>’ alt=”” height=”60”
width=”60” />
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField DeleteText=”Sil”
ShowDeleteButton=”True” />
</Columns>
<RowStyle BackColor=”#F7F6F3” ForeColor=”#333333” />
<EditRowStyle BackColor=”#999999” />
<SelectedRowStyle BackColor=”#E2DED6” Font-Bold=”True”
ForeColor=”#333333” />
<PagerStyle BackColor=”#284775” ForeColor=”White”
HorizontalAlign=”Center” />
<HeaderStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
87
88
Proje 1
<AlternatingRowStyle BackColor=”White” ForeColor=”#284775”
/>
</asp:GridView>
<asp:SqlDataSource ID=”SqlDataSource1” runat=”server”
ConnectionString=”<%$ ConnectionStrings:ConStrHerkesBurada %>”
SelectCommand=”SELECT [FotografId], [AlbumId], [ResimUrl],
[EklenmeZamani] FROM [Fotograflar] WHERE ([AlbumId] = @AlbumId)”
DeleteCommand=”DELETE FROM [Fotograflar] WHERE [FotografId]
= @FotografId” InsertCommand=”INSERT INTO [Fotograflar]
([FotografId], [AlbumId], [ResimUrl], [EklenmeZamani])
VALUES (@FotografId, @AlbumId, @ResimUrl, @EklenmeZamani)”
UpdateCommand=”UPDATE [Fotograflar] SET [AlbumId] = @AlbumId,
[ResimUrl] = @ResimUrl, [EklenmeZamani] = @EklenmeZamani WHERE
[FotografId] = @FotografId”>
<SelectParameters>
<asp:QueryStringParameter Name=”AlbumId”
QueryStringField=”album” Type=”String” />
</SelectParameters>
<DeleteParameters>
<asp:Parameter Name=”FotografId” Type=”Object” />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name=”AlbumId” Type=”Object” />
<asp:Parameter Name=”ResimUrl” Type=”String” />
<asp:Parameter Name=”EklenmeZamani” Type=”DateTime”
/>
<asp:Parameter Name=”FotografId” Type=”Object” />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name=”FotografId” Type=”Object” />
<asp:Parameter Name=”AlbumId” Type=”Object” />
<asp:Parameter Name=”ResimUrl” Type=”String” />
<asp:Parameter Name=”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.
herkesburada.com
Şekil 1.32: Album.aspx sayfa tasarım görünümü.
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 olanlar 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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”albumler.aspx.cs”
Inherits=”Kullanici_albumler” Title=”Kullanıcı Albümleri” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<br />
<asp:DataList ID=”DataList1” runat=”server” CellPadding=”4”
DataKeyField=”AlbumId” ForeColor=”#333333” RepeatColumns=”5”
RepeatDirection=”Horizontal”
Width=”100%”>
<FooterStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
89
90
Proje 1
<AlternatingItemStyle BackColor=”White”
ForeColor=”#284775” />
<ItemStyle BackColor=”#F7F6F3” ForeColor=”#333333” />
<SelectedItemStyle BackColor=”#E2DED6” Font-Bold=”True”
ForeColor=”#333333” />
<HeaderStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
<ItemTemplate>
<img src=”../SiteResimleri/ok.gif” />
<a href=”albumgoruntule.aspx?album=<%# Eval(“AlbumId”)
%>”>
<asp:Label ID=”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.
Şekil 1.33: Albumler.aspx sayfası tasarım görünümü.
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.
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString[“album”] == null)
{
Response.Redirect(“arkadaslarim.aspx”);
herkesburada.com
}
AlbumGoruntule();
}
void AlbumGoruntule()
{
SqlConnection con = new SqlConnection(ConfigurationManage
r.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(“select AlbumId,A
lbumAdi,SadeceArkadaslarGorsun from albumler where kullaniciId =
dbo.KullaniciIdAl(@KullaniciAdi)”,con);
da.SelectCommand.Parameters.AddWithValue(“@KullaniciAdi”,
Request.QueryString[“album”]);
DataTable dt = new DataTable();
da.Fill(dt);
SqlDataAdapter daArkadasListesi = new SqlDataAdapter(“Ark
adasListem”, con);
daArkadasListesi.SelectCommand.Parameters.AddWithValue(“@
UserId”, Membership.GetUser(User.Identity.Name).ProviderUserKey);
daArkadasListesi.SelectCommand.CommandType = CommandType.
StoredProcedure;
DataTable dtArkadaslar = new DataTable();
daArkadasListesi.Fill(dtArkadaslar);
bool arkadasmiyiz = false;
for (int i = 0; i < dt.Rows.Count; i++)
{
if (Convert.ToBoolean(dt.Rows[i][“SadeceArkadaslarGor
sun”]))
{
foreach (DataRow dr2 in dtArkadaslar.Rows)
{
if (dr2[“UserName”].ToString() == Request.
QueryString[“album”])
{
arkadasmiyiz = true;
}
}
}
if (!arkadasmiyiz)
dt.Rows.Remove(dt.Rows[i]);
if (dt.Rows.Count == i )
break;
}
91
92
Proje 1
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.
protected void btnAra_Click(object sender, EventArgs e)
{
Response.Redirect(“uyeara.aspx?ara=” + txtRumuz.Text);
}
Üye arama sonuçlarını listeleyecek olan uyeara.aspx sayfasını Kullanici klasörüne ekleyin. Kullanı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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”uyeara.aspx.cs”
Inherits=”Kullanici_uyeara” Title=”Untitled Page” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
&nbsp;<br />
&nbsp;<asp:Label ID=”lblSonuc” runat=”server” ForeColor=”Red”
Text=”Aradığınız kritere ait kullanıcı bulunamadı”
Visible=”False”></asp:Label><br />
<br />
<asp:DataList ID=”dtSonuclar” runat=”server” CellPadding=”4”
ForeColor=”#333333” OnItemCommand=”dtSonuclar_ItemCommand”
Width=”632px”>
<FooterStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
<SelectedItemStyle BackColor=”#E2DED6” Font-Bold=”True”
ForeColor=”#333333” />
<ItemTemplate>
<table style=”width: 100%”>
herkesburada.com
<tr>
<td rowspan=”2” style=”width: 100px”>
<img alt=’<%# Eval(“UserName”).ToString()
%> resmi’ src=’<%# ResimAdres(DataBinder.Eval(Container.DataItem,
“UserName”).ToString()) %>’ />
</td>
<td style=”width: 100px”>
</td>
<td rowspan=”3” style=”width: 100px”
valign=”top”>
<asp:LinkButton ID=”LinkButton3”
runat=”server” CommandArgument=’<%# Eval(“UserName”) %>’
CommandName=”MesajGonder”
ForeColor=”Blue”>Mesaj Gönder</asp:LinkButton><br />
<asp:LinkButton ID=”LinkButton4”
runat=”server” CommandArgument=’<%# Eval(“UserName”) %>’
CommandName=”Teklif” ForeColor=”Blue”
>Arkadaşlık Teklif Et</asp:LinkButton></td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
&nbsp;<asp:Label ID=”UserNameLabel”
runat=”server” Text=’<%# Eval(“UserName”) %>’></asp:Label></td>
<td style=”width: 100px”>
</td>
</tr>
</table>
<br />
<br />
</ItemTemplate>
<AlternatingItemStyle BackColor=”White”
ForeColor=”#284775” />
<ItemStyle BackColor=”#F7F6F3” ForeColor=”#333333” />
<HeaderStyle BackColor=”#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.
93
94
Proje 1
Şekil 1.34: Uyeara.aspx sayfası tasarım görünümü.
Kullanıcıları arama işlemini Membership sınıfı üzerinden yapın çünkü hızlı arama işlemi yapılırken ihtiyaç duyulan sadece kullanıcı adıdır. Kullanıcı listeleyecek olan datalist kontrolünün ItemCommand olayında ise mesaj göndermeyi ve arkadaşlık teklif etmeyi sağlayın.
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString[“ara”] != null)
{
if (!Page.IsPostBack)
{
VerileriListele(Request.QueryString[“ara”]);
}
}
}
void VerileriListele(string kriter)
{
MembershipUserCollection kullanicilar = Membership.
GetAllUsers();
ArrayList sonuc = new ArrayList();
foreach (MembershipUser kullanici in kullanicilar)
{
if (kullanici.UserName.StartsWith(kriter) ||
kullanici.UserName.EndsWith(kriter))
{
sonuc.Add(kullanici);
herkesburada.com
}
}
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.
protected string ResimAdres(string username)
{
string resimAdres = Profile.GetProfile(username).
ProfilResmi;
return @”../UyeResimleri/” + resimAdres;
}
protected void dtSonuclar_ItemCommand(object source,
DataListCommandEventArgs e)
{
if (e.CommandName == “MesajGonder”)
{
Session[“cevap”] = “” + “|” + e.CommandArgument.
ToString();
Response.Redirect(“~/kullanici/cevapla.aspx”);
}
else
{
// Arkadaşlık teklif et.
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“LocalSqlServer”].ConnectionString);
SqlCommand cmd = new SqlCommand(“insert into Ark
adasListesi(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);
int i = 0;
95
96
Proje 1
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.
<%@ Page Language=”C#” MasterPageFile=”~/herkesburada.
master” AutoEventWireup=”true” CodeFile=”detayliarama.aspx.cs”
Inherits=”Kullanici_detayliarama” Title=”Detaylı Arama” %>
<%@ Register Src=”../Controls/KullaniciSolMenu.ascx” TagName=”Kul
laniciSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:KullaniciSolMenu ID=”KullaniciSolMenu1” runat=”server”
/>
</div>
<div class=”KullaniciIcerik”>
<fieldset style=”height: auto; width: auto”>
<legend><font style=”font-size:smaller”>Üye Ara</font></legend>
<asp:TextBox ID=”txtRumuz” runat=”server” Width=”385px” Valid
ationGroup=”Arama”></asp:TextBox>&nbsp;<asp:RequiredFieldValidator
ID=”RequiredFieldValidator1” runat=”server” ControlToVali
date=”txtRumuz” ErrorMessage=”Boş Bırakmayın” ValidationGroup=”Ar
ama”></asp:RequiredFieldValidator><br />
herkesburada.com
&nbsp;<br />
Fotoğraf &nbsp; &nbsp; &nbsp; &nbsp; :
<asp:CheckBox ID=”chcSadeceFotografli” runat=”server”
Text=”Sadece Fotoğraflı” />&nbsp;<br />
Aranacak Alan:
<asp:CheckBox ID=”chcAdSoyad” runat=”server” Text=”Adı ve
Soyadını da ara” /><br />
Cinsiyet &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:
<asp:DropDownList ID=”drpCinsiyet” runat=”server”>
<asp:ListItem Value=”True”>Bay</asp:ListItem>
<asp:ListItem Value=”False”>Bayan</asp:ListItem>
</asp:DropDownList>
<br />
Online &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; :
<asp:DropDownList ID=”drpDurum” runat=”server”>
<asp:ListItem Value=”false”>T&#252;m Kullanıcılar</asp:
ListItem>
<asp:ListItem Selected=”True” Value=”true”>Sadece Online
Olanlar</asp:ListItem>
</asp:DropDownList><br />
<br />
<asp:Button ID=”btnAra” runat=”server” Text=”Ara”
OnClick=”btnAra_Click” ValidationGroup=”Arama” /><br /></fieldset>
<asp:DataList ID=”DataList1” runat=”server” CellPadding=”4”
ForeColor=”#333333” OnItemCommand=”DataList1_ItemCommand”
Width=”100%”>
<FooterStyle BackColor=”#5D7B9D” Font-Bold=”True”
ForeColor=”White” />
<SelectedItemStyle BackColor=”#E2DED6” Font-Bold=”True”
ForeColor=”#333333” />
<ItemTemplate>
<table style=”width: 100%”>
<tr>
<td rowspan=”2” style=”width: 100px”>
<img alt=’<%# Eval(“UserName”).ToString()
%> resmi’ src=’<%# ResimAdres(DataBinder.Eval(Container.DataItem,
“UserName”).ToString()) %>’ />
</td>
<td style=”width: 100px”>
</td>
<td rowspan=”3” style=”width: 100px”
valign=”top”>
<asp:LinkButton ID=”LinkButton3”
runat=”server” CommandArgument=’<%# Eval(“UserName”) %>’
CommandName=”MesajGonder”
ForeColor=”Blue”>Mesaj Gönder</asp:LinkButton><br />
97
98
Proje 1
<asp:LinkButton ID=”LinkButton4”
runat=”server” CommandArgument=’<%# Eval(“UserId”) %>’
CommandName=”Teklif” ForeColor=”Blue”
>Arkadaşlık Teklif Et</asp:LinkButton></td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
&nbsp;<asp:Label ID=”UserNameLabel”
runat=”server” Text=’<%# Eval(“UserName”) %>’></asp:Label></td>
<td style=”width: 100px”>
</td>
</tr>
</table>
<br />
<br />
</ItemTemplate>
<AlternatingItemStyle BackColor=”White”
ForeColor=”#284775” />
<ItemStyle BackColor=”#F7F6F3” ForeColor=”#333333” />
<HeaderStyle BackColor=”#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ştirin.
try
{
System.Net.Mail.MailMessage mail = new System.Net.Mail.
MailMessage();
mail.From = new System.Net.Mail.MailAddress(“hataci@
herkesburada.com”);
mail.To.Add(“[email protected]”);
mail.Subject = “Site Hatası”;
mail.Priority = System.Net.Mail.MailPriority.High;
herkesburada.com
mail.Body = “Mesaj : “ + Server.GetLastError().Message
+ Environment.NewLine + “ Trace : “ + Server.GetLastError().
StackTrace;
System.Net.Mail.SmtpClient client = new System.Net.
Mail.SmtpClient(“localhost”);
client.Send(mail);
}
catch (Exception ex)
{
throw ex;
}
Şekil 1.35: Detayliarama.aspx sayfa tasarımı.
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.
<%@ Control Language=”C#” AutoEventWireup=”true”
CodeFile=”AdminSolMenu.ascx.cs” Inherits=”Controls_AdminSolMenu”
%>
<fieldset style=”width: 129px; height: 69px”>
<legend>Üye Ara</legend>
<asp:TextBox ID=”txtRumuz” runat=”server” Width=”125px”></
asp:TextBox><br />
&nbsp;<asp:Button ID=”btnAra” runat=”server” OnClick=”btnAra_
Click” Text=”Ara” /></fieldset>
99
100
Proje 1
&nbsp;<br />
<br />
<asp:Menu ID=”Menu1” runat=”server” BackColor=”#E3EAEB”
DynamicHorizontalOffset=”2”
Font-Names=”Verdana” Font-Size=”0.8em” ForeColor=”#666666”
Height=”105px” StaticSubMenuIndent=”10px”
Width=”134px”>
<StaticMenuItemStyle HorizontalPadding=”5px”
VerticalPadding=”2px” />
<DynamicHoverStyle BackColor=”#666666” ForeColor=”White” />
<DynamicMenuStyle BackColor=”#E3EAEB” />
<StaticSelectedStyle BackColor=”#1C5E55” />
<DynamicSelectedStyle BackColor=”#1C5E55” />
<DynamicMenuItemStyle HorizontalPadding=”5px”
VerticalPadding=”2px” />
<Items>
<asp:MenuItem NavigateUrl=”~/Admin/Default.aspx”
Text=”Admin Ana Sayfa” Value=”Admin Ana Sayfa”>
</asp:MenuItem>
<asp:MenuItem Text=”&#220;ye Y&#246;netimi”
Value=”Mesajlarım”>
<asp:MenuItem NavigateUrl=”~/Admin/uyeler.aspx”
Text=”&#220;yeler” Value=”&#220;yeler”>
</asp:MenuItem>
<asp:MenuItem NavigateUrl=”~/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:MenuItem NavigateUrl=”~/Admin/takimlar.aspx”
Text=”Takımlar” Value=”Takımlar”></asp:MenuItem>
<asp:MenuItem Text=”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>
<StaticHoverStyle BackColor=”#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.
herkesburada.com
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. Eklenen 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.
<%@ Page Language=”C#” MasterPageFile=”~/
herkesburada.master” AutoEventWireup=”true”
CodeFile=”takimlar.aspx.cs” Inherits=”Admin_
takimlar” Title=”Untitled Page” %>
Şekil 1.36: AdminSolMenu.ascx tasarım görünümü.
<%@ Register Src=”../Controls/AdminSolMenu.ascx”
TagName=”AdminSolMenu” TagPrefix=”uc1” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”AnaIcerik”
Runat=”Server”>
<div class=”SolMenu”>
<uc1:AdminSolMenu id=”AdminSolMenu1” runat=”server”>
</uc1:AdminSolMenu></div>
<div class=”KullaniciIcerik”>
<asp:UpdatePanel ID=”UpdatePanel1” runat=”server”>
<ContentTemplate>
<asp:GridView ID=”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”>
<FooterStyle BackColor=”#CCCC99” />
<Columns>
<asp:BoundField DataField=”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>
<RowStyle BackColor=”#F7F7DE” />
<SelectedRowStyle BackColor=”#CE5D5A” FontBold=”True” ForeColor=”White” />
<PagerStyle BackColor=”#F7F7DE” ForeColor=”Black”
HorizontalAlign=”Right” />
<HeaderStyle BackColor=”#6B696B” Font-Bold=”True”
ForeColor=”White” />
101
102
Proje 1
<AlternatingRowStyle BackColor=”White” />
</asp:GridView>
<asp:LinkButton ID=”LinkButton1” runat=”server”
OnClick=”LinkButton1_Click” ForeColor=”Blue”>Yeni</asp:
LinkButton><br />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID=”UpdatePanel2” runat=”server”>
<ContentTemplate>
<asp:DetailsView ID=”DetailsView1” runat=”server”
AutoGenerateRows=”False” CellPadding=”4”
DataKeyNames=”TakimId” DataSourceID=”SqlDataSourc
e1” ForeColor=”#333333” GridLines=”None”
Height=”49px” Width=”297px” OnItemCommand=”Detail
sView1_ItemCommand” OnItemInserted=”DetailsView1_ItemInserted”>
<FooterStyle BackColor=”#507CD1” Font-Bold=”True”
ForeColor=”White” />
<CommandRowStyle BackColor=”#D1DDF1” FontBold=”True” />
<EditRowStyle BackColor=”#2461BF” />
<RowStyle BackColor=”#EFF3FB” />
<PagerStyle BackColor=”#2461BF” ForeColor=”White”
HorizontalAlign=”Center” />
<Fields>
<asp:BoundField DataField=”TakimAdi”
HeaderText=”Takım Adı” SortExpression=”TakimAdi” />
<asp:CommandField ShowInsertButton=”True”
CancelText=”İptal” InsertText=”Ekle” />
</Fields>
<FieldHeaderStyle BackColor=”#DEE8F5” FontBold=”True” />
<HeaderStyle BackColor=”#507CD1” Font-Bold=”True”
ForeColor=”White” />
<AlternatingRowStyle BackColor=”White” />
</asp:DetailsView>
</ContentTemplate>
</asp:UpdatePanel>
<br />
<asp:SqlDataSource ID=”SqlDataSource1” runat=”server” Conflic
tDetection=”CompareAllValues”
ConnectionString=”<%$ ConnectionStrings:ConStrHerkesBurada
%>” DeleteCommand=”DELETE FROM [Takimlar] WHERE [TakimId] = @
original_TakimId AND [TakimAdi] = @original_TakimAdi”
InsertCommand=”INSERT INTO [Takimlar] ([TakimAdi]) VALUES
(@TakimAdi)” OldValuesParameterFormatString=”original_{0}”
SelectCommand=”SELECT [TakimId], [TakimAdi] FROM
[Takimlar]” UpdateCommand=”UPDATE [Takimlar] SET [TakimAdi] = @
herkesburada.com
TakimAdi WHERE [TakimId] = @original_TakimId AND [TakimAdi] = @
original_TakimAdi”>
<DeleteParameters>
<asp:Parameter Name=”original_TakimId” Type=”Int32”
/>
<asp:Parameter Name=”original_TakimAdi” Type=”String”
/>
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name=”TakimAdi” Type=”String” />
<asp:Parameter Name=”original_TakimId” Type=”Int32”
/>
<asp:Parameter Name=”original_TakimAdi” Type=”String”
/>
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name=”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ü.
103
2
Proje 2: Otobüs
Otomasyonu
2 Proje 2: Otobüs
Otomasyonu
•
Genel Bakış
•
Görüşmeler
•
Uygulama Tasarımı
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ünden 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ından 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çerisinde 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 edilecek. 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 kullanarak 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ştirildiğ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 zorluğ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ımlayıp, istediğim otobüsü ve şoförü görevlendirme imkanım olmalı.
108
Proje 2
Vildan Parasever (Muhasebe Sorumlusu)
Müşterilerin aldığı biletlerin günlük, aylık raporlarını ve otobüslerin seferlerde yaptığı harcama tutarlarını görebilmeliyim. Şu an için otoban masrafları, terminal giriş çıkış masrafları, yemek ücretleri ve trafik cezası kalemlerini masraf olarak kabul ediyoruz ama ileride yeni harcama kalemleri
ekleme imkanı da olmalı.
Uygulama Analizi
Hı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österilmeyecek.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.
Şekil 2.1: OtobusMasraflari tablosu.
Şekil 2.2: PersonelGirisCikis tablosu.
IslemZamani sütunu için default tanımlayın ve GetDate() olarak verin.
Şekil 2.3: Default tanımlaması.
Otobüs Otomasyonu
Şekil 2.4: Seferler tablosu.
Şekil 2.5: Sehirler tablosu.
Şekil 2.6: Subeler tablosu.
Şekil 2.7: Ayarlar tablosu.
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.
Şekil 2.8: Biletler tablosu.
Şekil 2 9: Calisanlar tablosu.
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.10: CalisanTipleri tablosu.
Şekil 2.11: Hatalar tablosu.
Şekil 2.12: Markalar tablosu.
Şekil 2.13: MasrafTipleri tablosu.
Şekil 2.14: Musteriler tablosu.
109
110
Proje 2
Müşteriler tablosundaki KartDurumu sütunu müşteriye kartın teslim edilip edilmediğinin bilgisini tutacak.
Müşteriler tablosundaki MevcutPara sütunu müşterinin hediye para durumunu tutacak.
Tüm tablolardaki primary key sutunlarınının
identity specification‘ı Yes yapılmalı ve identitty
increment ve seed 1 olarak belirtilmelidir.
Uygulamanın bazı ayarları veritabanı üzerinde tutulmak
zorundadır. Bunun sebebi ise client makine denen şubelerdeki 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 tutulmuş ve bu ayarlar tablosuna sabit değerler girilmiştir. Bu
şekilde farklı şubelerdeki uygulamaların da belirli ayarlara göre çalışması sağlanmıştır.
Şekil 2.15: Otobusler tablosu.
Ayarlar tablonuza müşteri satışları için bir bilete ne kadar puan
aktarımı yapacağımızı belirleyen anahtarı tanımlayın. Tanımlamaktan kasıt yeni bir kayıt girin.
Insert into ayarlar values(‘BiletGeriOdemeOrani’,’0,1’)
Artık BiletGeriOdemeOrani anahtarı veritabanı üzerinde tanımlanan 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 çalışacak olan trigger buradaki oranı okuyup müşterinin hesabına
okunan orana göre puan aktarımı yapacak.
Şekil 2.16: Veritabanı tablo yapısı.
14 tablodan oluşan veritabanını tasarladıktan sonra veritabanıtablo çıktısı Şekil 2. 16’da gösterilmektedir.
Tabloların hepsini aynı anda diyagrama ekleyip çalışmak karışık gelebilir. Çalışılacak tabloları tek tek
eklemek diagramda çalışmayı kolaylaştıracaktır.
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.
Tablo 2.1: Veritabanı İlişkileri
Kaynak Tablo
Kaynak Sütun
Hedef Tablo
Hedef Sütun
Markalar
MarkaId
Otobusler
MarkaId
Otobusler
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
SeferId
CalisanTipleri
CalisanTipId
Calisanlar
CalisanTipId
Otobüs Otomasyonu
* Bu ilişkiyi kurarken Enforce Foreign Key Constraint özelliğ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çilebilecek ve bilgi tutarlılığı zorlanmayacak.
Veritabanınız üzerindeki ilişkileri görmek için select * from sys.objects where type=’F’ sorgusunu yürütebilirsiniz.
Veritabanı diagramı Şekil 2.17’de verilmiştir.
Şekil 2.17: HizliTur veritabanı diagramı.

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.
CREATE PROC SubeEkle
(
@SubeAdi nvarchar(50),
@SehirId int
)
AS
INSERT INTO Subeler(SubeAdi,SehirId) VALUES(@SubeAdi,@SehirId)
Liste 2.1: SubeEkle stored procedure.
CREATE PROC SubeGuncelle
(
@SubeId int,
@SubeAdi nvarchar(50),
@SehirId int
)
AS
111
112
Proje 2
UPDATE Subeler SET SubeAdi = @SubeAdi , SehirId = @SehirId WHERE
SubeId = @SubeId
Liste 2.2: SubeGuncelle stored procedure.
CREATE PROC SubeSil
(
@SubeId int
)
AS
DELETE FROM Subeler Where SubeId = @SubeId
Liste 2.3: SubeSil stored procedure.
CREATE PROC SubeListesi
AS
SELECT SubeId, SubeAdi, SehirId From Subeler
Liste 2.4: SubeListesi stored procedure.
CREATE PROC SubeDetay
(
@SubeId int
)
As
Select SubeId, SubeAdi, SehirId From Subeler Where SubeId = @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 haricinde 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 yapan kodları tekrar yazma sorununu ortadan kaldırır. Sonradan yapılan bir değişikliğin, uygulamanı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ında 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. Bunlardan 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.
Otobüs Otomasyonu

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ı.)
Ş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.
Katmanlı bir uygulama tasarlarken namespace isimleri ProjeAdı.Katman (HizliTur.Entity) şeklinde tanımlanırsa uygulamanın
yazımı ve class’ların anlaşılırlığı daha da rahat olacaktı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 zaman 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 belirleyin. 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 HizliTur.WinUI olarak belirleyin.

HizliTur.WinUI projeniz üzerinde sağ tıklayın, Set As Startup Project menüsüne tıklayın. Bu seçenek sayesinde uygulama derlendiğ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.19: HizliTurSln proje dosya yapısı.
113
114
Proje 2
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 property 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.
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 yazarsınız fakat kısa isimlendirme olacak diye de çok kısa yazılıp anlamsız isimlendirme tekniğine gidilmemelidir.
Projede kullanılacak yapıya örnek olarak Sube class’ı Liste 2.6’da verilmiştir.
using System;
using System.Collections.Generic;
using System.Text;
namespace HizliTur.Entity
{
public class Sube
{
private int _SubeId;
private string _SubeAdi;
private int _SehirId;
public int SubeId
{
get { return _SubeId; }
set { _SubeId = value; }
}
public string SubeAdi
{
get { return _SubeAdi; }
set { _SubeAdi = value; }
}
public int SehirId
{
get { return _SehirId; }
set { _SehirId = value; }
Otobüs Otomasyonu
}
public Sube()
{
}
public Sube(int subeId, string subeAdi, int sehirId)
{
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.
Şekil 2.20: HizliTur.Entity proje çıktısı.
Şekil 2.21: Referans ekleme.

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 ExucuteNonQuery() metodunun kullanılması gereken metodda, try catch hata yakalama mekanizması 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
115
116
Proje 2
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.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
namespace HizliTur.Facade
{
public class Util
{
// Projenin genelinde kullanilacak olan bağlantı
tanimlamasi.
public static string ConnectionString = “server=.;
database=HizliTur;Integrated Security=SSPI;pooling=true;Min Pool
Size=100;Max Pool Size=200”;
public static int Yurut(SqlCommand cmd)
{
int etkilenenSatirSayisi = -1;
try
{
cmd.Connection.Open();
etkilenenSatirSayisi = cmd.ExecuteNonQuery();
}
catch (SqlException)
{
//throw
}
finally
{
cmd.Connection.Close();
}
return etkilenenSatirSayisi;
}
}
}
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-
Otobüs Otomasyonu
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 kolaylaş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 (SqlException ex)
{
#warning Burayı Silmeyi Unutma!
throw ex;
}
Oluşabilecek hata kayıtlarını tutmak için HizliTur.Facade projesine Hataci isminde bir class ekleyin. Hata kayıtlarını tutmayı sağlayacak olan YeniHataKaydi(SqlException hata) metodunu yazın. (Liste 2.8)
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
namespace HizliTur.Facade
{
public class Hataci
{
public static void YeniHataKaydi(SqlException hata)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“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();
}
117
118
Proje 2
catch (SqlException ex)
{
#warning Silmeyi unutma !
throw ex;
}
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 (SqlException ex)
{
Hataci.YeniHataKaydi(ex);
#warning Silmeyi unutma !
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.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Collections;
namespace HizliTur.Facade
{
Otobüs Otomasyonu
public class Sube
{
public static int Ekle(Entity.Sube sube)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“SubeEkle”, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(“@SubeAdi”, sube.SubeAdi);
cmd.Parameters.AddWithValue(“@SehirId”, sube.SehirId);
return Util.Yurut(cmd);
}
public static int Guncelle(Entity.Sube sube)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“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
);
return Util.Yurut(cmd);
}
public static int Sil(Entity.Sube sube)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“SubeSil”, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(“@SubeId”, sube.SubeId);
return Util.Yurut(cmd);
119
120
Proje 2
}
public static ArrayList SubeListesi()
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“SubeListesi”, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
ArrayList subeListesi = new ArrayList();
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Entity.Sube sube = new Entity.Sube();
sube.SubeId = Convert.ToInt32(rdr[“SubeId”]);
sube.SubeAdi = rdr[“SubeAdi”].ToString();
sube.SehirId = Convert.
ToInt32(rdr[“SehirId”]);
subeListesi.Add(sube);
}
}
catch (SqlException ex)
{
Hataci.YeniHataKaydi(ex);
#warning Silmeyi unutma !
throw;
}
finally
{
con.Close();
}
return subeListesi;
}
public static Entity.Sube DetayGoruntule(int subeId)
{
Otobüs Otomasyonu
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“SubeDetay”, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(“@SubeId”, subeId);
Entity.Sube sube = null;
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
sube = new HizliTur.Entity.Sube();
if (rdr.Read())
{
sube.SehirId = Convert.
ToInt32(rdr[“SehirId”]);
sube.SubeAdi = rdr[“SubeAdi”].ToString();
sube.SubeId = Convert.ToInt32(rdr[“SubeId”]);
}
}
catch (SqlException ex)
{
Hataci.YeniHataKaydi(ex);
#warning Burayı Silmeyi Unutma !
throw ex;
}
finally
{
con.Close();
}
return sube;
}
}
}
Liste 2.10: Örnek Sube class’ı.
HizliTur.Facade projesi içerisindeki diğer class’ları da Liste 2.10’daki class’ı örnek alarak yapılandı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 metodlar yeri geldikçe class’lara eklenecektir.
121
122
Proje 2
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.
public static Entity.Calisan calisan = 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.
Şekil 2.22: Kullanıcı giriş ekranı.
FrmGiris formu üzerindeki kontroller ve özellikleri Tablo 2.2’de verilmiştir.
Tablo 2.2: Kullanıcı Giriş Ekranı Kontrolleri
Kontrol
Özellik
Özellik Değeri
TextBox
Name
txtKullaniciAdi
TextBox
Name
txtSifre
UseSystemPasswordChar
True
Name
lblKullaniciAdi
Text
Kullanıcı Adı:
Name
lblSifre
Text
Şifre:
Name
btnGiris
Text
Giriş
Label
Label
Button
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.
CREATE PROC CalisanGiris
(
@KullaniciAdi nvarchar(15),
@Sifre nvarchar(20)
)
AS
SELECT PersonelId ,YoneticiMi,SubeId,CalisanTipId FROM calisanlar
WHERE KullaniciAdi = @KullaniciAdi And Sifre=@Sifre
Liste 2.11: CalisanGiris stored procedure’ü.
Otobüs Otomasyonu
Liste 2.11’de tanımlanan stored procedure’ü çalıştıran Login() metodunu HizliTur.Facade projesi
içerisindeki Calisan class’ına ekleyin.
public static Entity.Calisan Login(Entity.Calisan calisan)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“CalisanGiris”, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(“@KullaniciAdi”, calisan.
KullaniciAdi);
cmd.Parameters.AddWithValue(“@Sifre”, calisan.Sifre);
Entity.Calisan donecekCalisan = null;
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
donecekCalisan = new HizliTur.Entity.
Calisan();
donecekCalisan.PersonelId = Convert.ToInt32(r
dr[“PersonelId”]);
donecekCalisan.YoneticiMi = Convert.ToBoolean
(rdr[“YoneticiMi”]);
donecekCalisan.SubeId = Convert.
ToInt32(rdr[“SubeId”]);
donecekCalisan.CalisanTipId = Convert.ToInt32
(rdr[“CalisanTipId”]);
}
}
catch (SqlException ex)
{
Hataci.YeniHataKaydi(ex);
#warning Silmeyi unutma !
throw; }
finally
{
con.Close();
}
123
124
Proje 2
return donecekCalisan;
}
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ışanların giriş çıkış bilgilerinin de tuPersonelGirisCikis tablosunda IslemZamani sütununda default değer tanımlantulması istendiği için giriş yapan
dığı için yazılan stored procedure (PersonelGirisCikisEkle) ve gerekli metod içekullanıcının kaydını gerekli tabrisinden (Facade.PersonelGirisCikisEkle) IslemZamani parametrelerini kaldırın.
loya ekleyin.(Liste 2.13)
private void btnGiris_Click(object sender, EventArgs e)
{
Entity.Calisan();
Entity.Calisan kullanici = new HizliTur.
kullanici.KullaniciAdi = txtKullaniciAdi.Text;
kullanici.Sifre = txtSifre.Text;
HizliTur.Entity.Calisan calisanBilgi = HizliTur.
Facade.Calisan.Login(kullanici);
if (calisanBilgi != null)
{
// Personelin oturum acma bilgisini kaydet
Entity.PersonelGirisCikis girisBilgileri = new
HizliTur.Entity.PersonelGirisCikis();
girisBilgileri.PersonelId = calisanBilgi.
PersonelId;
girisBilgileri.IslemTipi = true;
Facade.PersonelGirisCikis.PersonelGirisCikisEkle(
girisBilgileri);
// Oturum acan personeli belirle
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.
Otobüs Otomasyonu
Tablo 2.3: FrmMain Formu Özellikleri
Özellik
Özellik Değeri
Text
Hızlı Tur Otobüs Otomasyonu
IsMdiContainer
True
StartPosition
CenterScreen
WindowState
Maximized
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).
private void FrmMain_Load(object sender, EventArgs e)
{
this.Hide();
FrmGiris frm = new FrmGiris();
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 veritabanı ü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 verildiği gibi menüleri ekleyin.
Tablo 2.4: FrmMain Üzerindeki Menüler
Menu Elemanı
Text
Name
İşlemler
İşlemler
islemlerMenusu
Bilet Satış
biletSatis
Yönetimsel Araçlar
yonetimselAraclar
Sefer İşlemleri
seferIslemleri
Şube İşlemleri
subeIslemleri
Personel İşlemleri
personelIslemleri
Otobüs İşlemleri
otobusIslemleri
Müşteri İşlemleri
musteriIslemleri
Raporlar
raporIslemleri
Tarih Bazlı
tarihBazli
Sefer Bazlı
seferBazli
Yönetimsel Araçlar
Raporlar
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 penceresine 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.
125
126
Proje 2
Şekil 2.23: FrmMain ekran görüntüsü.
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 olayında bu metodu çağırın. FrmMain son hali Liste 2.15’de verilmiştir.
public static Entity.Calisan calisan = null;
void YetkiyeGoreMenuGoster()
{
if (!calisan.YoneticiMi)
{
seferIslemleri.Visible = false;
subeIslemleri.Visible = false;
personelIslemleri.Visible = false;
otobusIslemleri.Visible = false;
raporIslemleri.Visible = false;
}
}
private void FrmMain_Load(object sender, EventArgs e)
{
this.Hide();
FrmGiris frm = new FrmGiris();
if (frm.ShowDialog() == DialogResult.OK)
{
this.Show();
YetkiyeGoreMenuGoster();
}
else
Application.Exit();
}
Liste 2.15: FrmMain_Load olayı ve YetkiyeGoreMenuGoster metodu.
Otobüs Otomasyonu
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_Closing 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 kapatı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.
private void FrmMain_FormClosing(object sender,
FormClosingEventArgs e)
{
if (FrmMain.calisan != null)
{
Entity.PersonelGirisCikis cikisBilgileri = new
HizliTur.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 uygulamalar 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, Raporlar, Sefer ve Sube klasörleri ekleyin. Uygulamanın son hali Şekil 2.24’de belirtilmiştir.
Şekil 2.24: HizliTur.WinUI projesi klasör yapısı.
Şekil 2.25: Örnek şube yönetim formu.
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.
Bir klasör içerisine eklenen formun namespace bilgisi KlasorAdi.
FormAdi şeklinde olacaktır.
127
128
Proje 2
Form üzerindeki kontroller ve özellikleri Tablo 2.5’de gösterilmiştir.
Tablo 2.5: FrmSubeIslemleri Form Kontrol Listesi
Kontrol
Özellik
Değer
GroupBox
Name
grpSube
Label
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
Text
Şube Sil
Name
btnSil
Button
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).
private void FrmSubeIslemleri_Load(object sender, EventArgs e)
{
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.Sube sube;
Seçilen bir şubenin detayını getiren metodu cmbSubeListesi combobox kontrolünün SelectedIndexChanged olayında çağırın.
private void cmbSubeListesi_SelectedIndexChanged(object sender,
EventArgs e)
{
Entity.Sube sube = Facade.Sube.DetayGoruntule(Convert.
ToInt32(cmbSubeListesi.SelectedValue));
if (sube != null)
Otobüs Otomasyonu
{
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.
private void btnGuncelle_Click(object sender, EventArgs e)
{
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ı personel veya başka kayıtlar mevcut ise şube silinemeyecektir. Silme esnasında hata oluşursa ekranda hata mesajı görünecektir.
private void btnSil_Click(object sender, EventArgs e)
{
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.
129
130
Proje 2
Yeni şube ekleyebilmek için WinUI projesi içerisindeki Sube klasörüne FrmYeniSube isminde bir
Windows Form ekleyin.
Şekil 2.26: Yeni şube ekleme formu.
Şekil 40’de belirtilen tasarım için Tablo 2.6’daki kontrolleri ekleyin.
Tablo 2.6: Yeni Şube Ekleme Formu Üzerindeki Kontroller
Kontrol
Özellik
Değer
Label
Text
Şube Adı
Label
Text
Şehir
TextBox
Name
txtSubeAdi
Combobox
Name
cmbSehirListesi
Button
Name
btnEkle
Text
Ekle
Name
btnIptal
Text
İptal
Button
Bir şube ekleyebilmek için şehirlere ihtiyaç duyulduğundan dolayı form ilk yüklendiğinde Şehir
listesini combobox kontrolüne doldurun.
private void FrmYeniSube_Load(object sender, EventArgs e)
{
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.
private void btnIptal_Click(object sender, EventArgs e)
{
this.Close();
}
btnEkle butonuna tıklanıldığı zaman yeni bir şube ekleme metodunu çağırın.
private void btnEkle_Click(object sender, EventArgs e)
{
Entity.Sube sube = new HizliTur.Entity.Sube();
Otobüs Otomasyonu
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.
private void btnYeniSube_Click(object sender, EventArgs e)
{
FrmYeniSube frm = new FrmYeniSube();
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.
private void subeIslemleri_Click(object sender, EventArgs e)
{
Sube.FrmSubeIslemleri frm = new Sube.
FrmSubeIslemleri();
frm.MdiParent = this;
frm.Show();
}
HizliTur.WinUI projesine FrmBiletSatis isminde Windows Form ekleyin. FrmMain üzerindeki biletSatis menusunun Click olayına Liste 2.23‘deki kodu yazın.
private void biletSatis_Click(object sender, EventArgs e)
{
FrmBiletSatis frm = new FrmBiletSatis();
frm.MdiParent = this;
frm.Show();
}
Liste 2.23: Bilet Satış Formu açma ekranı.
131
132
Proje 2
HizliTur.WinUI projesi içerisindeki FrmBiletSatis formu tasarım ekranı Şekil 2.27’de verilmiştir.
Şekil 2.27: Bilet Satış ekranı.
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.
Tablo 2.7: Panel 1 İçerisindeki Kontrol Listesi ve Özellikleri
Kontrol
Özellik
Değer
GroupBox
Name
solGrup
Dock
Fill
Text
Sefer Ara
Label
Text
Kalkış :
Label
Text
Varış :
Label
Text
Tarih :
Combobox
Name
cmbKalkis
DropDownStyle
DropDownList
Name
cmbVaris
DropDownStyle
DropDownList
DateTimePicker
Name
dtZaman
Button
Name
btnAra
Combobox
Text
Seferleri Göster
Label
Text
Mevcut Seferler
DataGridView
Name
dgSonuc
AllowUserToAddRows
False
AllowUsertoDeleteRows
False
ReadOnly
True
Panel1 içerisindeki dgSonuc gridview kontrolüne Tablo 2.8’deki sütunları ekleyin.
Otobüs Otomasyonu
Tablo 2.8: dgSonuc Gridview Kontrolü Sütun Listesi
Sütun
Özellik
Değer
ClSaat
DataPropertyName
Saat
HeaderText
Saat
DataProperyName
Plaka
Header Text
Otobüs Plaka
DataPropertyName
BiletTutari
ClPlaka
ClBiletTutari
HeaderText
Ücret
ClSeferId
DataPropertyName
SeferId
ClKoltukSayisi
DataPropertyName
KoltukSayisi
Oluşan Panel 2’ye Tablo 2.9’daki kontrolleri ekleyin ve yapılandırın.
Tablo 2.9: Panel 2 İçerisindeki Kontroller ve Özellikleri
Kontrol
Özellik
Değer
GroupBox
Name
seferGrup
Dock
Top
Text
Sefer Bilgileri
Height
90
Name
lblSeferBilgi
Label
Text
Label
ForeColor
Red
Name
lblPlaka
ForeColor
Red
Text
GroupBox
Label
CheckBox
Name
grpOturmaPlani
Text
Oturma Planı
Dock
Left
Width
268
Text
Müşteri Bilgi
Fore Color
Red
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 Tipi
ComboBox
Name
cmbIslemTipi
133
134
Proje 2
Tablo 2.9: Panel 2 İçerisindeki Kontroller ve Özellikleri (devam)
Kontrol
Özellik
Değer
Label
Text
Satış Tipi
ComboBox
Name
cmbSatisTipi
Label
Text
Koltuk
TextBox
Name
txtKoltukNo
Button
Name
btnOnayla
Text
Onayla
Name
btnIptal
Text
İptal
Button
HizliTur.WinUI projesi içerisindeki FrmBiletSatis formuna Tablo 2.10’daki bileşenleri ekleyin ve
yapılandırın.
Tablo 2.10: FrmBiletSatis Formu Bileşenleri ve Özellikleri
Bileşen
Özellik
Değer
Timer
Name
tmrKoltukBilgiGuncelleyici
Interval
1000
Enabled
False
BackgroundWorker
Name
bcKoltukBilgiGuncelle
ContextMenuStrip
Name
biletSolMenu
biletSolMenu contextmenustrip kontrolüne Tablo 2.11’deki menu elemanlarını ekleyin.
Tablo 2.11: biletSolMenu ContextMenuStrip Kontrolü Menü Listesi
Menu
Name
Satış İptal
satisIptalContext
Satış Yap
satisContext
Rezervasyon İptal
rezervasyonContext
Seperator (-)
Vazgeç
vazgecContext
FrmBiletSatis formu üzerindeki cmbCinsiyet combobox kontrolüne Bay, Bayan olmak üzere sırayla iki eleman ekleyin. (Kontrol üzerinde sağ tıklayın ve Edit Items menüsüne tıklayın)
Kısayol tuşu olarak F7 tuşunu
kullanabilirsiniz.
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
int seferId = 0;
// seçilen seferin bilet ücretini tutar
decimal ucret = 0;
// işlem yapılan müşteri bilgisini tutar
Entity.Musteri musteri;
Otobüs Otomasyonu
// hangi koltuk üzerinde işlem yapıldığının bilgisini tutar.
ContextMenu kullanırken gerekli olacak.
int uzerindeIslemYapilanKoltuk = 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 doldurulmuştur. Bulunan seferleri gösterecek
Bir datagridview kontrolüne bağlanan kaynaktaki tüm sütunları veya
datagridview kontrolünde gösterilmesi
property’leri datagridviewkontrolünde göstermek istemiyorsanız, daistenmeyen sütunlar gizlenmiştir.
tagridview kontrolünün AutoGenerateColumns özelliğini False yapın.
private void
FrmBiletSatis_Load(object sender, EventArgs e)
{
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.
CREATE PROCEDURE MevcutSeferler
(
@KalkisSehirId int,
@VarisSehirId int,
@Tarih datetime
)
AS
SELECT Convert(nvarchar,DatePart(hh,KalkisZamani)) + ‘:’ + Conve
rt(nvarchar,DatePart(mi,KalkisZamani)) as Saat,Otobusler.Plaka ,
Seferler.BiletTutari, Seferler.SeferId ,KoltukSayisi FROM
Seferler Inner Join Otobusler On Seferler.OtobusId = Otobusler.
OtobusId WHERE Seferler.KalkisSehirId = @KalkisSehirId AND
Seferler.VarisSehirId = @VarisSehirId AND (DatePart(d,KalkisZaman
i)= DatePart(d,@Tarih) AND DatePart(m,KalkisZamani)= DatePart(m,@
Tarih)) Order By KalkisZamani
Liste 2.25: MevcutSeferler stored procedure’ü.
135
136
Proje 2
Oluşturulan MevcutSeferler stored procedure’ünü çalıştıran metodu HizliTur.Facade projesi içerisindeki Sefer class’ına ekleyin (Liste 2. 26).
public static DataTable SeferListesi(int kalkisSehirId, int
varisSehirId,DateTime kalkisZamani)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“MevcutSeferler”,con)
;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@KalkisSehirId”,
kalkisSehirId);
cmd.Parameters.AddWithValue(“@VarisSehirId”,
varisSehirId);
cmd.Parameters.AddWithValue(“@Tarih”, kalkisZamani);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
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 listelenmektedir.
private void bntAra_Click(object sender, EventArgs e)
{
dgSonuc.DataSource = null;
DataTable dt = Facade.Sefer.SeferListesi(Convert.
ToInt32(cmbKalkis.SelectedValue), Convert.ToInt32(cmbVaris.
SelectedValue), dtZaman.Value);
if (dt.Rows.Count == 0)
{
MessageBox.Show(“Seçilen bilgilere ait sefer
bulunamadı”);
}
else
{
dgSonuc.DataSource = dt;
}
}
Liste 2.27: Arama button Click olayı.
Otobüs Otomasyonu
Listelenen seferlerden herhangi birine tıklanıldığı zaman sefer detayını ve koltuk durumlarını listeleyen SefereGoreKoltukNumaralari stored procedure’ünü veritabanı üzerinde oluşturun.
CREATE PROCEDURE SefereGoreKoltukNumaralari
(
@SeferId int )
AS
Select SeferId,KoltukNo,YolcuCinsiyet,SatisMiRezervasyonMu From
Biletler Where SeferId = @SeferId
Liste 2.28: SefereGoreKoltukNumaralari stored procedure’ü.
Oluşturulan stored procedure’ü çalıştıran metodu HizliTur.Facade projesi içerisindeki Sefer
class’ına ekleyin.
public static DataTable SefereGoreKoltukNumaralari(int seferId)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“SefereGoreKoltukNuma
ralari”, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@SeferId”, seferId);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
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 renklendirmektedir.
private void bcKoltukBilgiGuncelle_DoWork(object sender,
DoWorkEventArgs e)
{
foreach (Control cl in grpOturmaPlani.Controls)
{
if (cl is Button)
137
138
Proje 2
{
cl.BackColor = Color.Empty;
cl.ForeColor = Color.Black;
foreach (DataRow dr in Facade.Sefer.SefereGor
eKoltukNumaralari(seferId).Rows)
{
if (cl.Text == dr[“KoltukNo”].ToString())
{
if (Convert.ToBoolean(dr[“SatisMiReze
rvasyonMu”]))
{
cl.ForeColor = Color.Black;
}
else
{
//Eğer false ise satış demektir.
cl.ForeColor = Color.White;
}
// Yolcu cinsiyet False Bay için
kullanıldı.
if (Convert.ToBoolean(dr[“YolcuCinsiy
et”]) == 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.
Otobüs Otomasyonu
private void tmrKoltukBilgiGuncelleyici_Tick(object sender,
EventArgs e)
{
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ı) esnasında button kontrolleri eklemektir.
private void dgSonuc_CellDoubleClick(object sender,
DataGridViewCellEventArgs e)
{
grpOturmaPlani.Controls.Clear();
lblPlaka.Text = dgSonuc.Rows[e.RowIndex].
Cells[“ClPlaka”].Value.ToString();
lblSeferBilgi.Text = cmbKalkis.Text + “ - “ +
cmbVaris.Text;
int koltukSayisi = 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());
int soldan = 15, yukaridan = 15;
for (int i = 0; i < koltukSayisi; i++)
{
Button koltuk = new Button();
koltuk.Text = (i + 1).ToString();
koltuk.Height = 30;
koltuk.Width = 30;
koltuk.FlatStyle = FlatStyle.Flat;
koltuk.Cursor = Cursors.Hand;
koltuk.Click += new EventHandler(koltuk_Click);
if (i % 4 == 0)
{
soldan = 25;
yukaridan += 30;
}
else if (i % 2 == 0)
139
140
Proje 2
{
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.
void koltuk_Click(object sender, EventArgs e)
{ // tıklanan butonu yakala
Button tiklananKoltuk = (Button)sender;
// hangi koltuk uzerinde islem yapıldıgının bilgisini
yaz.
int.TryParse(tiklananKoltuk.Text, out
uzerindeIslemYapilanKoltuk);
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);
}
else if ((tiklananKoltuk.BackColor == Color.Blue ||
tiklananKoltuk.BackColor == Color.DarkRed) && tiklananKoltuk.
ForeColor == Color.Black)
{
// daha önceden rezerve edilmiş bir koltuk
rezervasyonContext.Visible = true;
Otobüs Otomasyonu
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.
private void chcMevcutMusteri_CheckedChanged(object sender,
EventArgs e)
{
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.
CREATE PROCEDURE KartNoyaGoreMusteriBilgi
(
@KartNumarasi nvarchar(16)
)
AS
Select MusteriId,Ad,Soyad,Cinsiyet From Musteriler Where
KartNumarasi = @KartNumarasi
Liste 2.35: KartNoyaGoreMusteriBilgi stored procedure’ü.
KartNoyaGoreMusteriBilgi stored procedure’ünü çalıştıran metodu HizliTur.Facade projesi içerisindeki Musteri class’ına ekleyin (Liste 2.36).
public static Entity.Musteri KartNumarasinaGoreMusteriBilgi(strin
g kartNo)
{
141
142
Proje 2
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“KartNoyaGoreMusteriB
ilgi”, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(“@KartNumarasi”, kartNo);
Entity.Musteri donecek = null;
try
{
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
donecek = new HizliTur.Entity.Musteri();
donecek.Ad = rdr[“Ad”].ToString();
donecek.Soyad = rdr[“Soyad”].ToString();
donecek.MusteriId = Convert.ToInt32(rdr[“Must
eriId”]);
donecek.Cinsiyet = Convert.ToBoolean(rdr[“Cin
siyet”]);
donecek.MevcutPara = Convert.ToDecimal(rdr[“M
evcutPara”]);
}
}
catch (SqlException ex)
{
Hataci.YeniHataKaydi(ex);
#warning Silmeyi unutma !
throw;
}
finally
{
con.Close();
}
return donecek;
}
Liste 2.36: KartNumarasinaGoreMusteriBilgi metodu.
txtKartNo textbox kontrolünün TextChanged olayını Liste 2.37’deki gibi hazırlayın. Barkod okuyucudan kart numarası okutulduğu an kart numarasına ait müşteri bilgileri anılır ve kime satış
yapılacağı bilgisi sorgulanır.
Otobüs Otomasyonu
private void txtKartNo_TextChanged(object sender, EventArgs e)
{
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 kesilecek bilete yazdırılır.
private void chcAyniBilgileriKullan_CheckedChanged(object sender,
EventArgs e)
{
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ı.
143
144
Proje 2
GirdiKontrol() isminde metod oluşturun. Bu metod bilet satışı esnasında gerekli alanların
boş geçilememesini sağlar.
bool GirdiKontrol()
{
if (string.IsNullOrEmpty(txtAd.Text) || string.
IsNullOrEmpty(txtSoyad.Text) || string.IsNullOrEmpty(txtKoltukNo.
Text) || cmbCinsiyet.SelectedIndex < 0)
return false;
else
return true; }
Liste 2.39: GirdiKontrol metodu.
Bilet satışı esnasında satılan biletin müşteriye satılması sonucu müşterinin hesabına para aktarmayı sağlayan trigger’ı veritabanı üzerinde oluşturun.
Create trigger MusteriKrediIslem On [Biletler]
For Insert
as
Declare @MusteriId int
Declare @SatisMiRezervasyonMu bit
Select @MusteriId = YolcuId , @SatisMiRezervasyonMu =
SatisMiRezervasyonMu From Inserted
-- yapılan işlem satıs ise ve müşteriye satılıyorsa
if (@SatisMiRezervasyonMu = ‘False’ and @MusteriId > 0)
begin
-- Guncel geri odeme oranini al
Declare @BiletGeriOdemeOrani float
Select @BiletGeriOdemeOrani = Convert(float,Deger) From Ayarlar
Where Anahtar = ‘BiletGeriOdemeOrani’
-- musteriye aktarilacak miktari hesapla
Declare @GeriyeAktarilacakTutar float
Select @GeriyeAktarilacakTutar = Ucret * @BiletGeriOdemeOrani
From Biletler Where SeferId = 2 and KoltukNo=2
-- musteriye aktarimi yap
Update Musteriler Set MevcutPara = MevcutPara + @
GeriyeAktarilacakTutar Where MusteriId = @MusteriId
End
Liste 2.40: MusteriKrediIslem trigger’ı.
Otobüs Otomasyonu
btnOnayla button kontrolünün Click olayını Liste 2.41’deki gibi hazırlayın ve bilet satışını tamamlayın.
private void btnOnayla_Click(object sender, EventArgs e)
{
if (GirdiKontrol())
{
Entity.Bilet bilet = new HizliTur.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
kredisi yok”);
return;
}
}
145
146
Proje 2
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(“Eksik Bilgi”); }
}
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.
Create Trigger BiletIptal On Biletler
For Delete
As
Declare @SatisTip bit
Declare @SatisMiRezervasyonMu bit
Select @SatisTip = SatisTip , @SatisMiRezervasyonMu =
SatisMiRezervasyonMu From Deleted
-- Satış tipi kredili ise
if (@SatisTip = ‘True’ and @SatisMiRezervasyonMu = ‘False’)
begin
-- Müşteri ve sefer bilgisi al
Declare @MusteriId int
Declare @SeferId int
Select @MusteriId = YolcuId, @SeferId = SeferId From Deleted
-- Seferin fiyat bilgisini al
Otobüs Otomasyonu
Declare @BiletFiyat money
Select @BiletFiyat = BiletTutari From Seferler Where SeferId = @
SeferId
-- Müşteriden parayı geri yükle
Update Musteriler Set MevcutPara = MevcutPara + @BiletFiyat Where
MusteriId = @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.
CREATE PROCEDURE RezervasyonuSatisaCevir
(
@SeferId int ,
@KoltukNo int
)
AS
Update Biletler Set SatisMiRezervasyonMu = 0 Where SeferId=@
SeferId And KoltukNo=@KoltukNo
Go
CREATE PROCEDURE SatisIptal
(
@SeferId int ,
@KoltukNo int
)
AS
Delete From Biletler Where SeferId= @SeferId And KoltukNo=@
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).
public static int RezervasyonuSatisaCevir(Entity.Bilet bilet)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“RezervasyonuSatisaCe
vir”, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
147
148
Proje 2
cmd.Parameters.AddWithValue(“@SeferId”, bilet.
SeferId);
cmd.Parameters.AddWithValue(“@KoltukNo”, bilet.
KoltukNo);
return Util.Yurut(cmd);
}
public static int SatisIptal(Entity.Bilet bilet)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“SatisIptal”, con);
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(“@SeferId”, bilet.
SeferId);
cmd.Parameters.AddWithValue(“@KoltukNo”, bilet.
KoltukNo);
return Util.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).
private void vazgecContext_Click(object sender, EventArgs e)
{
biletSolMenu.Hide();
}
private void satisIptalContext_Click(object sender,
EventArgs e)
{
DialogResult sonuc = MessageBox.Show(“Bu satışı iptal
etmekten emin misiniz ?”, “Satış İptal”, MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (sonuc == DialogResult.Yes)
{
// Satış iptali yap
Entity.Bilet bilet = new HizliTur.Entity.Bilet();
bilet.KoltukNo = uzerindeIslemYapilanKoltuk;
bilet.SeferId = seferId;
if (Facade.Bilet.SatisIptal(bilet) > 0)
Otobüs Otomasyonu
MessageBox.Show(“Bilet iptali yapıldı”, “Satış İptal”,
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void rezervasyonContext_Click(object sender,
EventArgs e)
{
DialogResult sonuc = MessageBox.Show(“Bu rezervasyonu
iptal etmekten emin misiniz ?”, “Rezervasyon İptal”,
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (sonuc == DialogResult.Yes)
{
// Satış iptali yap
Entity.Bilet bilet = new HizliTur.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);
}
}
private void satisContext_Click(object sender, EventArgs
e)
{
DialogResult sonuc = MessageBox.Show(“Bu rezervasyonu
satışa çevirmek istediğinizden emin misiniz ?”, “Bilet Satış”,
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (sonuc == DialogResult.Yes)
{
Entity.Bilet bilet = new HizliTur.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.
149
150
Proje 2
Ş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 rapor, diğeri ise seçilen iki şehir arasında yapılan sefer bilgileridir. Raporlar klasörü içerisine FrmTarihBazliRapor isminde bir Windows Form ekleyin. Eklenen bu formun Şekil 2.28’deki tasarımını
yapın.
Şekil 2.28: Tarih Bazlı raporlama ekranı.
FrmTarihBazlıRapor formuna eklenen kontroller ve özellikleri Tablo 2.12’de belirtilmiştir.
Tablo 2.12: FrmTarihBazliRapor Formu Üzerindeki Kontroller ve Özellikleri
Kontrol
Özellik
Değer
GroupBox
Text
Tarih Aralığı Belirleyin
Name
grpKriter
Dock
Top
Label
Text
Başlangıç Tarihi
Label
Text
Bitiş Tarihi
DateTimePicker
Name
dtBaslangicZamani
DateTimePicker
Name
dtBitisZamani
Button
Name
btnRaporla
Text
Raporla
Name
dgRaporSonuc
AllowUserToAddRows
False
AllowUserToDeleteRows
False
ReadOnly
True
Text
Rapor Önizle
Name
btnOnizle
Text
Yazdır
Name
btnYazdir
Text
Excele Aktar
Name
btnExcel
Name
PrintPreviewDialog1
DataGridView
Button
Button
Button
PrintPreviewDialog
Otobüs Otomasyonu
Tablo 2.12: FrmTarihBazliRapor Formu Üzerindeki Kontroller ve Özellikleri (devam)
Kontrol
Özellik
Değer
Document
PrintDocument1
PrintDocument
Name
PrintDocument1
FolderBrowserDialog
Name
FolderBrowserDialog1
Form üzerindeki drRaporSonuc ismini taşıyan datagridview kontrolüne 6 adet sütun ekleyin. Sütun isimleri Tablo 2.13’de verilmiştir.
Tablo 2.13: drRaporSonuc Kontrolü Üzerindeki Sütunlar
Header Text
DataPropertyName
Kalkış Şehri
KalkisSehri
Varış Şehri
VarisSehri
Kalkış Zamanı
KalkisZamani
Varış Zamanı
VarisZamani
Bilet Tutarı
BiletTutari
Yolcu Sayısı
SatisiYapilanBiletSayisi
FrmMain formu içerisindeki Tarih Bazlı Rapor menüsünün Click olayına formu açtırmayı sağlayan kodu yazın.
private void tarihBazliRaporToolStripMenuItem_Click(object
sender, EventArgs e)
{
Raporlar.FrmTarihBazliRapor frm = new HizliTur.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ülenmesini kapatın.
private void FrmTarihBazliRapor_Load(object sender, EventArgs e)
{
dgRaporSonuc.AutoGenerateColumns = false;
}
Raporlama işlemi için gerekli olan TarihBazliRapor stored procedure’ünü veritabanı üzerinde
oluşturun.
Create proc TarihBazliSeferRapor
(
@BaslangicTarihi datetime,
@BitisTarihi datetime
)
As
151
152
Proje 2
Select e.SehirAdi As KalkisSehri,
h.SehirAdi as VarisSehri ,
Case
when s.VarisZamani is NULL
Then ‘Belirtilmedi’
else
Convert(nvarchar,s.VarisZamani, 104)
end As VarisZamani,s.KalkisZamani,s.BiletTutari,
Count(b.SeferId) As SatisiYapilanBiletSayisi From Seferler s
Inner Join Calisanlar c on c.PersonelId = s.SoforId
Inner Join Calisanlar a on a.PersonelId = s.MuavinId
Inner Join Sehirler e on s.KalkisSehirId = e.SehirId
Inner Join Sehirler h on s.VarisSehirId = h.SehirId
Inner Join Biletler b on b.SeferId = s.SeferId
Where s.KalkisZamani Between @BaslangicTarihi And
@BitisTarihi Group By s.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.
public static DataTable TarihBazliSeferRapor(DateTime
baslangicTarihi, DateTime bitisTarihi)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“TarihBazliSeferRapor
”, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@BaslangicTarihi”,baslan
gicTarihi);
cmd.Parameters.AddWithValue(“@BitisTarihi”,bitisTarih
i);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
Liste 2.47: TarihBazliSeferRapor metodu.
Otobüs Otomasyonu
Raporla button kontrolünün Click olayında seçilen tarih aralığındaki bilgileri listeleyen metodu
çağırın.
private void btnRaporla_Click(object sender, EventArgs e)
{
dgRaporSonuc.DataSource = Facade.Sefer.TarihBazliSefe
rRapor(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ı kontrol edin.
private void btnOnizle_Click(object sender, EventArgs e)
{
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.
private void btnYazdir_Click(object sender, EventArgs e)
{
if (dgRaporSonuc.DataSource != null)
printDocument1.Print();
}
Uygulamadaki bir veri kaynağını Microsoft Excel uygulamasına aktarmak için farklı yollar mevcuttur. 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 versiyonu 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 sayesinde 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.
private void btnExcel_Click(object sender, EventArgs e)
{
if (dgRaporSonuc.DataSource != null)
{
if (folderBrowserDialog1.ShowDialog() ==
DialogResult.OK)
{
OleDbConnection excelConnection = new
OleDbConnection(“Data Source=”+ folderBrowserDialog1.SelectedPath 153
154
Proje 2
+”\\TarihBazlıRapor.xls;Provider=Microsoft.Jet.OLEDB.4.0;Extended
Properties=Excel 8.0;”);
OleDbCommand excelCommand = new
OleDbCommand(“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 (Exception ex)
{
MessageBox.Show(“Bu belge zaten mevcut.”);
return;
}
excelConnection.Close();
excelConnection.Open();
DataTable dt = (DataTable)dgRaporSonuc.
DataSource;
foreach (DataRow dr in dt.Rows)
{
excelCommand = new OleDbCommand(“Insert
Into [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[“SatisiYapilanBilet
Sayisi”]));
excelCommand.ExecuteNonQuery();
}
excelConnection.Close();
Otobüs Otomasyonu
}
}
}
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 document sayesinde yapılmaktadır. Bir sayfada 35 kayıt listelenecek şekilde printDocument1_BeginPrint ve printDocument1_PrintPage olaylarını Liste 2.49’da belirtiği gibi hazırlayın ve belirtilen
global değişkenleri oluşturun.
private void printDocument1_BeginPrint(object sender, System.
Drawing.Printing.PrintEventArgs e)
{
// toplam kaç kayıt olacak
int toplamKayit = ((DataTable)dgRaporSonuc.
DataSource).Rows.Count;
// hangi sayfa bitiş sayfamız olacak. Bir sayfada 35
kayıt bulunacak.
bitis = (toplamKayit - (toplamKayit % 35)) / 35;
}
int mevcutSayfa , bitis;
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
// Rapor Başlığını yaz
e.Graphics.DrawString(“Tarih Bazlı Rapor [“
+ dtBaslangicZamani.Value.ToShortDateString() + “ - “ +
dtBitisZamani.Value.ToShortDateString() + “]”, new Font(“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);
155
156
Proje 2
e.Graphics.DrawString(“Yolcu Adedi”, new
Font(“Verdana”, 8), Brushes.Red, 605, 80);
// Başlıklar altına gerekli çizgileri çiz
e.Graphics.DrawLine(new Pen(Brushes.Red),
80,95,700,95);
// Gerekli kayıtları bas. Her sayfada 30 sefer
listelenecek.
DataTable dt = (DataTable)dgRaporSonuc.DataSource;
int y = 130;
// e.HasMorePages=True olduğunda hangi kayıttan
itibaren yazdırmaya başlanacak
int baslangicKayit = mevcutSayfa * 35;
// mevcut sayfaya kaç adet kayıt yazdırılacak.
int bitisKayit = (baslangicKayit + 35 > dt.Rows.
Count) ? dt.Rows.Count : baslangicKayit + 35;
for (int i = baslangicKayit; i < bitisKayit; i++)
{
e.Graphics.DrawString(dt.
Rows[i][“KalkisSehri”].ToString(), new Font(“Verdana”, 8),
Brushes.Black, 110, y);
e.Graphics.DrawString(dt.
Rows[i][“VarisSehri”].ToString(), new Font(“Verdana”, 8), Brushes.
Black, 200, y);
e.Graphics.DrawString(Convert.ToDateTime(dt.
Rows[i][“KalkisZamani”]).ToShortTimeString(), new Font(“Verdana”,
8), Brushes.Black, 280, y);
DateTime varisZaman = DateTime.Now;
bool sonuc = DateTime.TryParse(dt.
Rows[i][“VarisZamani”].ToString(), out varisZaman);
if (sonuc)
e.Graphics.DrawString(Convert.
ToDateTime(dt.Rows[i][“VarisZamani”]).ToShortTimeString(), new
Font(“Verdana”, 8), Brushes.Black, 400, y);
else
e.Graphics.DrawString(dt.
Rows[i][“VarisZamani”].ToString(), new Font(“Verdana”, 8),
Brushes.Black, 400, y);
Otobüs Otomasyonu
e.Graphics.DrawString(Convert.ToDecimal(dt.
Rows[i][“BiletTutari”]) + “ YTL”, new Font(“Verdana”, 8), Brushes.
Black, 510, y);
e.Graphics.DrawString(dt.Rows[i][“SatisiYap
ilanBiletSayisi”].ToString(), new Font(“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 FrmSeferBazliRapor isminde bir Windows Form ekleyin.Şekil 2.29’daki gibi tasarımını yapın.
Şekil 2.29: Sefer Bazlı Raporlama formu.
Kontrolleri Tablo 2.14’de belirtildiği gibi düzenleyin.
157
158
Proje 2
Tablo 2.14: Sefer Bazlı Rapor Formu Üzerindeki Kontroller
Kontrol
Özellik
Değer
GroupBox
Text
Sefer Seçin
Name
grpKriter
Dock
Top
Label
Text
Kalkış:
Label
Text
Varış
ComboBox
Name
cmbKalkis
ComboBox
Name
cmbVaris
Button
Name
btnRaporla
Text
Raporla
Name
dgRaporSonuc
AllowUserToAddRows
False
AllowUserToDeleteRows
False
ReadOnly
True
Text
Rapor Önizle
Name
btnOnizle
Text
Yazdır
Name
btnYazdir
Text
Excel’e Aktar
Name
btnExcel
Name
PrintPreviewDialog1
Document
PrintDocument1
PrintDocument
Name
PrintDocument1
FolderBrowserDialog
Name
FolderBrowserDialog1
DataGridView
Button
Button
Button
PrintPreviewDialog
Form üzerindeki drRaporSonuc ismini taşıyan datagridview kontrolüne 4 adet sütun ekleyin. Sütun isimleri Tablo 2.15’de verilmiştir.
Tablo 2.15: drRaporSonuc Kontrolü Üzerindeki Sütunlar
Header Text
DataPropertyName
Kalkış Zamanı
KalkisZamani
Varış Zamanı
VarisZamani
Bilet Fiyatı
BiletTutari
Yolcu Sayısı
ToplamYolcu
Form ilk yüklendiğinde mevcut combobox kontrollerinin verileri listelemesini ve datagridview kontrolünün sütunları otomatik göstermesini kapatın.
private void FrmSeferBazliRapor_Load(object sender, EventArgs
e)
{
cmbKalkis.DisplayMember = “SehirAdi”;
cmbKalkis.ValueMember = “SehirId”;
cmbKalkis.DataSource = Facade.Sehir.SehirListesi();
cmbVaris.DisplayMember = “SehirAdi”;
cmbVaris.ValueMember = “SehirId”;
cmbVaris.DataSource = Facade.Sehir.SehirListesi();
Otobüs Otomasyonu
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 fonksiyonu oluşturun.
Create Function SeferBasinaToplamYolcu
(
@SeferId int
)
returns int
begin
Declare @Sonuc int
Select @Sonuc = Count(SeferId) From Biletler Where SeferId = @
SeferId
return @Sonuc
end
Liste 2.51: SeferBasinaToplamYolcu stored procedure’ü.
Fonksiyon oluşturulduktan sonra raporlamayı yapacak olan SehirBazliSeferRapor stored
procedure’ünü oluşturun.
Create Proc SehirBazliSeferRapor
(
@KalkisSehri int ,
@VarisSehri int
)
As
Select KalkisZamani,
case
when VarisZamani is NULL
Then ‘Belirtilmedi’
else
Convert(nvarchar,VarisZamani, 104)
end As VarisZamani,BiletTutari, dbo.SeferBasinaToplamYolcu(SeferI
d) As ToplamYolcu
From Seferler Where KalkisSehirId = @KalkisSehri And VarisSehirId
= @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.
159
160
Proje 2
public static DataTable SehirBazliSeferRapor(int kalkisSehirId,
int variSehirId)
{
SqlConnection con = new SqlConnection(Util.
ConnectionString);
SqlCommand cmd = new SqlCommand(“SehirBazliSeferRapor
”, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@KalkisSehri”,
kalkisSehirId);
cmd.Parameters.AddWithValue(“@VarisSehri”,
variSehirId);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
Liste 2.53: SehirBazliSeferRapor metodu.
btnRaporla butonuna tıklanıldığı zaman raporlama işlemini yapacak olan metodu çağırın.
private void btnRaporla_Click(object sender, EventArgs e)
{
dgRaporSonuc.DataSource = Facade.Sefer.SehirBazliSeferRapor(Con
vert.ToInt32(cmbKalkis.SelectedValue), Convert.ToInt32(cmbVaris.
SelectedValue));
}
btnYazdir ve btnOnizle button kontrollerinin Click olaylarını hazırlayın.
private void btnYazdir_Click(object sender, EventArgs e)
{
if (dgRaporSonuc.DataSource != null)
printDocument1.Print();
}
private void btmOnizle_Click(object sender, EventArgs e)
{
if (dgRaporSonuc.DataSource != null)
printPreviewDialog1.ShowDialog();
}
Otobüs Otomasyonu
btnExcel butonuna tıklanıldığı zaman rapor çıktısını verecek metodu yazın.
private void btnExcel_Click(object sender, EventArgs e)
{
if (dgRaporSonuc.DataSource != null)
{
if (folderBrowserDialog1.ShowDialog() ==
DialogResult.OK)
{
OleDbConnection excelConnection = new
OleDbConnection(“Data Source=” + folderBrowserDialog1.
SelectedPath + “\\SehirBazlıRapor.xlsx;Provider=Microsoft.Jet.
OLEDB.4.0;Extended Properties=Excel 9.0;”);
OleDbCommand excelCommand = new
OleDbCommand(“CREATE TABLE [Rapor] ([Kalkış Zamanı] string,
[Varış Zamanı] string, [Bilet Tutarı] double, [Yolcu Sayısı]
int);”, excelConnection);
excelConnection.Open();
try
{
excelCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(“Bu belge zaten mevcut.”);
return;
}
excelConnection.Close();
excelConnection.Open();
DataTable dt = (DataTable)dgRaporSonuc.
DataSource;
foreach (DataRow dr in dt.Rows)
{
excelCommand = new OleDbCommand(“Insert
Into [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”]));
161
162
Proje 2
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.
private void printDocument1_BeginPrint(object sender, System.
Drawing.Printing.PrintEventArgs e)
{
int toplamKayit = ((DataTable)dgRaporSonuc.
DataSource).Rows.Count;
bitis = (toplamKayit - (toplamKayit % 35)) / 35;
}
int mevcutSayfa, bitis;
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
// Rapor Başlığını yaz
e.Graphics.DrawString(“Sefer Bazlı Rapor [“ +
cmbKalkis.Text + “ - “ + cmbVaris.Text + “]”, new Font(“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(“Yolcu Adedi”, new
Font(“Verdana”, 8), Brushes.Red, 470, 80);
// Başlıklar altına gerekli çizgileri çiz
e.Graphics.DrawLine(new Pen(Brushes.Red), 80, 95,
700, 95);
Otobüs Otomasyonu
// Gerekli kayıtları bas. Her sayfada 35 sefer
listelenecek.
DataTable dt = (DataTable)dgRaporSonuc.DataSource;
int y = 130;
int baslangicKayit = mevcutSayfa * 35;
int bitisKayit = (baslangicKayit + 35 > dt.Rows.
Count) ? dt.Rows.Count : baslangicKayit + 35;
for (int i = baslangicKayit; i < bitisKayit; i++)
{
e.Graphics.DrawString(Convert.ToDateTime(dt.
Rows[i][“KalkisZamani”]).ToShortTimeString(), new Font(“Verdana”,
8), Brushes.Black, 80, y);
DateTime varisZaman = DateTime.Now;
bool sonuc = DateTime.TryParse(dt.
Rows[i][“VarisZamani”].ToString(), out varisZaman);
if (sonuc)
e.Graphics.DrawString(Convert.ToDateTime(dt.
Rows[i][“VarisZamani”]).ToShortTimeString(), new Font(“Verdana”,
8), Brushes.Black, 230, y);
else
e.Graphics.DrawString(dt.
Rows[i][“VarisZamani”].ToString(), new Font(“Verdana”, 8),
Brushes.Black, 230, y);
e.Graphics.DrawString(Convert.ToDecimal(dt.
Rows[i][“BiletTutari”]) + “ YTL”, new Font(“Verdana”, 8), Brushes.
Black, 370, y);
e.Graphics.DrawString(dt.Rows[i][“ToplamYolcu”].
ToString(), new Font(“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 üzerinde bir job hazırlayın. Rezerve edilen biletler biletler tablosunda SatisMiRezervasyonMu sütunu
163
164
Proje 2
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.
Create Function KalkisZamaniDondur
(
@SeferId int
)
returns datetime
as
begin
Declare @KalkisZamani datetime
Select @KalkisZamani = KalkisZamani From Seferler Where SeferId
= @SeferId
return @KalkisZamani
end
Liste 2.56: KalkisZamaniDondur fonksiyonu.
Bu fonksiyon sayesinde hangi seferin ne zaman kalkacağı bilgisine ulaşıp silinmesi gereken rezervasyonlara ulaşılacak. Silme işlemini yapacak olan sorgu ise Liste 2.57’de verilmiştir.
Delete From Biletler Where SatisMiRezervasyonMu = ‘True’ And
Datediff(mi, dbo.KalkisZamaniDondur(SeferId), GetDate()) >= -10 Liste 2.57: Rezervasyonları otomatik iptal edecek sorgu.
Sql Server Configuration Manager
aracından servislerin Start Mode
özelliklerini ayarlayabilirsiniz.
Bu sorguyu dakikada bir çalışacak bir job haline getirin. Unutulmamalı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.
Şekil 2.30: Yeni Job oluşturma ekranı.
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.
Otobüs Otomasyonu
Şekil 2.31: Job isimlendirme.
Şekil 2.32: Job adımı oluşturma.
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.
165
166
Proje 2
Şekil 2.33: Job’ın çalışacağı zamanların belirlenmesi.
Job oluşturma işlemini tamamlamak için OK butonuna tıklayıp açık işlemi onaylayın. Bu aşamadan 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.
Uygulama
1. Müşterilerin aldığı biletlerin günlük, aylık raporlarını ve otobüslerin seferlerde harcadığı tutarların raporlarını hazırlayın.
2. Personel yetkilendirme formu yapın.
3. Veritabanının her Pazar full yedeğini, her gün sadece farkların yedeğini alan bir job oluşturun.
4. Müşterinin aldığı bilet için bir tasarım yapın ve çıktısını yazıcıdan çıkartın.
3
Proje 3:
DVDDukkani.com
3 Proje 3 : DVDDukkani.com
•
Görüşmeler
•
Uygulama Tasarımı
Proje 3: DVDDukkani.com
Görüşmeler
Hü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, kategorilerini, 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 oynayan 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 sonunda 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ı yapabilsin. Ö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ı
1. Veritabanı sunucunuzu açın DvdDukkani isminde veritabanı oluşturun.
2. Şekil 3.1 ile Şekil 3.20 arasındaki tabloları veritabanı üzerinde oluşturun.
Ş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.
170
Proje 3
Ş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.
FilmTipUcret tablosundaki Tur ismindeki sutun DVD, CD gibi turleri tutacak. Program tarafından
bir enum aracı olacak.
Ş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.
DVDDukkani.com
Şekil 3.20: TedarikciIstek tablosu.
Eklenen 20 tablo sonucu veritabanındaki tablo listesi Şekil 3.21’deki gibi olmaktadır.
Şekil 3.21: Veritabanı tablo yapısı.
Eklenen tablolar için gerekli ilişkileri verin.
Kaynak Tablo
Kaynak Sütun
Hedef Tablo
Hedef Sütun
Ilceler
SehirId
Sehirler
SehirId
UyeAdresler
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
UyeId
Sepetler
UyeId
Uyeler
UyeId
171
172
Proje 3
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 ekleyin. 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.
using System;
using System.Collections.Generic;
using System.Text;
namespace DvdDukkani.Entity
{
public class Film
{
#region Property
private int _FilmId;
private string _Adi;
private int _DilId;
private string _Ozet;
private int _YapimciFirmaId;
private int _Sure;
private int _Yil;
private string _Afis;
private bool _SatistaMi;
private bool _OnaylandiMi;
private int _TedarikEdilenFirmaId;
public int TedarikEdilenFirmaId
{
DVDDukkani.com
get { return _TedarikEdilenFirmaId; }
set { _TedarikEdilenFirmaId = value; }
}
public int FilmId
{
get { return _FilmId; }
set { _FilmId = value; }
}
public string Adi
{
get { return _Adi; }
set { _Adi = value; }
}
public int DilId
{
get { return _DilId; }
set { _DilId = value; }
}
public string Ozet
{
get { return _Ozet; }
set { _Ozet = value; }
}
public int YapimciFirmaId
{
get { return _YapimciFirmaId; }
set { _YapimciFirmaId = value; }
}
public int Sure
{
get { return _Sure; }
set { _Sure = value; }
}
public int Yil
{
get { return _Yil; }
173
174
Proje 3
set { _Yil = value; }
}
public string Afis
{
get { return _Afis; }
set { _Afis = value; }
}
public bool SatistaMi
{
get { return _SatistaMi; }
set { _SatistaMi = value; }
}
public bool OnaylandiMi
{
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. Örnek olarak Liste 3.2 ile Liste 3.6 arasında Stored Procedure’leri kullanın.
Create Proc FilmEkle
(
@Adi nvarchar(50),
@DilId int,
@Ozet nvarchar(max),
@YapimciFirmaId int,
@Sure int,
@Yil int,
@Afis nvarchar(50),
@TeminEdilenTedarikciId int
)
As
Insert Into Filmler
(
DVDDukkani.com
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’ü.
CREATE Proc FilmGuncelle
(
@Adi nvarchar(50),
@DilId int,
@Ozet nvarchar(max),
@YapimciFirmaId int,
@Sure int,
@Yil int,
@Afis nvarchar(50),
@SatistaMi bit,
@OnaylandiMi bit,
@TeminEdilenTedarikciId int,
@FilmId int
)
As
UPDATE Filmler SET Adi = @Adi
,DilId = @DilId
175
176
Proje 3
,Ozet= @Ozet
,YapimciFirmaId = @YapimciFirmaId
,Sure = @Sure
,Yil = @Yil
,Afis = @Afis
,SatistaMi = @SatistaMi
,OnaylandiMi = @OnaylandiMi
,TeminEdilenTedarikciId = @TeminEdilenTedarikciId
WHERE FilmId = @FilmId
Liste 3.3: FilmGuncelle stored procedure’ü.
CREATE PROC FilmDetay
(
@FilmId int
)
As
Select FilmId
,Adi
,DilId
,Ozet
,YapimciFirmaId
,Sure
,Yil
,Afis
,SatistaMi
,OnaylandiMi
,TeminEdilenTedarikciId
From Filmler Where FilmId = @FilmId And OnaylandiMi=’True’
Liste 3.4: FilmDetay stored procedure’ü.
CREATE Proc FilmListesi
As
SELECT FilmId
,Adi
,DilId
,Ozet
,YapimciFirmaId
,Sure
,Yil
,Afis
,SatistaMi
,OnaylandiMi
DVDDukkani.com
,TeminEdilenTedarikciId
FROM Filmler
Liste 3.5: FilmListesi stored procedure’ü.
CREATE Proc FilmSil
(
@FilmId int
)
As
Delete From Filmler Where FilmId = @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 ekleyin. 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.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
namespace DvdDukkani.DataLayer
{
public class Film
{
public static int FilmEkle(Entity.Film film)
{
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);
SqlCommand cmd = new SqlCommand(“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);
177
178
Proje 3
cmd.Parameters.AddWithValue(“@Afis”, film.Afis);
cmd.Parameters.AddWithValue(“@TeminEdilenTedarikciId”,
film.TedarikEdilenFirmaId);
int i = 0;
try
{
con.Open();
i = Convert.ToInt32(cmd.ExecuteScalar());
}
catch { }
finally { con.Close(); }
return i;
}
public static Entity.Film FilmDetay(int filmId)
{
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);
SqlCommand cmd = new SqlCommand(“FilmDetay”, con);
cmd.Parameters.AddWithValue(“@FilmId”, filmId);
cmd.CommandType = CommandType.StoredProcedure;
Entity.Film film = null;
try
{
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
film = new Entity.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[“TeminEdi
lenTedarikciId”];
}
DVDDukkani.com
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
}
return film;
}
public static int FilmGuncelle(Entity.Film film)
{
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);
SqlCommand cmd = new SqlCommand(“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);
int i = 0;
try
{
con.Open();
i = Convert.ToInt32(cmd.ExecuteScalar());
}
catch { }
finally { con.Close(); }
179
180
Proje 3
return i;
}
public static int FilmSil(int filmId)
{
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);
SqlCommand cmd = new SqlCommand(“FilmSil”, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@FilmId”, filmId);
int i = 0;
try
{
con.Open();
i = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
}
return i;
}
public static List<Entity.Film> FilmListesi()
{
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);
SqlCommand cmd = new SqlCommand(“FilmListesi”, con);
cmd.CommandType = CommandType.StoredProcedure;
List<Entity.Film> filmListesi = new List<DvdDukkani.
Entity.Film>();
try
{
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
DVDDukkani.com
{
Entity.Film film = new Entity.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[“TeminEdi
lenTedarikciId”];
filmListesi.Add(film);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
}
return filmListesi;
}
}
}
Liste 3.7: Facade.Film.cs class yapısı.
Solution’a windows uygulaması ile web uygulamasının haberleşmesini sağlayacak olan web servis projesini oluşturun. DvdDukkani.WebServices isminde bir Web Service projesi ekleyin. Eklenen 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.
public class Security : SoapHeader
{
private string _KullaniciKodu;
181
182
Proje 3
public string KullaniciKodu
{
get { return _KullaniciKodu; }
set { _KullaniciKodu = value; }
}
private string _Sifre;
public string Sifre
{
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.
public int Login(string kullaniciKodu, string sifre)
{
SqlConnection con = new SqlConnection(ConfigurationMa
nager.ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);
SqlCommand cmd = new SqlCommand(“TedarikciLogin”,con)
;
cmd.CommandType = System.Data.CommandType.
StoredProcedure;
cmd.Parameters.AddWithValue(“@KullaniciKodu”,
kullaniciKodu);
cmd.Parameters.AddWithValue(“@Sifre”, sifre);
int i = 0;
try
{
con.Open();
i = Convert.ToInt32(cmd.ExecuteScalar());
}
catch (Exception)
{
i = -1;
}
finally
{
DVDDukkani.com
con.Close();
}
return i;
}
Daha sonra web servisi içerisinde giriş işlemini yapacak metodu oluşturun.
public Security baslik;
[WebMethod(true)]
[SoapHeader(“baslik”)]
public int Login()
{
Tedarikci tedarikci = new Tedarikci();
int i = 0;
i = tedarikci.Login(baslik.KullaniciKodu, baslik.Sifre);
if (i > 0)
Session[“Anahtar”] = Guid.NewGuid();
return i;
}
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)]
public DvdDukkani.Entity.FilmOyuncu[] FilmOyuncuListesi()
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.Facade.FilmOyuncu.
FilmOyuncuListesi().ToArray();
}
else
return null;
}
Liste 3.10: Hangi filmde hangi oyuncu oynuyor bilgisini veren metod.
183
184
Proje 3
[WebMethod(true,CacheDuration=360)]
public DvdDukkani.Entity.Kategori[] FilmKategoriListesi()
{
if (Session[“Anahtar”] != null)
{
return Kategori.KategoriListesi().ToArray();
}
else
return null;
}
Liste 3.11: Filmin hangi kategorilerde olduğunun bilgisini veren metod.
[WebMethod(true, CacheDuration = 360)]
public DataSet YapimciFirmaListesi()
{
if (Session[“Anahtar”] != null)
{
YapimciFirma yapimciFirma = new YapimciFirma();
return yapimciFirma.YapimciFirmaListesi();
}
else
return null;
}
Liste 3.12: Yapımcı Firma listesini döndüren metod.
[WebMethod(true, CacheDuration = 360)]
public DvdDukkani.Entity.Dil[] DilListesi()
{
if (Session[“Anahtar”] != null)
{
return Dil.DilListesi().ToArray();
}
else
return null;
}
Liste 3.13: Mevcut dilleri döndüren metod.
[WebMethod(true, CacheDuration = 360)]
public DvdDukkani.Entity.Yonetmen[] YonetmenListesi()
{
if (Session[“Anahtar”] != null)
DVDDukkani.com
{
return DvdDukkani.DataLayer.Yonetmen.
YonetmenListesi().ToArray();
}
else
return null;
}
Liste 3.14: Yönetmenlerin listesini döndüren metod.
[WebMethod(true, CacheDuration = 360)]
public DvdDukkani.Entity.Oyuncu[] OyuncuListesi()
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.DataLayer.Oyuncu.OyuncuListesi().
ToArray();
}
else
return null;
}
Liste 3.15: Oyuncu listesini döndüren metod.
[WebMethod(true,MessageName=”TumSiparisler”)]
public DvdDukkani.Entity.Sepet[] SepetListesi()
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.DataLayer.Sepet.SepetListesi().
ToArray();
}
else
return null;
}
Liste 3.16: Sepet listesini döndüren metod.
[WebMethod(true,MessageName=”SiparislerDurumaGore”)]
public DvdDukkani.Entity.Sepet[] SepetListesi(byte durum)
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.DataLayer.Sepet.SepetListesi(durum).
ToArray();
185
186
Proje 3
}
else
return null;
}
Liste 3.17: Siparişlerin durumuna göre Sepet dizisi döndüren metod.
[WebMethod(true, MessageName = “TumTalepler”)]
public DvdDukkani.Entity.TedarikciIstek[] TalepListesi(int
tedarikciId)
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.DataLayer.TedarikciIstek.
TalepGetir(tedarikciId).ToArray();
}
else
return null;
}
Liste 3.18: Tüm talepleri döndüren metod.
[WebMethod(true, MessageName = “TaleplerDurumaGore”)]
public DvdDukkani.Entity.TedarikciIstek[] TalepListesi(int
durum, int tedarikciId)
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.DataLayer.TedarikciIstek.
TalepGetir(tedarikciId, durum).ToArray();
}
else
return null;
}
Liste 3.19: Talep durumuna göre istek listesini döndüren metod
[WebMethod(true)]
public bool TalepGuncelle(DvdDukkani.Entity.TedarikciIstek
talep)
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.DataLayer.TedarikciIstek.
TalepGuncelle(talep);
}
else
DVDDukkani.com
return false;
}
Liste 3.20: Talep güncelleyen metod.
[WebMethod(true)]
public void TedarikciGuncelle(DvdDukkani.Entity.Tedarikci t)
{
if (Session[“Anahtar”] != null)
{
DvdDukkani.DataLayer.Tedarikci.Guncelle(t);
}
}
Liste 3.21: Tedarikçi bilgilerini güncelleyen metod.
[WebMethod(true)]
public DvdDukkani.Entity.Tedarikci TedarikciBul(int
tedarikciId)
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.DataLayer.Tedarikci.TedarikciBul(te
darikciId);
}
else
return null;
}
Liste 3.22: Tedarikçi bilgilerini döndüren metod.
[WebMethod(true, CacheDuration = 360)]
public DvdDukkani.Entity.Ilce[] IlceListesi()
{
if (Session[“Anahtar”] != null)
{
return DvdDukkani.DataLayer.Ilce.IlceGetir().
ToArray();
}
else
return null;
}
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, birden fazla oyuncu, yönetmen ve altyazı seçeneği olabilir. Yapılacak işlem ilk önce film eklemek
187
188
Proje 3
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österirken ve yüklerken oluşabilecek hataları önleyecek. Liste 3.24’de belirtildiği gibi FilmEkleme
metodunu oluşturun.
[WebMethod(true, CacheDuration = 360)]
public void FilmEkle(DvdDukkani.Entity.Film film, 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)
{
bool uploadDurumu = false;
Guid afisAdi = Guid.NewGuid();
// Afis’i gonder.
if (afis.Length == 0)
{
// eğer afis dizisi boş ise
film.Afis = “AfisYok.afis”;
uploadDurumu = true;
}
else
{
// gelen afisi filestream ile yaz
try
{
film.Afis = afisAdi.ToString()+ “.afis”;
FileStream fs = new FileStream(Configurati
onManager.AppSettings[“AfisUploadKlasor”] + film.Afis, FileMode.
Create);
fs.Write(afis, 0, afis.Length);
fs.Flush();
fs.Close();
uploadDurumu = true;
}
catch (Exception ex)
{
//throw ex;
uploadDurumu = false;
}
}
int filmEklemeSonuc = 0;
if (uploadDurumu)
DVDDukkani.com
filmEklemeSonuc = DvdDukkani.DataLayer.Film.
FilmEkle(film);
if (filmEklemeSonuc > 0)
{
// altyazilari ekle
foreach (DvdDukkani.Entity.Dil dil in altyazilar)
{
DvdDukkani.Entity.Altyazi altyazi = new
DvdDukkani.Entity.Altyazi();
altyazi.FilmId = filmEklemeSonuc;
altyazi.DilId = dil.DilId;
DvdDukkani.DataLayer.Altyazi.
AltyaziEkle(altyazi);
}
// Oyuncuları Ekle
foreach (DvdDukkani.Entity.FilmOyuncu oyuncu in
oyuncuListesi)
{
oyuncu.FilmId = filmEklemeSonuc;
DvdDukkani.DataLayer.FilmOyuncu.FilmOyuncula
rEkle(oyuncu);
}
foreach (DvdDukkani.Entity.Yonetmen yonetmen in
yonetmenListesi)
{
DvdDukkani.Entity.FilmYonetmeni filmYonetmeni
= new DvdDukkani.Entity.FilmYonetmeni();
filmYonetmeni.FilmId = filmEklemeSonuc;
filmYonetmeni.YonetmenId = yonetmen.
YonetmenId;
DvdDukkani.DataLayer.FilmYonetmen.FilmYonetm
enEkle(filmYonetmeni);
}
foreach (DvdDukkani.Entity.Kategori kategori in
kategoriListesi)
{
DvdDukkani.Entity.FilmKategori filmKategori
= new DvdDukkani.Entity.FilmKategori();
189
190
Proje 3
filmKategori.KategoriId = kategori.
KategoriId;
filmKategori.FilmId = filmEklemeSonuc;
DvdDukkani.DataLayer.FilmKategori.FilmKatego
riEkle(filmKategori);
}
foreach (DvdDukkani.Entity.FilmTipUcret ucret in
filmTipUcretleri)
{
ucret.FilmId = filmEklemeSonuc;
DvdDukkani.DataLayer.FilmTipUcret.
FilmTipUcretEkle(ucret);
}
}
}
}
Liste 3.24: FilmEkleme metodu.
Şekil 3.22: Web referansı eklemek.
DVDDukkani.com
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 isminde 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 sayesinde 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 3.1: FrmLogin Formu Kontrol ve Özellikleri
Kontrol
Özellik
Değer
Label
Text
Kullanıcı Kodu :
Label
Text
Şifre :
TextBox
Name
txtKullaniciKodu
TextBox
Name
txtSifre
Button
Text
Giriş
Name
btnGiris
Tablo Tablo 3.1’de verilen kontroller eklendikten sonra tasarım görünümü Şekil 3.23’deki görünümde olacak.
Şekil 3.23: FrmLogin tasarım görünümü.
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.
public static DvdServis.Service servis = new DvdDukkani.
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 formunu açtırın.
private void FrmMain_Load(object sender, EventArgs e)
{
servis.CookieContainer = new System.Net.
CookieContainer();
191
192
Proje 3
FrmLogin login = new FrmLogin();
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. FrmMain formu içerisine TedarikciId isminde static bir değişken tanımlayın. Bu değişken giriş yapan
tedarikçinin ID bilgisini tutacak.
internal static int TedarikciId=0;
Daha sonra giriş işlemini yaptırın.
private void btnGiris_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
DvdServis.Security guvenlik = new DvdDukkani.
TedarikciWinUI.DvdServis.Security();
guvenlik.KullaniciKodu = txtKullaniciKodu.Text;
guvenlik.Sifre = txtSifre.Text;
FrmMain.servis.SecurityValue = guvenlik;
FrmMain.servis.LoginCompleted += new DvdDukkani.
TedarikciWinUI.DvdServis.LoginCompletedEventHandler(servis_
LoginCompleted);
FrmMain.servis.LoginAsync(); }
void servis_LoginCompleted(object sender, DvdDukkani.
TedarikciWinUI.DvdServis.LoginCompletedEventArgs e)
{
this.Cursor = Cursors.Default;
if (e.Result > 0)
{
FrmMain.TedarikciId = e.Result;
this.DialogResult = DialogResult.OK;
DVDDukkani.com
}
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.
Tablo 3.2: FrmMain Formu Özellikleri ve Değerleri
Özellik
Değer
IsMdiContainer
True
Text
Tedarikçi İşlem
StartPosition
CenterScreen
WindowState
Maximized
FrmMain üzerine MenuStrip kontrolü ekleyin. Eklenen menüye Tablo 3.3‘deki menü elemanlarını
ekleyin.
Tablo 3.3: FrmMain Formu Üzerindeki Menü Elemanları
Özellik
Değer
Text
Siparişler
Text
Yeni Film Tanımla
Text
Film Güncele
Text
Bilgilerim
Gerekli özellikleri ayarladıktan sonra FrmMain formu görüntüsü ‘deki şekilde olmaktadır.
Şekil 3.24: FrmMain formu tasarım görünümü.
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. FrmYeniFilm formu üzerine Tablo 3.4‘deki belirtilen kontrolleri ekleyin ve özellikleri yapılandırın.
193
194
Proje 3
Tablo 3.4: FrmYeniFilm Formu Üzerindeki Kontroller ve Özellikleri
Kontrol
Ö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
Name
btnOyuncuEkle
Text
Oyuncu Ekle
Name
btnYonetmenEkle
Text
Yönetmen Ekle
Name
btnKategori
Text
Kategori Ekle
Name
btnAltYaziEkle
Text
Altyazı Ekle
Name
btnTurler
Text
Türler ve Ücretler
Name
btnFilmEkle
Text
Film Ekle
Button
Button
Button
Button
Button
Button
OpenFileDialog
Gerekli kontroller eklendikten sonra FrmYeniFilm formu Şekil 3.25‘deki gibi olacak.
Şekil 3.25: FrmYeniFilm Windows Form’u tasarım görünümü.
DVDDukkani.com
Bir film eklerken, oyuncuları, yönetmenleri, kategorileri seçileceği için çeşitli button kontolleri ekleyerek 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.
public static List<DvdServis.Yonetmen> YonetmenListesi = new
List<DvdServis.Yonetmen>();
public static List<DvdServis.FilmOyuncu> OyuncuListesi =
new List<DvdServis.FilmOyuncu>();
public static List<DvdServis.Kategori> KategoriListesi =
new List<DvdServis.Kategori>();
public static List<DvdServis.Dil> AltYaziListesi = new
List<DvdServis.Dil>();
public static List<DvdServis.FilmTipUcret>
filmTipUcretListesi = new List<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.
private void FrmYeniFilm_Load(object sender, EventArgs e)
{
YonetmenListesi.Clear();
OyuncuListesi.Clear();
KategoriListesi.Clear();
AltYaziListesi.Clear();
FilmTipUcretListesi.Clear();
CheckForIllegalCrossThreadCalls = false;
Thread thread = new Thread(new ThreadStart(Calistir));
thread.Start();
}
void Calistir()
{
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.
195
196
Proje 3
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.
private void btnYonetmenEkle_Click(object sender, EventArgs e)
{
FrmYonetmenEkle frm = new FrmYonetmenEkle();
frm.ShowDialog();
}
private void btnKategori_Click(object sender, EventArgs e)
{
FrmKategoriEkle frm = new FrmKategoriEkle();
frm.ShowDialog();
}
private void btnAltyaziEkle_Click(object sender, EventArgs e)
{
FrmAltYaziEkle frm = new FrmAltYaziEkle();
frm.ShowDialog();
}
private void btnGozat_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
txtAfis.Text = openFileDialog1.FileName;
}
}
private void btnTurler_Click(object sender, EventArgs e)
{
FrmCdTurUcret frm = new FrmCdTurUcret();
frm.ShowDialog();
}
private void btnOyuncuEkle_Click(object sender, EventArgs e)
{
FrmOyuncuEkle frm = new FrmOyuncuEkle();
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.TedarikciWinUI proje içerisine oluşturun. Eklenecek formlar FrmOyuncuEkle, FrmCdTurUcret, FrmAlt-
DVDDukkani.com
yaziEkle, FrmYonetmenEkle ve FrmKategoriEkle formları.Eklenen FrmKategori formunu açın.
Tablo 3.5’de belirtilen kontolleri forma ekleyin.
Tablo 3.5: FrmKategori Formu Kontrol Listesi ve Özellikleri
Kontrol
Özellik
Değer
Label
Text
Kategori
Button
Text
Ekle
Name
btnEkle
Text
Kaldır
Button
Name
btnKaldir
Combobox
Name
cmbKategori
ListBox
Name
lstKategoriler
Button
Name
btnKapat
Text
Kapat
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.
Şekil 3.26: FrmKategori formu tasarım görünümü.
Kateogori listesini doldurun. Gerekli kontrolleri yaparak işlemi tamamlayın. Gerekli kodlar Liste
3.31‘de verilmiştir.
private void FrmKategoriEkle_Load(object sender, EventArgs e)
{
ListeGuncelle();
FrmMain.servis.FilmKategoriListesiCompleted
+= new FilmKategoriListesiCompletedEventHandler(servis_
FilmKategoriListesiCompleted);
FrmMain.servis.FilmKategoriListesiAsync();
}
void servis_FilmKategoriListesiCompleted(object sender,
FilmKategoriListesiCompletedEventArgs e)
{
197
198
Proje 3
cmbKategori.DisplayMember = “Adi”;
cmbKategori.ValueMember = “KategoriId”;
cmbKategori.DataSource = e.Result;
}
private void btnEkle_Click(object sender, EventArgs e)
{
bool varmi = false;
foreach (DvdServis.Kategori k in FrmYeniFilm.
KategoriListesi)
{
if (k.Adi == (cmbKategori.SelectedItem as
DvdServis.Kategori).Adi)
{
varmi = true;
break;
}
}
if (!varmi)
{
FrmYeniFilm.KategoriListesi.Add((DvdServis.
Kategori)cmbKategori.SelectedItem);
ListeGuncelle();
}
}
void ListeGuncelle()
{
lstKategoriler.Items.Clear();
foreach (DvdServis.Kategori k in FrmYeniFilm.
KategoriListesi)
{
lstKategoriler.Items.Add(k);
}
}
private void btnKaldir_Click(object sender, EventArgs e)
{
if (lstKategoriler.SelectedItems.Count == 0)
{
MessageBox.Show(“Kalırılacak kategoriyi listeden
seçin”);
DVDDukkani.com
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 gelmeyeceğ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.
private bool Kontrol()
{
bool varmi = false;
if (FilmTipUcretListesi.Count < 0)
{
MessageBox.Show(“Satışa çıkacak Cd Tip ve
Ücretleri Belirtin”);
}
foreach (Control cl in this.Controls)
{
if (cl is TextBox)
{
if (string.IsNullOrEmpty(cl.Text))
{
cl.BackColor = Color.Red;
varmi = true;
}
}
}
return !varmi;
}
private void btnFilmEkle_Click(object sender, EventArgs e)
{
if (Kontrol())
{
// afis’i byte[] çevir.
FileInfo afis = new FileInfo(txtAfis.Text);
199
200
Proje 3
byte[] dosya = new byte[Convert.ToInt32(afis.
Length)];
FileStream akis = File.OpenRead(txtAfis.Text);
akis.Read(dosya, 0, dosya.Length);
akis.Close();
DvdServis.Film film = new DvdDukkani.
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 += new
DvdDukkani.TedarikciWinUI.DvdServis.FilmEkleCompletedEventHandler
(servis_FilmEkleCompleted);
FrmMain.servis.FilmEkleAsync(film, dosya,
AltYaziListesi.ToArray(), OyuncuListesi.ToArray(),
YonetmenListesi.ToArray(), KategoriListesi.ToArray(),
FilmTipUcretListesi.ToArray());
}
}
void servis_FilmEkleCompleted(object sender,
AsyncCompletedEventArgs e)
{
MessageBox.Show(“Film Eklendi”);
}
Liste 3.32: Film ekleme işlemi.
Tedarikçi firmanın kendi bilgilerini güncellemesini sağlamak için FrmBilgilerim isminde bir Windows Form ekleyin.
Uygulama: Şekil 3.27’de ekran çıktısı verilen bilgilerim formunu yapılandırın ve tedarikçinin bilgilerini güncellemesini sağlayın.
DVDDukkani.com
Şekil 3.27: FrmBilgilerim formu tasarım görünümü.
Site sahibinin tedarikçiden isteyeceği siparişleri, tedarikçinin yönetebilmesini sağlamak için uygulamaya FrmGelenSiparisler formu ekleyin. Bu form sayesinde tedarikçi, gelen ve giden siparişlerini görebilecek, ek açıklama ekleyebilecek. Eklenen form üzerine Tablo 3.6’da belirtilen kontrolleri
ekleyin ve yapılandırın.
Tablo 3.6: FrmGelenSiparisler Formu Kontrol Listesi
Kontrol
Özellik
Değer
GroupBox
Text
Sipariş Durumu
RadioButton
Text
Cevaplananlar
Name
rCevaplananlar
Text
Cevapsızlar
Name
rCevapsizlar
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
Text
Teslim Edilmedi
Name
rbPasif
TextBox
Name
txtAciklama
Button
Name
RadioButton
RadioButton
RadioButton
Gerekli kontrolleri ekledikten sonra tasarımı Şekil 3.28’deki gibi yapın.
201
202
Proje 3
Şekil 3.28: FrmGelenSiparisler tasarım görünümü.
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.
private void FrmGelenSiparisler_Load(object sender, EventArgs e)
{
this.TalepDoldur();
}
DvdServis.TedarikciIstek[] talepler = null;
void TalepDoldur()
{
talepler = null;
if (rCevaplananlar.Checked)
talepler = FrmMain.servis.TalepListesi(1, FrmMain.
TedarikciId);
else if (rCevapsizlar.Checked)
talepler = FrmMain.servis.TalepListesi(2, FrmMain.
TedarikciId);
else
talepler = FrmMain.servis.TalepListesi(FrmMain.
TedarikciId);
dgSonuc.DataSource = talepler;
this.Listele();
}
private void rCevapsizlar_CheckedChanged(object sender,
EventArgs e)
{
this.TalepDoldur();
DVDDukkani.com
}
private void rCevaplananlar_CheckedChanged(object sender,
EventArgs e)
{
this.TalepDoldur();
}
private void rTumu_CheckedChanged(object sender, EventArgs
e)
{
this.TalepDoldur();
}
private void btnGuncelle_Click(object sender, EventArgs
e)
{
if (dgSonuc.SelectedRows.Count > 0)
{
DvdServis.TedarikciIstek talep = talepler[dgSonuc.
SelectedRows[0].Index];
talep.EkNot = txtAciklama.Text;
talep.GerceklestiMi = rbAktif.Checked;
bool sonuc = 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üncelleme yapabilmek için bir
talep seçmelisiniz”);
}
}
203
204
Proje 3
private void dgSonuc_SelectionChanged(object sender,
EventArgs e)
{
Listele();
}
private void Listele()
{
if (dgSonuc.SelectedRows.Count > 0)
{
DvdServis.TedarikciIstek talep = 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 isminde 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 isminde 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 sayfasının tasarımını Liste 3.34’deki şekilde yapın.
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).
<%@ Master Language=”C#” AutoEventWireup=”true” CodeFile=”ana.
master.cs” Inherits=”ana” %>
<%@ Register Assembly=”FlashControl” Namespace=”Bewise.Web.
UI.WebControls” TagPrefix=”Bewise” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en”
lang=”en”>
<head>
<meta http-equiv=”Content-Type” content=”text/html;
charset=iso-8859-1” />
<title>Dvd Dükkanı - [ Bizde yoksa daha o film çekilmemiştir
]</title>
<link href=”style/stil.css” rel=”stylesheet” type=”text/css”
/>
</head>
DVDDukkani.com
<body>
<form id=”masterForm” runat=”server”>
<asp:ScriptManager ID=”ScriptManager1” runat=”server”>
</asp:ScriptManager>
<div id=”mainnav-container”>
<div id=”mainnav”>
<ul>
<li><a href=”default.aspx”>Ana Sayfa</a></li>
</ul>
</div>
<div id=”mainnav-side”>
<ul>
<li>
<asp:HyperLink ID=”hlYeniUye”
runat=”server” NavigateUrl=”~/YeniUye.aspx”>Üye Olun</asp:
HyperLink>
</li>
<li>
<asp:LinkButton ID=”lnkCikis”
runat=”server” OnClick=”lnkCikis_Click”>Çıkış</asp:LinkButton>
</li>
<li>
<asp:LinkButton ID=”lnkDurum”
runat=”server” OnClick=”lnkDurum_Click”>LinkButton</asp:
LinkButton></li>
</ul>
</div>
<div class=”clear”>
</div>
</div>
<div id=”header”>
<a href=”#” title=”Site name home page”>Dvd</a>
Dükkan&#305;<div id=”slogan”>
E&#287;er bizde bir film yok ise daha o film
çekilmemi&#351;tir</div>
</div>
<div id=”breadcrumb-container”>
<div id=”breadcrumb”>
<asp:SiteMapPath ID=”SiteMapPath1” runat=”server”
Font-Names=”Verdana” Font-Size=”0.8em”
PathSeparator=” : “>
<PathSeparatorStyle Font-Bold=”True”
ForeColor=”#990000” />
<CurrentNodeStyle ForeColor=”#333333” />
205
206
Proje 3
<NodeStyle Font-Bold=”True”
ForeColor=”#990000” />
<RootNodeStyle Font-Bold=”True”
ForeColor=”#FF8000” />
</asp:SiteMapPath>
</div>
<div id=”breadcrumb-side” style=”width: 219px”>
<fieldset>
<legend>Ara</legend>
<input onfocus=”this.select()” onblur=”if
(this.value==’’){this.value=’enter search phrase’}”
id=”search” name=”search” type=”text”
class=”searchbox” accesskey=”4” size=”20” />&nbsp;
<input class=”button-search” name=”Search”
type=”button” value=”Ara” />
</fieldset>
</div>
<div class=”clear”>
</div>
</div>
<div id=”content-container”>
<div id=”content-side” style=”left: 0px; top: 0px;”>
<ul class=”link-list-vertical”>
<asp:Repeater ID=”Repeater1” runat=”server”
DataSourceID=”SqlDataSource1”>
<ItemTemplate>
<li><a href=’kategoridetay.
aspx?Kategori=<%# DataBinder.Eval(Container.DataItem,
“KategoriId”) %>’>
<%# DataBinder.Eval(Container.
DataItem, “Adi”) %>
</a></li>
</ItemTemplate>
</asp:Repeater>
<asp:SqlDataSource ID=”SqlDataSource1”
runat=”server” ConnectionString=”<%$ ConnectionStrings:
DvdDukkaniConnectionString %>”
SelectCommand=”SELECT [KategoriId], [Adi]
FROM [Kategoriler] ORDER BY [KategoriId]”>
</asp:SqlDataSource>
<asp:Panel ID=”pnlSepet” runat=”server”>
<br />
<br />
DVDDukkani.com
<asp:DataList ID=”dlSepet” runat=”server”
Font-Bold=”True” Font-Size=”X-Small” OnItemDataBound=”dlSepet_
ItemDataBound” Width=”150px” BorderColor=”#E0E0E0”
BorderStyle=”Solid” BorderWidth=”1px”>
<ItemTemplate>
<table style=”width: 100%”>
<tr>
<td align=”left”
width=”200”>
<asp:Label
ID=”lblFilm” runat=”server” Text=’<%# Eval(“FilmAdi”) %>’></asp:
Label></td>
<td align=”right”
width=”35”>
<asp:Label
ID=”lblAdet” runat=”server” Text=’<%# Eval(“Adet”) %>’></asp:
Label></td>
<td align=”right”
width=”50”>
<asp:Label
ID=”lblToplam” runat=”server” Text=’<%# Eval(“SatirToplam”,”{0:
N}”) %>’></asp:Label></td>
</tr>
</table>
</ItemTemplate>
<HeaderTemplate>
<table style=”width: 100%”>
<tr>
<td align=”center”
width=”200”>
Film</td>
<td align=”center”
width=”35”>
Adet</td>
<td align=”center”
width=”50”>
Fiyat</td>
</tr>
</table>
</HeaderTemplate>
<FooterTemplate>
<div style=”text-align: right”>
<table style=”width: 100%”>
<tr>
<td style=”width:
100%”>
207
208
Proje 3
<asp:Label
ID=”Label1” runat=”server” Text=”Toplam : “></asp:Label>
<asp:Label
ID=”lblToplam” runat=”server” Text=’<%# genelToplam %>’></asp:
Label></td>
</tr>
</table>
</div>
<asp:LinkButton ID=”LinkButton1”
runat=”server” OnClick=”LinkButton1_Click”>Sepeti Göster</asp:
LinkButton>
<br />
<asp:LinkButton ID=”LinkButton2”
runat=”server” OnClick=”LinkButton2_Click”>Sepeti Onayla</asp:
LinkButton>
</FooterTemplate>
</asp:DataList>
<asp:Label ID=”lblBosBilgi” runat=”server”
Visible=”False”></asp:Label></asp:Panel>
</ul>
</div>
<div id=”content”>
<asp:ContentPlaceHolder ID=”ContentPlaceHolder1”
runat=”server”>
</asp:ContentPlaceHolder>
<div id=”footer”>
<p>
Copyright &copy; 2007 Dvd Dukkan&#305;</
p>
</div>
</div>
<div id=”content-side-2”>
<p>
</p>
<p>
</p>
<p>
<bewise:flashcontrol id=”FlashControl1”
runat=”server” height=”100px”
movieurl=”~/Resimler/Untitled-7.swf”
width=”100px”></bewise:flashcontrol></p>
</div>
DVDDukkani.com
</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.
<add name=”DvdDukkaniConStr” connectionString=”server=.;database=
DvdDukkani;Integrated_Security=SSPI”/>
Yapılan tasarımın görsel çıktısı Şekil 3.29’da gösterilmektedir.
Şekil 3.29: ana.master dosyası tasarım görünümü.
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 devam edin.
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public class Urun
{
public Urun()
209
210
Proje 3
{
}
private int _FilmId;
public int FilmId
{
get { return _FilmId; }
set { _FilmId = value; }
}
private string _FilmAdi;
public string FilmAdi
{
get { return _FilmAdi; }
set { _FilmAdi = value; }
}
private int _Adet;
public int Adet
{
get { return _Adet; }
set { _Adet = value; }
}
private decimal _Birimfiyat;
public decimal Birimfiyat
{
get { return _Birimfiyat; }
set { _Birimfiyat = value; }
}
private decimal _SatirToplam;
public decimal SatirToplam
{
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.
protected void Page_Load(object sender, EventArgs e)
{
this.PreRender += new EventHandler(ana_PreRender);
DVDDukkani.com
}
void ana_PreRender(object sender, EventArgs e)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
lnkDurum.Text = HttpContext.Current.User.Identity.
Name;
if (Session[“sepet”] != null)
{
List<Urun> sepet = Session[“sepet”] as List<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;
}
}
protected void lnkDurum_Click(object sender, EventArgs e)
{
if (!HttpContext.Current.User.Identity.IsAuthenticated)
FormsAuthentication.RedirectToLoginPage();
else
{
Response.Redirect(“Bilgilerim.aspx?Email=” + lnkDurum.
Text);
}
}
decimal toplamFiyat = 0;
protected string genelToplam = “”;
protected void dlSepet_ItemDataBound(object sender,
DataListItemEventArgs e)
211
212
Proje 3
{
if (e.Item.DataItem != null)
{
Urun u = e.Item.DataItem as Urun;
toplamFiyat += u.SatirToplam;
genelToplam = toplamFiyat.ToString(“N”);
}
}
protected void lnkSepetGoster_Click(object sender, EventArgs
e)
{
Response.Redirect(“Sepet.aspx”);
}
protected void lnkSepetOnayla_Click(object sender, EventArgs
e)
{
Response.Redirect(“SepetOnay.aspx”);
}
protected void lnkCikis_Click(object sender, EventArgs e)
{
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. Uygulamaya 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.
<%@ Page Language=”C#” MasterPageFile=”~/ana.master”
AutoEventWireup=”true” CodeFile=”Login.aspx.cs” Inherits=”Login”
Title=”Untitled Page” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”ContentPlaceHold
er1” Runat=”Server”>
<table>
<tr>
<td style=”width: 100px”>
E-Mail</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtEmail” runat=”server”></asp:
TextBox></td>
<td style=”width: 100px”>
<asp:RequiredFieldValidator ID=”rfvKullaniciAdi”
runat=”server” ControlToValidate=”txtEmail”
DVDDukkani.com
ErrorMessage=”E-Mail Boş Geçilemez” SetFocusOn
Error=”True”>*</asp:RequiredFieldValidator></td>
</tr>
<tr>
<td style=”width: 100px”>
Şifresi</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtSifre” runat=”server”
TextMode=”Password”></asp:TextBox></td>
<td style=”width: 100px”>
<asp:RequiredFieldValidator ID=”RequiredFieldVali
dator2” runat=”server” ControlToValidate=”txtSifre”
ErrorMessage=”rfvSifre” SetFocusOnError=”True
”>*</asp:RequiredFieldValidator></td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
<asp:LinkButton ID=”lbGiris” runat=”server”
OnClick=”lbGiris_Click”>Giriş</asp:LinkButton></td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
<asp:Label ID=”lblHata” runat=”server”
ForeColor=”Red” Text=”Label” Visible=”False”></asp:Label></td>
<td style=”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.
213
214
Proje 3
Şekil 3.30: Login.aspx sayfa tasarım görünümü.
Giriş yapmayı sağlamak için Login.aspx sayfasının gerekli metodlarını yazın.
SqlConnection cn = new SqlConnection(WebConfigurationManager.
ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);
protected void lbGiris_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand(“Select UyeId from Uyeler
where Email=@Email and Sifre=@Sifre and Aktivasyon=1”, cn);
cmd.Parameters.AddWithValue(“@Email”, txtEmail.Text);
cmd.Parameters.AddWithValue(“@Sifre”, txtSifre.Text);
int? giris = 0;
try
{
cn.Open();
string s = 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
DVDDukkani.com
{
FormsAuthentication.RedirectFromLoginPage(txtEmai
l.Text, false);
}
}
catch (SqlException ex)
{
throw ex;
}
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.
<%@ Page Language=”C#” MasterPageFile=”~/ana.master”
AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_
Default” Title=”Untitled Page” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”ContentPlaceHold
er1” Runat=”Server”>
<asp:DataList ID=”DataList1” runat=”server” CellPadding=”4”
DataKeyField=”FilmId” ItemStyle-Wrap=”true”
DataSourceID=”SqlDataSource2” ForeColor=”#333333”
RepeatColumns=”3” AlternatingItemStyle-Wrap=”true” >
<FooterStyle BackColor=”#990000” Font-Bold=”True”
ForeColor=”White” />
<AlternatingItemStyle BackColor=”White” />
<ItemStyle BackColor=”#FFFBD6” ForeColor=”#333333” />
<SelectedItemStyle BackColor=”#FFCC66” Font-Bold=”True”
ForeColor=”Navy” />
<HeaderStyle BackColor=”#990000” Font-Bold=”True”
ForeColor=”White” />
<ItemTemplate>
<table style=”width: 100%”>
<tr>
<td align=”center” colspan=”2”>
<img height=”150” src=’Resimler/
Afisler/<%# Eval(“Afis”) %>’ />
<br />
<a href=’filmdetay.aspx?film=<%#
Eval(“FilmId”) %>’>
215
216
Proje 3
<asp:Label ID=”AdiLabel”
runat=”server” Text=’<%# Eval(“Adi”) %>’></asp:Label></a></td>
</tr>
<tr>
<td colspan=”2” rowspan=”2”>
</td>
</tr>
<tr>
</tr>
</table>
</ItemTemplate>
</asp:DataList><asp:SqlDataSource ID=”SqlDataSource2”
runat=”server” ConnectionString=”<%$ ConnectionStrings:
DvdDukkaniConnectionString %>”
SelectCommand=”select Top 5 * from filmler order by
filmId desc “></asp:SqlDataSource>
<h1>Sizin için seçtiklerimiz</h1>
<asp:DataList ID=”DataList2” runat=”server”
DataKeyField=”FilmId” DataSourceID=”SqlDataSource1” Width=”100%”>
<ItemTemplate>
<table style=”width: 100%”>
<tr>
<td rowspan=”3” style=”width: 48px”>
<img height=”150” src=’Resimler/
Afisler/<%# Eval(“Afis”) %>’ width=”110” /></td>
<td valign=”top” align=”left” >
<a href=’filmdetay.aspx?film=<%#
Eval(“FilmId”) %>’>
<asp:Label ID=”AdiLabel1”
runat=”server” Text=’<%# Eval(“Adi”) %>’></asp:Label></td>
</tr>
<tr>
<td valign=”top”>
<asp:Label ID=”Label1” runat=”server”
Text=’<%# Eval(“Ozet”) %>’></asp:Label></td>
</tr>
<tr>
</tr>
</table>
</ItemTemplate>
</asp:DataList><asp:SqlDataSource ID=”SqlDataSource1”
runat=”server” ConnectionString=”<%$ ConnectionStrings:
DvdDukkaniConnectionString %>”
SelectCommand=”SELECT top 10 [Afis], [Adi], [FilmId],
Ozet FROM [Filmler] WHERE (([SatistaMi] = @SatistaMi) AND
([OnaylandiMi] = @OnaylandiMi)) order by filmId desc”>
<SelectParameters>
DVDDukkani.com
<asp:Parameter DefaultValue=”false” Name=”SatistaMi”
Type=”Boolean” />
<asp:Parameter DefaultValue=”false” Name=”OnaylandiMi”
Type=”Boolean” />
</SelectParameters>
</asp:SqlDataSource>
<br />
<br />
</asp:Content>
Liste 3.39: Default.aspx sayfasının html tasarımı.
Şekil 3.31: Default.aspx tasarım görünümü.
Kategorilere tıklandığı zaman kategorilere göre filmleri listeleyecek olan kategoridetay.aspx sayfasını ekleyin. QueryString ile gelen kategoriId bilgisine göre filmleri listeleyin. Liste 3.40’da belirtildiği gibi tasarımı yapın.
<%@ Page Language=”C#” MasterPageFile=”~/ana.master”
AutoEventWireup=”true” CodeFile=”KategoriDetay.aspx.cs”
Inherits=”KategoriDetay” Title=”Untitled Page” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”ContentPlaceHold
er1” runat=”Server”>
<asp:DataList ID=”DataList1” runat=”server” CellPadding=”4”
DataKeyField=”FilmId”
DataSourceID=”SqlDataSource2” ForeColor=”#333333”
RepeatColumns=”5” Width=”100%”>
<FooterStyle BackColor=”#990000” Font-Bold=”True”
ForeColor=”White” />
<AlternatingItemStyle BackColor=”White” />
<ItemStyle BackColor=”#FFFBD6” ForeColor=”#333333” />
<SelectedItemStyle BackColor=”#FFCC66” Font-Bold=”True”
ForeColor=”Navy” />
217
218
Proje 3
<HeaderStyle BackColor=”#990000” Font-Bold=”True”
ForeColor=”White” />
<ItemTemplate>
<table style=”width: 100%”>
<tr>
<td align=”center” colspan=”2”>
<img height=”150” src=’Resimler/
Afisler/<%# Eval(“Afis”) %>’ width=”110” />
<br />
<a href=’filmdetay.aspx?film=<%#
Eval(“FilmId”) %>’>
<asp:Label ID=”AdiLabel”
runat=”server” Text=’<%# Eval(“Adi”) %>’></asp:Label></a></td>
</tr>
<tr>
<td colspan=”2” rowspan=”2”>
</td>
</tr>
<tr>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
<asp:SqlDataSource ID=”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:QueryStringParameter Name=”KategoriId” QueryStri
ngField=”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.
DVDDukkani.com
Şekil 3.32: KategoriDetay.aspx sayfası tasarım görünümü.
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.
<%@ Page Language=”C#” MasterPageFile=”~/ana.master”
AutoEventWireup=”true” CodeFile=”filmdetay.aspx.cs”
Inherits=”filmdetay” Title=”Untitled Page” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”ContentPlaceHold
er1” Runat=”Server”>
<table style=”width: 100%”>
<tr>
<td rowspan=”6” style=”width: 104px” align=”left”>
<asp:Image ID=”imgAfis” runat=”server” /></td>
<td style=”width: 115px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 115px; height: 18px”>
<h1><asp:Label ID=”lblAd” runat=”server”
Width=”250px”></asp:Label></h1></td>
<td style=”width: 100px; height: 18px”>
</td>
</tr>
<tr>
<td style=”width: 115px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
219
220
Proje 3
<td colspan=”2” rowspan=”2”>
<asp:Label ID=”lblAciklama” runat=”server”
Text=”Label”></asp:Label></td>
</tr>
<tr>
</tr>
<tr>
<td style=”width: 115px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td >
</td>
<td style=”width: 115px”>
<asp:Label ID=”lblYil” runat=”server”
Text=”Label”></asp:Label></td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td align=”right” >
<strong>Oyuncular</strong></td>
<td style=”width: 115px”>
<asp:Label ID=”lblOyuncular” runat=”server”></
asp:Label></td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td align=”right” >
<strong>Kategoriler</strong></td>
<td style=”width: 115px”>
<asp:PlaceHolder ID=”plKategoriler”
runat=”server”></asp:PlaceHolder>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td align=”right” >
<strong>Yönetmen</strong></td>
<td style=”width: 115px”>
DVDDukkani.com
<asp:Label ID=”lblYonetmen” runat=”server”
Text=”Label”></asp:Label>&nbsp;
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td >
</td>
<td style=”width: 115px”>
<asp:Label ID=”Label7” runat=”server”></asp:
Label>
<asp:PlaceHolder ID=”PlaceHolder3”
runat=”server”></asp:PlaceHolder>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td >
</td>
<td style=”width: 115px”>
<asp:Label ID=”Label8” runat=”server”></asp:
Label>
<asp:PlaceHolder ID=”PlaceHolder4”
runat=”server”></asp:PlaceHolder>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td >
</td>
<td style=”width: 115px”>
<asp:Label ID=”Label9” runat=”server”></asp:
Label>
<asp:PlaceHolder ID=”PlaceHolder5”
runat=”server”></asp:PlaceHolder>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td >
</td>
221
222
Proje 3
<td style=”width: 115px”>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td align=”right”>
<strong>
Adet</strong></td>
<td style=”width: 115px”>
<asp:TextBox ID=”txtAdet” runat=”server”
Width=”40px”></asp:TextBox></td>
<td style=”width: 100px”>
<asp:RequiredFieldValidator ID=”RequiredFieldVali
dator1” runat=”server” ControlToValidate=”txtAdet”
Display=”Dynamic” ErrorMessage=”Adet
Girmelisiniz” InitialValue=”0” SetFocusOnError=”True”>*</asp:
RequiredFieldValidator>
<asp:CompareValidator ID=”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>
<td style=”width: 115px”>
<asp:ImageButton ID=”ImageButton1” runat=”server”
ImageUrl=”~/Resimler/SepeteEkle.gif”
OnClick=”ImageButton1_Click” /></td>
<td style=”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.
DVDDukkani.com
Şekil 3.33: FilmDetay.aspx sayfası tasarımı.
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.
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString[“film”] == null)
{
Response.Redirect(“default.aspx”);
}
int filmId = 0;
int.TryParse(Request.QueryString[“film”], out filmId);
if (filmId > 0)
{
DvdDukkani.Entity.Film filmDetay = DvdDukkani.
DataLayer.Film.FilmDetay(filmId);
lblAd.Text = filmDetay.Adi;
lblAciklama.Text = filmDetay.Ozet;
imgAfis.ImageUrl = “Resimler/Afisler/” + filmDetay.
Afis;
lblYil.Text = filmDetay.Yil.ToString();
string oyuncular = DvdDukkani.DataLayer.FilmOyuncu.
FilmOyuncuGetir(filmId);
lblOyuncular.Text = oyuncular;
List<DvdDukkani.Entity.Kategori> kategoriler =
DvdDukkani.DataLayer.FilmKategori.FilmKategoriGetir(filmId);
foreach (DvdDukkani.Entity.Kategori k in kategoriler)
223
224
Proje 3
{
HyperLink hl = new HyperLink();
hl.ID = “hlKategori” + k.KategoriId;
hl.NavigateUrl = “~/Kategoridetay.aspx?Kategori=”
+ k.KategoriId;
hl.Text = k.Adi+”<br/>”;
plKategoriler.Controls.Add(hl);
}
string yonetmenler =DvdDukkani.DataLayer.FilmYonetmen.
FilmYonetmenGetir(filmId);
lblYonetmen.Text = yonetmenler;
}
}
SqlConnection cn = new SqlConnection(System.Web.Configuration.
WebConfigurationManager.ConnectionStrings[“DvdDukkaniConStr”].
ConnectionString);
protected void ImageButton1_Click(object sender,
ImageClickEventArgs e)
{
int filmId = 0;
int.TryParse(Request.QueryString[“film”], out filmId);
if (filmId > 0)
{
List<Urun> sepet = null;
if (Session[“sepet”] != null)
{
sepet = Session[“sepet”] as List<Urun>;
}
else
{
sepet = new List<Urun>();
}
SqlCommand cmd = new SqlCommand(“Select Top 1 ucret
from filmtipucret where filmId=@FilmId”,cn);
cmd.Parameters.AddWithValue(“@FilmId”, filmId);
cn.Open();
decimal birimFiyat = Convert.ToDecimal(cmd.
ExecuteScalar());
Urun u = new Urun();
u.FilmId = filmId;
DVDDukkani.com
u.FilmAdi = lblAd.Text;
u.Birimfiyat = birimFiyat;
bool varMi=false;
foreach(Urun urun in sepet)
{
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ı yapın.
225
226
Proje 3
<%@ Page Language=”C#” MasterPageFile=”~/ana.master”
AutoEventWireup=”true” CodeFile=”Bilgilerim.aspx.cs”
Inherits=”Bilgilerim” Title=”Untitled Page” %>
<asp:Content ID=”Content1” ContentPlaceHolderID=”ContentPlaceHold
er1” Runat=”Server”>
<table style=”width: 359px”>
<tr>
<td style=”width: 100px”>
İsim</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtIsim” runat=”server” Validati
onGroup=”Sayfa1”></asp:TextBox>
</td>
<td style=”width: 100px”>
<asp:RequiredFieldValidator ID=”rfvIsim”
runat=”server” ControlToValidate=”txtIsim”
ErrorMessage=”İsim Boş Geçilemez”
SetFocusOnError=”True” ValidationGroup=”Sayfa1”>*</asp:
RequiredFieldValidator>
</td>
</tr>
<tr style=”color: #666666”>
<td style=”width: 100px”>
Soyisim</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtSoyIsim” runat=”server” Valid
ationGroup=”Sayfa1”></asp:TextBox>
</td>
<td style=”width: 100px”>
<asp:RequiredFieldValidator ID=”rfvSoyisim”
runat=”server” ControlToValidate=”txtSoyIsim”
ErrorMessage=”Soyisim Boş Geçilemez”
SetFocusOnError=”True” ValidationGroup=”Sayfa1”>*</asp:
RequiredFieldValidator>
</td>
</tr>
<tr style=”color: #666666”>
<td style=”width: 100px”>
E-Mail</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtEMail” runat=”server” Validat
ionGroup=”Sayfa1”></asp:TextBox>
</td>
<td style=”width: 100px”>
<asp:RequiredFieldValidator ID=”rfvEMail”
runat=”server” ControlToValidate=”txtEMail”
DVDDukkani.com
Display=”Dynamic” ErrorMessage=”E-Mail Boş
Geçilemez” SetFocusOnError=”True”
ValidationGroup=”Sayfa1”>*</asp:
RequiredFieldValidator>
<asp:RegularExpressionValidator ID=”revEMail”
runat=”server” ControlToValidate=”txtEMail”
Display=”Dynamic” ErrorMessage=”Geçersiz bir
E-Mail girildi” SetFocusOnError=”True”
ValidationExpression=”\w+([-+.’]\w+)*@\
w+([-.]\w+)*\.\w+([-.]\w+)*” ValidationGroup=”Sayfa1”>*</asp:
RegularExpressionValidator>
</td>
</tr>
<tr style=”color: #666666”>
<td style=”width: 100px”>
Şifre</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtSifre” runat=”server”
TextMode=”Password” ValidationGroup=”Sayfa1”></asp:TextBox>
</td>
<td style=”width: 100px”>
<asp:RequiredFieldValidator ID=”rfvSifre”
runat=”server” ControlToValidate=”txtSifre”
ErrorMessage=”Şifre Boş Geçilemez”
SetFocusOnError=”True” ValidationGroup=”Sayfa1”>*</asp:
RequiredFieldValidator>
</td>
</tr>
<tr>
<td style=”width: 100px”>
Şifre (Tekrar)</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtSifreTekrar” runat=”server”
TextMode=”Password” ValidationGroup=”Sayfa1”></asp:TextBox>
</td>
<td style=”width: 100px”>
<asp:RequiredFieldValidator ID=”rfvSifreTekrar”
runat=”server” ControlToValidate=”txtSifreTekrar”
Display=”Dynamic” ErrorMessage=”Şifre (Tekrar)
Boş Geçilemez” SetFocusOnError=”True”
ValidationGroup=”Sayfa1”>*</asp:
RequiredFieldValidator>
<asp:CompareValidator ID=”cvSifre” runat=”server”
ControlToCompare=”txtSifre” ControlToValidate=”txtSifreTekrar”
Display=”Dynamic” ErrorMessage=”Şifre ile
Şifre (Tekrar) aynı olmalıdır” SetFocusOnError=”True”
227
228
Proje 3
ValidationGroup=”Sayfa1”>*</asp:
CompareValidator>
</td>
</tr>
<tr>
<td style=”width: 100px”>
Gizli Soru</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtGizliSoru” runat=”server”></
asp:TextBox>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
Gizli Cevap</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtGizliCevap” runat=”server”></
asp:TextBox>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
&nbsp;</td>
<td style=”width: 100px”>
</td>
</tr>
</table>
<br />
<table>
<tr>
<td style=”width: 100px”>
Açıklama</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtAciklama” runat=”server”></
asp:TextBox>
</td>
<td style=”width: 100px”>
</td>
</tr>
DVDDukkani.com
<tr>
<td style=”width: 100px”>
Adres</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtAdres” runat=”server”
Height=”100px” TextMode=”MultiLine”></asp:TextBox>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
Telefon</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtTelefon” runat=”server”></
asp:TextBox>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
Yedek Kişi</td>
<td style=”width: 100px”>
<asp:TextBox ID=”txtYedek” runat=”server”></asp:
TextBox>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
Ilce</td>
<td style=”width: 100px”>
<asp:DropDownList ID=”ddlIlce” runat=”server”>
</asp:DropDownList>
</td>
<td style=”width: 100px”>
</td>
</tr>
<tr>
<td style=”width: 100px”>
</td>
<td style=”width: 100px”>
229
230
Proje 3
&nbsp;<asp:LinkButton ID=”LinkButton1”
runat=”server” OnClick=”LinkButton1_Click1”>Güncelle</asp:
LinkButton></td>
<td style=”width: 100px”>
</td>
</tr>
</table>
<asp:UpdatePanel ID=”UpdatePanel1” runat=”server”>
<ContentTemplate>
<asp:Panel ID=”pnlIslem” runat=”server”
Visible=”false”>
&nbsp;&nbsp;<br />
<br />
<asp:Timer ID=”Timer1” runat=”server” Enabled=”False”
Interval=”1000” OnTick=”Timer1_Tick”>
</asp:Timer>
<asp:Label ID=”lblBilgi” runat=”server”
Text=”Label”></asp:Label><br />
<asp:Label ID=”lblSayac” runat=”server” FontBold=”True” Font-Size=”XX-Large” ForeColor=”Red”
Text=”5”></asp:Label></asp:Panel>
&nbsp;
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID=”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)
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
if (Request.QueryString[“EMail”] == null)
Response.Redirect(“Default.aspx”);
else
{
string email = Request.QueryString[“EMail”];
DVDDukkani.com
Şekil 3.34: Bilgilerim.aspx tasarım görünümü.
DvdDukkani.Entity.UyeAdres uyeadres = null;
DvdDukkani.Entity.Uye uye = DvdDukkani.DataLayer.
Uye.UyeBul(email, out uyeadres);
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();
}
}
void IlceGetir()
{
SqlCommand cmd = new SqlCommand(“Select * from Ilceler”,
cn);
DataTable dtIlce = new DataTable();
231
232
Proje 3
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dtIlce);
ddlIlce.DataSource = dtIlce;
ddlIlce.DataTextField = “Adi”;
ddlIlce.DataValueField = “IlceId”;
ddlIlce.DataBind();
}
protected void LinkButton1_Click(object sender, EventArgs e)
{
Response.Redirect(“Default.aspx”);
}
SqlConnection cn = new SqlConnection(WebConfigurationManager.
ConnectionStrings[“DvdDukkaniConStr”].ConnectionString);
protected void Timer1_Tick(object sender, EventArgs e)
{
lblSayac.Text = (Convert.ToInt32(lblSayac.Text) 1).ToString();
if (Convert.ToInt32(lblSayac.Text) <= 0)
Response.Redirect(“Default.aspx”);
}
protected void LinkButton1_Click1(object sender, EventArgs e)
{
DvdDukkani.Entity.Uye u = new DvdDukkani.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.UyeAdres ua = new DvdDukkani.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 = “5 saniye içerisinde anasayfaya
yönlendirileceksiniz!!!<br/><br/>”;
DVDDukkani.com
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 verebilecekleri 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.
233
A
Terimler
Sözlüğü
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 fonksiyon.
.NET Framework 2.0 Configuration aracı: .NET Framework tarafından sağlanan, uygulamaları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 kombinasyonu.
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 Accessories bölümüne kurulan bir uygulama grubu.
accessible design (erişilebilir tasarım): Uygulamanın farklı becerilere sahip engelli kişiler tarafı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 (atomiklik), consistency (tutarlılık), isolation (izolasyon) ve durability (dayanıklılık).
activation (etkinleştirme): Mesajlar kuyruğa yerleştirildiğinde stored procedure’lerin otomatik 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 meydana 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 kullanış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österir. 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 edilmesi.
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.)
238
Ek - A
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ıldığı 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 fonksiyonu kullanılarak bölümlendiğinde meydana gelir.
AppDomain: .NET’te AppDomain nesnesi, içinde uygulamaların çalıştırıldığı izole edilmiş bir uygulama 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 etmek ü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 sunucusudur.
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ç noktalarını içerir.
application state (uygulama durumu): Web uygulamasındaki tüm sayfalardan erişilebilen global 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).
Terimler Sözlüğü
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ğilse, 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 sadece 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ı kontrol etmez.
Asynchronous Programming Model: Belirli metotların asenkron çalıştırılmasını sağlamak üzere 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ı.
B
backup (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üklenebileceğ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.
239
240
Ek - A
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ştirmesi 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 engelleme 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 ayrı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çerik elde edildiğinden, oynatmanın daha pürüzsüz görünmesini sağlar.
Terimler Sözlüğü
bugs (hatalar): Hatalar veya eksik ya da yanlış işlevsellik biçiminde görünen uygulama sorunları.
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 toplu 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 sonuna 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 üzere 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çerliliği kontrolü tipi.
C
cache 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 bulunacak bir metoda gönderilen bir nesne. Asenkron programlama kullanılan programlama yöntemidir.
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 ikincisinin 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şturulduktan sonra bir veritabanında değiştirilen sayfaların bir listesi. Bu katalog, verilerin hangi sayfa-
241
242
Ek - A
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ütunları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 imzalanmış bir ifadedir.
channel (kanal): Bir iletişim kanalı, bir istemci uygulaması ve uzak nesneleri barındıran bir sunucu arasındaki iletişim için bir yol olarak hizmet eder. Dağıtık uygulama mimarisi içerisinde kullanı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 olmaksı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. ClickOnce 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 herhangi 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 anahtarı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 kodunuzu bir kural setine karşı gözden geçiren bir araç. Bu kurallar sürdürülebilirlik, okunabilirlik, globalizasyon 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-
Terimler Sözlüğü
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üzdesini tanımlayan bir ölçü. Kod kapsamı, test edilmekte olan uygulama kodu bölümünün ölçülebilir ş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 donanı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 nesnelerin 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.ComponentModel.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ç.
243
244
Ek - A
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 dosyası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 kullanabileceğ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 zaman 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 yeniden 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ı sunucu 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 sayfada 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.
Terimler Sözlüğü
continuous integration (devam eden entegrasyon): Test durumlarını geliştirilen ve kullanılabilir ç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ılabilen 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. Denetleyiciler 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 çalıştırılacak thread’leri zamanlamak için dahili olarak kullandığı süreç. Bu süreç, bir işlemci üzerinde bir seferde bir tek thread’in çalıştırılmasını sağlar ve kaynaklar üzerinde bellekte yer ayrılması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çekleş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 rapor 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ılandırıldığı kültür. Örneğin tr-TR
245
246
Ek - A
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şlevselliği kapsülleyen sunucu taraflı bir bileşen. Özel bir web sunucusu kontrolü, sizin oluşturduğunuz 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 kullanı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.
D
DAC: 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ürecinin 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şiklikler 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.
Terimler Sözlüğü
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 veritabanına karşı analiz eder.
Database Mail hesabı: SQL Server’ın Simple Mail Transfer Protocol (SMTP) sunucusuna e-posta 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 private 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 veritabanı 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ş durumunu 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ında 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 yedekten 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 veritabanı 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 izinler atamak için kendi veritabanı rollerinizi de oluşturabilirsiniz.
database schema (veritabanı şeması): Bir veritabanındaki ilişkili verilerin, verilerin nasıl depolandığı, 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.
247
248
Ek - A
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 tamponu.
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 talimatı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 standardı.
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ıkları 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 platformları 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.
Terimler Sözlüğü
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 fonksiyonu 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ı yedekleyen 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 reddedilmemesini 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ılabilecek 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.
249
250
Ek - A
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ı belirler 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 verileri 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 koordinasyonu 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.
E
edge 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 gereken 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 meydana 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 ihtiyacı 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önderilebilecek 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 uygulamalarının SQL Server örnekleri üzerinden mesaj göndermesini ve almasını sağlayan daha genel bir
Terimler Sözlüğü
SQL Server uç noktası için bir payload tipidir. Database mirroring için, database mirroring oturumuna 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 metodu. Bunlar, transaction’lar ve nesne havuzu gibi servislerden yararlanabilirler.
entity relationship diagram (varlık ilişkisi diyagramı): Bir varlık ilişkisi diyagramı (ER), veritabanları gibi ilişkisel sistemleri modellemek için kullanılan bir diyagramdır. ER diyagramları, genellikle 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, assembly 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ı tanı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. Birden fazla sayfa üzerinde bir tek kaynağı görüntülemek istediğiniz açık yerelleştirmeyi kullanmalı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 kontrolü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 kontrollere ö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.
251
252
Ek - A
extreme programming (aşırı programlama): Kısa dönemde teslim edilecek projelere ve tamamlanmamış 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.
F
Fagan Inspection: Michael Fagan tarafından tanıtılan ve bir kodun gözden geçirilmesinde nelerin ç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 dosyaları 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 exception tiplerinin yakalanmasını sağlamak üzere Catch koşullarının sıralanması süreci. Örneğin SqlException, 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 tekrarlanan 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 veritabanı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 yedeklemesini 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.)
Terimler Sözlüğü
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 veritabanı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.
G
garbage collection: Referans olmaktan çıkarılan öğelerin kaldırılması aracılığıyla heap’teki belleğ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 çevrilen 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çimlendirmesini 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 kullanılan bir sektör standardının uzantısı. Uygulamadaki verileri *.zip formatında sıkıştırmak için
kullanılır.
H
hash 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 durumunu kontrol etmesine izin veren bir metot. Metodun uygulaması, harici talepleri karşılamak için
gereken dahili kaynaklar üzerinde bir kontrolü içermelidir.
253
254
Ek - A
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 dosyaları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 SELECT ifadelerini uygulayabilirsiniz. Ayrıca indekslenemezler, yapıları değiştirilemez veya kendilerine 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ğunda, 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 örneklerini 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ı zamanda 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 stored 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 etkinleş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ü.
I
ILogFormatter arayüzü: Enterprise Library’nin Logging Application Block’u içindeki biçimlendiriciler tarafından kullanılan arayüzün adı.
IMessageFormatter arayüzü: .NET’te MessageQueque class’ı tarafından bir biçimlendirici olarak 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 atanmalıdır.
InstallException: Bir Installer class’ı tarafından fırlatılabilen bir exception Bir özel eylemde InstallException exception’ının fırlatılması, kurulumun geri alınmasına neden olacaktır.
Terimler Sözlüğü
Interop: Interoperation için bir kısaltma; managed ve unmanaged kodun birlikte çalışması anlamı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önderilmekte 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 özelliklerinin 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ı gerekiyorsa 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ğlamanı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şturulması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üzenleme süreci, indeks sayfalarını küçültürken, leaf node’ların mantıksal, soldan sağa sırasına eşlenmek ü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 bilgiler. 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ümkündür. Bu yapı, miras hiyerarşisi olarak bilinir.
inherited permission (miras alınan izin): Bir nesneye parent nesnesinden aktarılan izinler.
255
256
Ek - A
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ştirmek.
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ğırması 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 desearialize 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
J
jitter: 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 kullanmaktı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ırabilirsiniz. Örneğin her gün saat 15:00’te veritabanının yedeğinin alınması
Terimler Sözlüğü
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.
K
Kerberos: 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 fonksiyonların performansıyla ilişkilidir.
keyed hash algorithms (anahtarlı hash algoritmaları): Hem göndericinin, hem de alıcının sahip olması gereken gizli bir anahtarı kullanarak hash’in şifrelenmesi yoluyla hash’in değiştirilmesine karşı koruma sağlayan algoritmalar.
L
language 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 lease kullanılır. Bir lease, CLR (Common Language Runtime) garbage collector’ın (GC), uzak nesneye 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 kontrollere ö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-
257
258
Ek - A
ş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ı önerilmez.
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 geleceğ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ş bilgilerini depolayan bir log taşıma tablosu.
logging: Bir uygulamanın durumu, ilerleyişi ve sorunları hakkındaki bilgileri kalıcı bir veri deposuna yerleştirme süreci.
logical design (mantıksal tasarım): Bir sistemi tasarlamak amacıyla her bir farklı çalışma biriminin 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ğırdığında bir döngü meydana gelir.
M
machine.config dosyası: Microsoft .NET Framework tarafından kullanılan birincil konfigürasyon
bilgileri dosyası. machine.config dosyası, Microsoft Windows registry’ye benzer. Web.config dosyaları 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şturmaktan daha maliyetlidir. Bu yüzden, gelecekte bakımının yapılabilmesi için kodun açık ve okunabilir olması önemlidir.
maintenance job (bakım işi): Maintenance Plan Wizard’ın çıktısı olarak SQL Server Agent içinde oluşturulan bir iş.
Terimler Sözlüğü
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 sunucuda 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 şablon. İçerik sayfaları, tam bir sayfa oluşturmak için ContentPlaceHolder kontrollerini doldurur. Master 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 önerildiğ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ı sorunu.
MenuStrip: ToolStripMenuItem kontrollerini barındıracak şekilde özelleştirilmiş bir ToolStrip kontrolü.
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 kurtarıcı olacaktır ve mesaj kaybı olmayacaktır.
259
260
Ek - A
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 iletmek 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 sunucusu 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çeklenebilir performans sağlamak için gevşek şekilde eşlenmiş sistemleri kullanır. Kurulması, yapılandı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. Hedef 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 uygulamaların, geçici olarak çevrim dışı olabilecek heterojen ağlar ve sistemler üzerinden iletişim kurması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 kontrolü 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.
Terimler Sözlüğü
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 kullanı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 kaynak 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ınlanması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.
N
named instance (adlandırılmış örnek): Diğer adlandırılmış örneklerden ve aynı bilgisayar üzerindeki varsayılan örnekten ayırt edilmesini sağlamak üzere kendisine bir ad verilen bir SQL Server 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 tanı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.
261
262
Ek - A
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 bilgilerini 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 indeks 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 örnektir. (Bkz. deterministic function.)
nullable type: Nothing/null olarak değer atanabilen bir değer tipi.
O
object 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çebilirsiniz: 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 bildirim 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ğ.)
Terimler Sözlüğü
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.
P
padding (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 access 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ımlayan 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.
263
264
Ek - A
peer review (peer gözden geçirme): Resmi veya gayri resmi olarak bir kodun gözden geçirilmesine ç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ğlayarak, 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 benchmark, 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 Monitor 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ışmaya 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 izlenmesini sağlamak üzere işletim sistemine dahil edilen Windows uygulaması.
performance objects (performans nesneleri): Uygulama sunucusu üzerindeki işlemciler, diskler, 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 kaynakları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ından 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ı yedeklemesi 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).
Terimler Sözlüğü
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şkilendirilmiş 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ı uygulamalara 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 veritabanı. 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 sistem 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 imkan 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çümlerini izlemenin bir yoludur.
265
266
Ek - A
proof-of-concept prototype: Bir özelliğin, sistemin mimarisi boyunca tam bir uygulaması. Uygulamayı 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ından 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ı politikasını kullanır.
pull subscription: Distribution Agent veya Merge Agent’ın Distributor’da çalıştığı ve subscription’ı
Distributor’dan Subscriber’a çeken bir subscription.
Q
quality 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 ifadelerinin bir koleksiyonu.
queue (kuyruk): SQL Server içindeki, gönderilen veya alınan tüm mesajları içeren gizli bir tablo.
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ğ.
R
RAID: Redundant Array of Independent Disks. Yazılım aracılığıyla yapılandırılabilir veya bir donanı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 okuma performansını geliştirir ama yazma işlemlerinin performansını düşürebilir.
Terimler Sözlüğü
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 üzere 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ı nesnelerini (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ükleme seçeneklerini kontrol eder. Ayrıca, kurtarma amacıyla bir veritabanının altında çalıştığı modeldir.
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ılacak ayarlar ile engellenebilir.
reference architecture (referans mimari): Geliştirme ekibi için uygulamanın düşey yığını boyunca bir referans uygulaması sağlar. Geliştiricilere, kodlarını nasıl uygulamaları gerektiğini gösteren 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ılabilmesi 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 örneğ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ğırmanı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.
267
268
Ek - A
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 maksimum 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ı bilgilerinin 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.
S
sampling 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 temel faydası, şemaların ve kullanıcıların ayrılmasıdır.
Terimler Sözlüğü
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 kabartma 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 belirleyen 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 gereken 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ı elementleri tanımlayan XML verileri. Şema heterojendir ve ilişkisel bir yapı kullanılarak kolayca temsil 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 otomatik 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ı tarafı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.
269
270
Ek - A
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 becerisi.
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 sunucuları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 kaydettiğ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önetmek 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 özelliğ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 tarafı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 etmek için MIME ve SOAP’ın bir kombinasyonunu kullanan bir teknik.
Terimler Sözlüğü
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 veritabanı.
sparse file (seyrek dosya): Kendi yapısı içinde en az bir ayrılmamış yer bölgesini içeren bir dosya. 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 istemci 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 ortamlarıyla kullanılmak üzere tasarlanmış bir class kütüphanesi. SQL Server içindeki nesnelere programsal bir arayüz sağlar. Uygulamanıza referans olarak ekleyip veritabanı sunucu üzerinde programsal 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 üzerinde yürütülen sorguları, bu sorguların ne kadar sürede yürütüldüğü gibi performansa ait izlemelerin 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şkenlerden 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üncellendiğ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 sunucunun 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 veritabanı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.
271
272
Ek - A
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ı oynatmadan ö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, uygulanabilecek 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ırlatmayan 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 anahtarı kullanan bir şifreleme tekniği.
symmetric key (simetrik anahtar): Verileri kriptolamak ve şifreyi çözmek için kullanılan bir anahtar. 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.
Terimler Sözlüğü
System Monitor: Donanım, Windows alt sistemleri ve istatistiksel sayaçlar sunan diğer uygulamalar için performans sayaçlarını yakalamak üzere kullanılan, Windows’un sağladığı bir performans izleme aracı. System Monitor, PrefMon olarak da bilinir.
system process ID (SPID): Bir SQL Server sunucusuna her bağlantıyı benzersiz olarak tanımlayan bir sayı.
T
table (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 tarafı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ılabilir 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 yaklaşı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 koleksiyonlarda 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şarı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.
273
274
Ek - A
theme (tema): Kontroller için varsayılanları tanımlayan veya bir web uygulamasındaki tüm sayfalar 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 kullanı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 zamanı da taklit etmek isteyeceksiniz.
third-party control (third-party kontrol): Proje ekibi tarafından oluşturulmamış veya sağlanmamış 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 pencere.
ToolStrip: ToolStripItem’ları barındırmak için kullanılan ve kullanıcı tarafından çalışma zamanında kolayca yapılandırılabilen bir kontrol.
ToolStripItem: Bir ToolStrip içinde barındırılabilen kontrol. Bir menü öğesini veya ToolStrip içinde 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ı dosyaları 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 sonraki geri yükleme süreci meydana geldiğinde, commit edilmiş tüm transaction’ları geri yükler.
Terimler Sözlüğü
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 transaction 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 yerleş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 kullanı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 kullanı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ğrulanması.
typed XML data (yazılı XML verileri): Bir XML şema dosyasındaki deklarasyonlara göre yapılandırılmış bir XML belgesi veya parçası.
U
UMS: Bkz. User Mode Scheduler (UMS).
unboxing: Boxing meydana geldikten sonra, bir referans tipinden bir değer tipine geri dönüştürme.
Unicode: Dillerin (Latin, Kiril, İbrani, Arapça, Çince dahil olmak üzere) ve script’lerin çoğunu destekleyen, 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
275
276
Ek - A
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 testlerin 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 deklarasyonlara 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 kullanı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ından gerçekleştirilen işlem kipi. Kullanıcı kipi genellikle uygulamalar kullanıcı tarafından veya kullanı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 zamanlamaları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 zamanında okunur/yazılırdır.
Terimler Sözlüğü
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.
V
validation (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ürdürülebildiği mekanizma. Web sayfasında HTML (Hypertext Markup Language) olarak temsil edilemeyen 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.
W
wait 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 Protocol (SOAP) üzerinden veri transfer etmenizi sağlayan bir uygulama. Dağıtık uygulama mimarisinde farklı platformları ve uygulamaları birbirine bağlamayı sağlayan en kullanışlı yapıdır. Web Servislerinin herhangi bir sahibi olmadığı için hemen hemen her programlama dili desteklemektedir.
Web Services Description Language (WSDL): Bir web servisi metoduna tam olarak neyin girdiğini tanımlamak için kullanılan özelleştirilmiş bir XML grameri.
277
278
Ek - A
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 destekler.
web.config dosyası: ASP.NET uygulamaları için konfigürasyon ayarlarını depolamak üzere kullanı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ırken 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 varsayı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 girdilerinin 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 sayaç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.
Terimler Sözlüğü
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 farklı 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’ı kapsayan, gelişmekte olan web servisi standartlarının tümü için yaygın olarak kullanılan bir kısaltma.
WS-Attachments: Web servis taleplerine eklerin nasıl ekleneceğini tanımlayan bir standardın
adı.
X
XML (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şvurulmayacak ş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 temsili.
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öndürülecektir.
XQUERY: XML verilerini sorgulamak için kullanılan deklaratif bir programlama dilini tanımlayan
bir W3C (World Wide Web Consortium) spesifikasyonu.
279

Benzer belgeler

Web Tasarım ve Programlama Dersi Özeti 2013 PDF

Web Tasarım ve Programlama Dersi Özeti 2013 PDF Arka plan rengini belirler. Arka planda kullnılmak istenen resmi belirler. Sayfadaki linklerin rengini belirler. Linke tıklandığındaki rengi belirler. Daha önce ziyaret edilmiş linklerin rengini be...

Detaylı

: VB.net e-book part 2

: VB.net e-book part 2 Yayõna Hazõrlayan: Selçuk TÜZEL Grafik Uygulama: Zeynep ÇÖMLEKÇİ Kapak Tasarõmõ: Selim Şahin Baskõ: Lebib Yalkõn Şef Editör: Mehmet ÇÖMLEKÇİ

Detaylı