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;”> herkesburada.com <a id=”A1” href=”~/” runat=”Server”>Ana Sayfa</a> <span class=”Separator”>|</span> <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> </p> <p> <font style=”font-size: small; color: gray; fontfamily: Verdana”> Album ouşturun, arkadaşlarınız ile mesajlaşın, yeni arkadaşlar bulun, profil güncelleyin ve albumlere göz atın. </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> </center> <center> </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> </center> <center> herkesburada.com </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”> 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 /> <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> <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 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] FROM [Mesajlar] m Inner Join aspnet_Users a on a.UserId = m.Kime 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 FROM [Mesajlar] m Inner Join aspnet_Users a on a.UserId = m.Kimden WHERE ([Kime] = @Kime And AliciyaGosterme=’False’) ORDER BY OkunduMu,[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 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> <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”> </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> <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”> <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 ? :</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”> </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 /> <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”> <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 ON ArkadasListesi.Kimin = aspnet_Users.UserId WHERE ArkadasListesi.OnaylandiMi = ’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ı ? :</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> </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 /> <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 /> <asp:Label ID=”Label1” runat=”server” Text=”Album Adı : “></asp:Label> <asp:TextBox ID=”txtAlbum” runat=”server”></asp: TextBox> <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” /> <br /> İzin: <asp:DropDownList ID=”drpIzinler” runat=”server”> <asp:ListItem Selected=”True” Value=”False”>Herkes Görebilsin</asp:ListItem> herkesburada.com <asp:ListItem Value=”True”>Sadece Arkadaşlarım</asp: ListItem> </asp:DropDownList><br /> <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”> <br /> <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”> <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> <asp:RequiredFieldValidator ID=”RequiredFieldValidator1” runat=”server” ControlToVali date=”txtRumuz” ErrorMessage=”Boş Bırakmayın” ValidationGroup=”Ar ama”></asp:RequiredFieldValidator><br /> herkesburada.com <br /> Fotoğraf : <asp:CheckBox ID=”chcSadeceFotografli” runat=”server” Text=”Sadece Fotoğraflı” /> <br /> Aranacak Alan: <asp:CheckBox ID=”chcAdSoyad” runat=”server” Text=”Adı ve Soyadını da ara” /><br /> Cinsiyet : <asp:DropDownList ID=”drpCinsiyet” runat=”server”> <asp:ListItem Value=”True”>Bay</asp:ListItem> <asp:ListItem Value=”False”>Bayan</asp:ListItem> </asp:DropDownList> <br /> Online : <asp:DropDownList ID=”drpDurum” runat=”server”> <asp:ListItem Value=”false”>Tü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”> <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 /> <asp:Button ID=”btnAra” runat=”server” OnClick=”btnAra_ Click” Text=”Ara” /></fieldset> 99 100 Proje 1 <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=”Üye Yönetimi” Value=”Mesajlarım”> <asp:MenuItem NavigateUrl=”~/Admin/uyeler.aspx” Text=”Üyeler” Value=”Üyeler”> </asp:MenuItem> <asp:MenuItem NavigateUrl=”~/Admin/albumler.aspx” Text=”Albümler” Value=”Albü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üzenle” InsertText=”Ekle” SelectText=”Seç” ShowDeleteButton=”True” ShowEditButton=”True” UpdateText=”Gü 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ı<div id=”slogan”> Eğer bizde bir film yok ise daha o film çekilmemiş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” /> <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 © 2007 Dvd Dukkanı</ 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> </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”> </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 <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”> <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> </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
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...
: 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Çİ