oozturk.net

.net, sql, visual studio, windows gibi konular hakkında... Yazarım, çizerim...

Abstract Class vs Interface

clock November 13, 2008 04:23 by author oozturk

  Nesne tabanlı programlama (object oriented programming) yaparken, hazırladığımız classlar için base classlar hazarlarız. Bunu yaparken normal class, abstract class, interface kullanırız. Peki hangisi ne işe yarar, hangisini hangi durumlarda kullanmalı?

  Öncelikle abstract class ve interface için şunu söyleyebiliriz; direk olarak değişken yaratamayız bunlardan. Tamamen tanım amaçlı yazıldıkları için, normal class gibi kullanılamazlar. Haliyle eğer değişkene atayıp (instance) kullanmak istiyorsak taban class'ımızı mutlaka bu seçenekler arasından normal class'ı seçmeliyiz.

   Abstract class ile interface karşılaştırması yapmak istersen öncelikle söyleyebileceğimiz bazı farklar var aralarında. Abstract classlar; abstract metodlar (methods), abstract özellikler (properties) gibi diğer üyeleri de barındırabilirler. (Tıpkı normal classlar gibi). Interfaceler ise; Zaten abstract ya da public kelimelerini kullanmamıza gerek kalmadan, içinde tanımladığımız bütün metodları ve özellikleri public ve abstract olarak taşırlar. Yani başka bir şansımız zaten yoktur. Örnek olarak aşağıdaki koda bakalım.

//Abstarct Class

public abstract class Vehicles {

        private int noOfWheel;

        private string color;

        public abstract string Engine {

            get;

            set;

        }

        public abstract void Accelerator();

      }

      //Interface

public interface Vehicles {

        string Engine {

            get;

            set;

        }

        void Accelerator();

      }

  Gördüğümüz gibi abstract classlarda özellikleri ve diğer üyeleri private olarak da tanımlayabildiğimiz gibi aynı zaman da metodları da implemente de edebiliyoruz. Esasen abstract class için gerçek dünyada kullandığmız varlıklar için daha bir tanımlayıcı bakışa sahip olduklarını ancak interfacelerin çok daha tanımlayıcı amaçla kullanıldıklarını söyleyebiliriz. Varlıklar hakkında konuşabileceğimiz iki temel konu vardır. Birincisi maksat, ikincisi ise uygulamadır. Maksat derken buradaki kasıt; durum ve davranıştır, nasıl göründüğü ya da nasıl çalıştığı değil (belki birazcık bilinebilir ama tam denilemez). Uygulama derken de; uygulanırken ki durumu (yani gerçek durumu) ve davranışıdır.

   Biraz teoriden sıyrılıp, bir örnek üzerinden bakalım konuya.

  Bir CMS düşünelim (Content Management System - İçerik Yönetim Sistemi). İçerik; makale, blog ve eleştiriler olsun. Demek ki bu üç farklı şeyin bir ortak noktası var temel olarak o da üçünün de içerik olması. Icerik bizim tabanımız olacak demek ki. Peki Icerik, normal class mı, abstract class mı yoksa interface mi olmalı? Düşündüğümüz iş mantığı (business logic) çerçevesinden bakınca eğer Icerik uygulamanın temel varlığı olmayacak ve kullanılacak bir nesne olmayacaksa - ki bu örnek bu cümleye uyuyor çünkü bu uygulama da temel varlıklar makale, blog ve eleştirilerdir - ; o zaman normal class yapmamalıdır. Geriye abstract class ve interface kalıyor.

  Bu uygulama da her içeriğin yayınlanabilmesi gerekiyor. Haliyle, Icerik tanımının mutlaka içinde bir "yayınla" komutuna ihtiyacı vardır, bu durumda Icerik tanımını mutlaka abstract class olarak yapmak gerekir. Eğer iş mantığımda her içeriğin varsayılan ortak komutu olmasaydı (yayınla komutu mesela), o zaman abstract class'a gerek kalmazdı ve interface de kullanabilrdim. Bunlar normal class, abstract class ve interface arasında seçim yapılacağı zaman en temel farklar oluyorlar. Ama şu gerçeği unutmamak lazım ki, üzerinde konuştuğumuz şey yazılım ve değişmeyen tekşey zaten değişimin ta kendisi. Mesela eğer Icerik tanımını interface olarak yapsaydım, değişiklik yapmam zorlaşırdı. Icerik de yaptığım her değişikliği aynen, Icerikten türettiğim bütün nesnelere yansıtmak zorunda kalacaktım. Bunun üstesinden Icerik'i abstract class olarak tanımlayarak gelebiliyorum ancak unutmamak gereken bir tek durum dışında; çoklu miras (multiple inheritance). Interface ve abstract classları ayıran bir değer fark da CAN-DO (yapabilir) ve IS-A (böyledir) bağlantılarıdır. Az evvel bahsettiğim gibi interface'i çoklu miras için kullanabiliyoruz. Misal olarak bir de kopyalama davranışı veren "ICopy" adında bir interface'imiz olsun ki bu da genelleştirme ve uzmanlaştırma, özelleştirme durumu için bir IS-A bağlantısıdır. Yani türemiş bütün nesneler kendi kopyalama davranışlarına sahip olmak zorunda kalırlar. Eğer makale tanımı; abstract class olan Icerik'ten ve interface olan ICopy'den türerse bu da makale nesnesinin kopyalama yapabildiğini gösterir ki bu da CAN-DO'dur.

  Biraz teorik olarak biraz pratik desteğiyle konuyu derinlemesine anlatmaya çalıştım. Konuyu toparlamak gerekirse; abstract class, temel kimliği tanımlar. Bence abstract class günü kurtarır ve hızlıca devam edebilmeyi sağlar yani interface bence daha dikkatli kullanım ve yavaşlık getirir, gerektirir. Tabi daha önce de belirttiğim gibi interface'in en büyük avantajı ve abstract class'tan farkı çoklu miras (multiple inheritance)'dır.

  İyi çalışmalar dilerim.

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Masterpage ile UICulture ve Culture değerlerinin doğru kullanılası ve dropdown ile seçim imkanı sağlanması

clock October 28, 2008 19:39 by author oozturk

Merhaba,

Herkesin farklı asp.net işleri için seçtiği farklı yöntemler vardır. Bunlardan bir tanesi de masterpage kullanarak sitede değişmeyen çoğu yerin bir sefer hazırlanması ve bu alanlardaki değişikliklerin tek yerden yapılmasının sağlanmasıdır. Bu durumda sitenin bazı içeriği haliyle sabit olacaktır ve birden fazla dil kullanılıyorsa bu dil seçiminin sayfadan yapılıyor olması çok karın ağrıtıcı bir durum oluşturabilir. Mesela sayfayı ilk defa açan birine açtığı sayfayı kendi dilinde açmak istiyorsak, bu işi her sayfada kontrol etmek istemeyiz (Aslında bu durumda Page control'ünden bir başka class yaratarak da sorun çözülebilir ancak şimdi yazacağım gibi bir çözümü de var.) ve haliyle bunu da masterpage üzerinden çözme yoluna gitmek isteyebiliriz. Masterpageler sayfa olmadığı için bu iş biraz karmaşıklaşıyor.

Aşağıya yazacaklarımı adım adım yaparsanız, sonucunuz benimkiyle aynı olacaktır. 

1. Bir boş asp.net projesi açalım ve Site1.Master ve WebForm1.aspx dosyalarını ekleyelim.

2. App_LocalResources klasörünü açtığımız projenin üstüne sağ tıkladığımızda çıkan menüden Add -> Add Asp.net folder sekmesinden ekleyelim.

3. Aynı şekilde bir de App_GlobalResources klasörünü ekleyelim.

4. App_GlobalResources klasörünün altına bir resource dosyası ekleyelim ve adını Resouce1.resx koyalım.

5. Resource1.resx dosyasının üstüne iki kere tıklayarak açalım ve açılan pencere vasıtasıyla bir satır string ekleyelim. Name değeri olarak DefaultLang koyalım, değer olarak da tr yazalım.

6. Site1.Master dosyasının içine (contentplaceholder içine değil, direk olacak kendi içine); Dropdownlist (drpLang) ekleyip iki de item ekleyelim (Biri Türkçe olsun ve değeri tr olsun, öbürü de English olsun ve değeri en olsun), Label (Label1) ve son olarak da Button (Button1) ekleyelim.

7. WebForm1.aspx içine ise; Calendar (Calendar1) ve  Button (Button2) ekleyelim.

8. Site1.Master ve WebForm1.aspx adıyla eklediğimiz dosyaların design pencerelerini sırayla açarak Tools -> General local resources komutunu çalıştırarak App_Localresources klasörünün altına resource dosyalarının eklenmesini sağlayalım.

9. Site1.Master.resx ve WebForm1.aspx.resx dosyalarını sağ kulakçık ile önce copy sonra App_LocalResources klasörüne paste edelim. Bu sayede Aynı dosya için ikişer tane resource dosyası elde etmiş olacağız. Yeni eklenen 'Copy of' ile başlayan dosyaların adlarını

 - Site1.Master.en.resx

 - WebForm1.aspx.en.resx

olarak değiştirelim. Daha sonra bu uzantısından önce en yazan dosyaların içlerini açıp yazan yazıları ingilizce olarak yazalım ve ilk yarattığımız Site1.Master.resx ve WebForm1.aspx.resx dosyalarının içeriklerini de türkçeleştirelim.

10. Projeye bir class ekleyelim ve içine şunları yazalım.

using System;

using System.Web;

using System.Threading;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Globalization;

 

namespace Projeadı {

public class BaseWebPage : Page {

protected override void InitializeCulture() {

string lang = string.Empty;//default to the invariant culture

HttpCookie cookie = Request.Cookies["SelLang"];if (cookie != null && cookie.Value != null) {

lang = cookie.Value;

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);

}

base.InitializeCulture();

}

}

}

11. WebForm1.aspx dosyamızı bu yarattığımız BaseWebPage class'ından türemesi için kodundaki : Page yerine :BaseWebPage yazalım.

12. Masterpage'imizin koduna da aşağıdaki kodu koyalım. (Kontrol adları için siz kendinize göre değişiklikler yapın.)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace globalwebtemp1{

public partial class Site1 : System.Web.UI.MasterPage {

protected override void OnInit(EventArgs e) {

base.OnInit(e);

HttpCookie cookie = Request.Cookies["SelLang"];

if (cookie != null)

if (cookie.Value != null)

drplang.SelectedValue = cookie.Value;

else

setdefaultlang();

else

setdefaultlang();

}

private void setdefaultlang() {setlang(Resources.Resource1.DefaultLang, true);

}

private void setlang(string lang, bool refresh) {

HttpCookie cookie = new HttpCookie("SelLang");cookie.Expires = DateTime.MaxValue;

cookie.Value = lang;

Response.SetCookie(cookie);

if(refresh)

Response.Redirect(Request.Path); // this is for refreshing the requested page.

}

protected void Page_Load(object sender, EventArgs e) {

}

protected void drplang_SelectedIndexChanged(object sender, EventArgs e) {setlang(drplang.SelectedValue, true);

}

}

}

İşte bu kadar. Şimdi denediğinizde herşey doğru dilde görülüyor olacak. Masterpage'in kodunda bulunan cookie.Expires = DateTime.MaxValue değerini kaldırarak her girişte kullanılan browser'ın öntanımlı dil değerinin okunmasını sağlayabilirsiniz.

 

Tabii yukarıda da belirttiğim gibi bu sorunu çözmenin birden fazla yolu var ve yapılabileceklerin sınırı yok, ihtiyaca göre birçok şey eklenip çıkartılabilir. Ben bu yazıda yalnızca bu konuda yardığı olanlar için bir fikir vermeye çalıştım.

Umarım yardımcı olabilimişimdir. Her zaman ki gibi sorunlarınız olursa e-posta atarsanız, mümkün olan en kısa zamanda cevaplarım.

İyi çalışmaları dilerim.

Currently rated 4.7 by 3 people

  • Currently 4.666667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


MS SQL 2005 veya MS SQL 2008'de yeni eklediğim satırın id'sini nasıl alırım, bu konuda hangi komut hangi durumda kullanılmalı?

clock October 25, 2008 09:44 by author oozturk

Merhaba,

Uzun zamandır yazı yazmaya fırsatım olmuyordu, hazır zamanım varken birşeyler karalayayım dedim. Bugün maillarıma bakarken bir arkadaşım sormuş bu sorunu, ben de hazır cevap verecekken buraya yazayım dedim.

Önce kullanılabilecek komutlara ismen bakalım, sonra ne zaman ve nerelerde kullanılabileceklerine bakarız;

- @@Identity

- Ident_Current('tabloadı')

- Scope_Identity()

- Sequence

 

@@Identity

Bu komut o esnada kullanılan veritabanına herhangi bir kullanıcı tarafından, herhangi bir yolla (hatta trigger kullanıyorsanız buna triggerlar da dahil olmak üzere) en son eklenmiş olan Id'yi getirir. Kullanımında çok dikkatli olmak ve ne yaptığını çok iyi biliyor olmak gerekir. Bazı bulk copy durumlarında bir sefere mahsus olarak null'da dönebilir bu değer, bununla alakalı yazıyı da www.microsoft.com adresinde bulabilirsiniz.

 

Ident_Current('tabloadı')

@@Identity'den farklı olarak bu sefer mevcut tablo için yine herhangi bir kullanıcı, session, yol ile yaratılmış en son kaydın Id'si alınabilir.

 

Scope_Identity()

Bu komut ile mevcut bağlantı ile mevcut scope da mevcut kullanıcının herhangi bir tabloya, herhangi bir yolla eklediği en son kaydın Id'si alınabilir.

Misal vermek gerekirse:

- Bir stored procedure hazırlamış olalım ve 3 farklı tabloya 3 farklı kayıt yaratmış olalım. Bu kayıtlardan en son hangsini yarattıysak onun Id'sini Select sope_identity() ile alabiliriz. Sonra bu eklediğimiz satıra bağlı olarak ekleyeceğimiz ya da değiştireceğimiz satırları bu değerle güncelleyebilir, ekleyebiliriz.

 

Sequence

Bu komut zaten diğer SQL serverlarda mevcut idi, MS SQL'e 2005 versiyonunda eklendi. rakamsal değerlere sahip Id kolonu kullandığımızda, yeni bir satır ekleyeceğimiz zaman bu komutu çağırıp mevzu bahis tablo için bir önceki kayıttan sonraki değer'i alabiliriz. Bu sayede alacağımız değer bize ait olacağı için aynı anda başka bir komut ile aynı işlem denendiğinde aynı değer verilemeyecek ve çakışma önlenmiş olacaktır. Bu komutun geri dönüşü olmadığı için herhangi bir sebepten tabloya yazamamış ya da yazmamış olursak yine de o Id değeri alınmış ve artık kullanılamaz olmuş olur.

Bu komut ile alakalı daha fazla bilgi için yine www.microsoft.com adresine bakılabilir.

Misal vermek gerekirse:

- Bir programımız var ve birden fazla kullanıcısı var diyelim ve kullanıcılardan birden fazlası aynı anda aynı işlemi yaptığında satır eklemesi yapılacak olsun, satır eklenecek olan tablodaki son Id değeri de 2 olsun. Sequence kullandığımız için birine Id olarak 3 diğerine 4 verilecektir.

 

İyi çalışmalar dilerim.

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Asp.net web service'i class library ile kullanmak (Could not find default endpoint element that references contract)

clock August 5, 2008 18:21 by author oozturk

Merhaba,

N-tier bir uygulama geliştiriyorsunuz ve haklı olarak kullanacağınız class libraryler var. Hatta bu class libraryler ile web servicelerine ulaşmak istiyorsunuz ama bunu .net 3+ ile yapıyor olduğunuz için web reference olarak değil de web service olarak projenize eklemek ve kullanmak istiyorsunuz (SoapClient kullanmak istiyorsunuz yani). Netice de class library'nizi bir windows application'a bağladınız diyelim. Solution'ınızı compile ediyorsunuz ve hiç sorun yok, işte o an geldi, artık çalıştırma zamanı... Çalıştırıyorsunuz ve işte o hiç beklemediğiniz hata tam da karşınızda duruyor "Could not find default endpoint element that references contract...".

Hiç uğraşmayın ben 3 saat kadar aradım internette sonucunu bulamadım (belki iyi bir google aramasında 30. sayfada vardır çözümü, o kadar bakmadım ne yalan söyleyeyim...) Çözüm işte burda :-)

 

Web service'inizi gösterdiğiniz class library projenizin içinde bir app.config dosyası bulunuyor, bu dosyanın içerisinde de eklediğiniz web service ile alakalı satırlar var. İşte bu satırları kopyalayıp, class library'nizi reference olarak eklediğiniz windows application project'iniz varya, onun içindeki app.config dosyasının içine yapıştırıyorsunuz.

 

 

Bitti... Çözüm bu kadar basit :-)

 

Umarım yardımcı olabilmişimdir bu yazıyı okuyanlara. Eğer karşılaştığınız sorunlar olursa mail atarsanız en kısa zamanda cevaplarım :-)

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


ASP.NET uygulamalarında klasörlere her kullanıcının ulaşmasını engellemeyi ve yalnızca istenilen kullanıcıların ulaşmasını nasıl sağlarım?

clock July 30, 2008 16:43 by author oozturk

Merhaba,

web.config dosyası bildiğiniz gibi asp.net ayarlarımızı sakladığımız dosyadır. Bu dosya alt klasörlerde de yine bazı ayarlar için kullanılır. Mesela admin diye bir klasörümüz var ve yalnızca yönetici haklarını sahip kullanıcı(lar)ın erişebilmesini istiyoruz. Bunun için ne yapabiliriz?

Cevap çok kolay, önce ASP.NET Cofiguration'ı kullanarak bir rol ekleriz mesela Yonetici olsun yaratacağımız rolun adı. Admin klasörümüzün içine bir web.config dosyası yaratırız ve içine configuration düğümünün altına aşağıdaki kodu ekleriz.

<system.web>

<authorization>

<
allow roles="Yonetici"/>

<deny users="*"/>

<deny users="?"/>

</authorization>

</system.web>

 

Tabii yukarıda ki kod içerisinde yer alan Yonetici yerine herhangi birşey olabilir, yukarıda belirttiğim gibi bu örnekte misalen kullandım Yonetici kelimesini.

Burada '?' harfi login olmamış kullanıcıları gösterir, yani mesela ziyaretçileri. deny users="?" dediğimizde login olmamış kullanıcıları kabul etme demiş oluyoruz. Aynı şeyi '*' için de yazmıştık, bu da login olmuş ancak tanımladığımız Yonetici rolüne üye olmayan diğer kullanıcıları simgeliyor. Tahmin edeceğiniz gibi onlarında girmelerini istemediğimiz için deny komutuyla diğer kullanıcıların da bu klasördeki sayfa ya da diğer kaynaklara ulaşmalarını engellemiş olduk.

Bu arada eğer kök klasörümüzde bulunan ana web.config dosyamızda eğer authentication düğümü özelliklerine loginUrl belirttiysek, bu klasöre erişme hakkı olmayan bir kullanıcı o sayfaya yönlendirilip login olması istenebilir.

Sayfa bazında da engellemek mümkün kullanıcıları, onu da başka yazıda anlatacağım.

Umarım işinize yazar efendim. Smile

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Vista üzerinde Visual Studio 2005 veya Visual Studio 2008 ile ASP.NET projelerini debug ederken internet explorer sayfayı gösteremiyor hatası çözümü

clock July 30, 2008 15:45 by author oozturk

Merhaba,

Vista 64 bit kullanıyorum şu anda, daha önce aynı problemi 32 bit Vista ile de yaşamıştım. Ne zaman F5 tuşuna bassam ya da ASP.NET Configuration'a ulaşmaya çalışsam aynı gıcık hata, Internet explorer sayfayı gösteremiyor...

Vista IPv6 desteği de veriyor bildiğiniz gibi. Sorun, IPv6 ayarı yüzünden bilgisayarın kendisini bulamaması resmen...

Çözüm çok kolay ve bilgisayarı kapatıp açmaya da gerek yok, C:\Windows\System32\Drivers\etc\hosts dosyasını açıp ::1 yazan satırı comment ediyoruz (başına # koyuyoruz satırın yani). Bu işlemi administrator yetkileriyle açtığımız notepad ile yapabiliriz mesela, kaydedip kapatıyoruz. Visual Studio'nun o an açmış olduğu ASP.NET Developmenet Server ları kapatıyoruz ve tekrar F5 diyoruz ya da ASP.NET Configuration açıyoruz (hangisi lazımsa onu açmamız yeterli). İşte bu kadar.

 

İyi çalışmalar dilerim efendim. :-)

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


ASP.NET sayfalarında Ajax kullanıldığında bozulan türkçe karakterlerin düzeltilmesi ne kadar zor olabilir ki?

clock July 28, 2008 13:27 by author oozturk

Merhaba,

Zaten çalışan bir web sitesini ajax ile çalışabilmesi için gerekli değişiklikleri yapıyordum, işi bitirdim dedim ve test etmeye başladım, yazı yazdığım yerler sayfada bir callback yapıldığında türkçe karakterlerin sorun çıkarttığını gördüm. Sorunu çözmek için response ve request encoding ayarlarının türkçeye ayarlanması gerekiyor. UTF ayarlarından kaynaklanıyor sanırım bu sorun.

Çözüm için aşağıdaki kodu system.web'in altına koydum ve sorunu çözdüm, tavsiye ederim.

<globalization

requestEncoding="utf-8"

responseEncoding="utf-8"

fileEncoding="Windows-1254"

responseHeaderEncoding="Windows-1254"

/>

Umarım yardımcı olabilmişimdir.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


ASP.NET 2.0 uygulama servislerini SQL veritabanı kullanması için ayarlamak ne kadar zor olabilir ki?

clock July 28, 2008 10:05 by author oozturk

İlk asp.net uygulamamı geliştirmeye başladığımda login nesnelerini görünce asp yazarken uğraştığım gibi uğraşmayayım diye kullanmak istemiştim ama zaten bir veritabanım vardı sql'de ve onu kullanmak istiyordum. Nasıl ayarlayacağımı ararken çözümü yine www.asp.net sitesinde buldum. Bir de ben yazayım dedim, aşağıda adım adım nasıl yapılacağını bulabilirsiniz.

Peki bu asp.net 2.0 servisleri nedir, neleri kapsar?

Üyelerin kullanıcı adı/şifre ve diğer detaylarının saklanıp yönetilmesine yarayan, haklarının ayarlanıp kullanılmasını sağlayan membership api, kullanıcı rollerinin ayarlandığı role api, siteyi ziyaret eden anonim ya da kayıtlı kullanıcıların bazı detaylarının takip edilebilindiği profile api, web parts gibi uyarlanabilir kontrollerin ayarlarının yönetildiği personalization api, site hiyerarşisinin yönetimi ve kontroller ile kullanılmasını sağlayan site navigation api ve sitenin durumu ve oluşan hataları hakkında da health monitoring api asp.net 2.0 servisleri kapsamıdır.

Eğer veritabanınızı bir dosya olarak saklayıp kullanmak istiyor, sql server üzerinde tutmayı planlamıyor ve/veya kullanmak istediğiniz bir veritabanınız yoksa, sizin için bir tane yaratılıyor ancak aksi durumlarda istediğiniz koşullara göre bu değişkenleri ayarlamanız gerekiyor.

SQL server üzerinde zaten varolan veritabanınızı ya da yeni yaratacağınız veritabanını ayarlamak için aşağıdaki adımları izlemelisiniz.

1. Eğer veritabanınız yoksa boş bir veritabanı yaratın, varsa ikinci adıma geçin.

2. C:\Windows\Microsoft.NET\Framework\V2.0 ile başlayan bir dizin var bilgisayrınızda onun içindeki aspnet_regsql.exe komutunu çalıştırın ve adımları aşağıdaki resimlerdeki gibi takip edin.

Bu adımlarla sql veritabanımızı hazırlamış oluyoruz. Şimdi asp.net uygulamamızı bu sql veritabanını kullanacak şekilde ayarlamalıyız.

Visual studio ya da notepad gibi bir editör aracılığıyla uygulamanın kök klasöründeki web.config dosyasının içindeki <configuration> düğümünün altına gerekli satırları ekliyoruz, bunu yaptığımızda aşağıdaki gibi bir görüntü çıkacak ortaya.

<connectionStrings>

<clear/>

<
add name="BaseSQL" connectionString="Data Source=zokkanlaplup\sqlexpress;Initial Catalog=SinemaSeysi;user ID=sinemausr;password=deneme" providerName="System.Data.SqlClient"/>

</connectionStrings>

Artık istediğimiz sql veritabanını raatlıkla kullanabiliriz. Tabii role, membership, navigation, vb... gibi kontrol ve komutlar için başka ayarlar da gerekmektedir.

Membership Provider ayarları

Kendi tanımlayacağımız providerları kullanacağımız zaman öncelike sistem tarafından ön tanımlanmış diğer providerların silinmesini tavsiye ediyorum bu sebeple aşağıdaki kod örneklerinde <clear/> komutunu kullanacağız.

<membership defaultProvider="SinMembershipProvider">

<providers><

clear/>

<add name="SinMembershipProvider" connectionStringName="BaseSQL" applicationName="/"

type="System.Web.Security.SqlMembershipProvider" />

</providers>

</membership>

Yukarıdaki kodu system.web düğümünün altına yerleştirdiğimizde artık membership ayarlarımız, yukarıda tanımladığımız SQL veritabanından kullanılacak.

Role Provider ayarları

Membership ile aynı mantıkla yine system.web düğümünün altına aşağıdaki kodu koyduğumuzda, role ayarlarımız da hazırladığımız SQL veritabanından çalışıyor olacak.

<roleManager enabled="true" defaultProvider="SinRoleProvider">

<providers><

clear />

<add applicationName="/" connectionStringName="SinSQL" name="SinRoleProvider"

type="System.Web.Security.SqlRoleProvider" />

</providers>

</roleManager>

Bu arada eğer uygulamamız internette çalışacaksa aşağıdaki ayarları da yine system.web düğümünün altına yerleştirmemiz gerekmektedir.

<authentication mode="Forms" >

<forms loginUrl="login.aspx"

name=".aspnetauth" />

</authentication>

tabii login.aspx yerine ve .aspnetauth yerine dilediğimiz değişkenleri kullanabiliriz. Bir de son olarak eğer bu kodları elle yazıyorsanız en çok dikkat etmeniz gereken şey küçük - büyük harflerin tam doğru yazılmasıdır! Yoksa neden çalışmadığını arar durursunuz benim gibi :-)

Umarım yardımcı olabilmişimdir, iyi çalışmalar dilerim herkese.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


C# ile Directx 9 kullanarak video oynatmak ne kadar zor olabilir ki?

clock July 27, 2008 17:49 by author oozturk

DirectX 9 sdk'yı www.microsoft.com sitesinden çektim ve bilgisayarıma kurdum. Yapmam gerektiği gibi c# projemin referanslarına Microsoft.DirectX.AudioVideoPlayback namespace'ini ekledim. Form1 adındaki form'un üstünde panel1 diye bir panel yarattım. Bir video dosyasını denemek için c:\ klasörüne koydum ve oynatmasını istediğim bu dosyayı gösterdim. Start debugging deyince hata alınca dünyam başıma yıkıldı tabii. İnternette ara dur, msdn.microsoft.com'da hatta forumlarda çözüm ara, yok... Olmuyor... Visual Studio 2008 ve .Net 3.5 ile dünyayı baştan yazarım diye düşünüyorken karşılaştığım sorun beni çileden çıkartmaya yetmişken bir de çözüm bulamamak iyice delirtti beni.

Yazdığım kod şuydu:

using Microsoft.DirectX.AudioVideoPlayback;

private void button1_Click(object sender, EventArgs e)

{

try

{

Video v = new Video("c:\\black0.avi");

v.Owner = panel1;

v.Size = panel1.Size;

//v.Size = v.DefaultSize;

//v.Fullscreen = true;

v.Play();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

Bakınca hiç hata görünmüyor halbu ki. Sorunu biraz daha deşince ve önerilen çözümleri beraber deneyince bir çözüm ürettim.

İşletim sistemim 64 bit ama directx kütüphanesinin 32 bit olması yüzünden önce configuration manager'dan bir x86 profili oluşturmam gerekiyormuş. Ama esas konu bu da değil, 'loader lock' hatası alıyordum, release alıp da exe dosyasını çalıştırınca hatasız çalışıyorken debug esnasında hata vermesinin sebebi nedir onu bulmam gerekiyordu. Sorun MDA (Managed Debugging Assistant)'da hata varmış ve microsoft bu hatanın farkında olduğunu ve sorunu gidermek için üzerinde çalışacaklarını duyurmuş. Bu sebeple Debug mensünden Exceptions komutunu çalıştırıp MDA nodundan loader lock seçeneği için thrown işaretini kaldırmam gerekiyormuş. Bunun da sebebi DirectX kütüphanesinin .Net 1.1 runtime versiyonuna sahip olması bu arada.

Sonunda bu şekilde sorunu çözmüş oldum. Visual Studio 2005 veya Visual Studio 2008 ile video ya da audio oynatmak istiyorsanız, sorununuzu bu şekilde çözebilirsiniz.

Not: Oynatacağınız audio ya da video için codeclerin programın çalışacağı bilgisayarda da yüklü olması gerekiyor, DirectX için ise redistributable paketini kuruluma eklemeniz gerekiyor.

Eh ben sorunumu çözdüm, darısı başınıza.

 

Referanslar:

http://www.thezbuffer.com/articles/304.aspx

http://msdn.microsoft.com/tr-tr/directx/default(en-us).aspx

http://msdn.microsoft.com/en-us/library/bb324497(VS.85).aspx#dx_avp_playing_a_video_file

http://msdn.microsoft.com/en-us/library/ms172219.aspx

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


ASP.NET Web Page Code Model, hangisini seçmeli?

clock July 25, 2008 18:44 by author oozturk

ASP.NET için iki kod modeli var, bunlar:

- Single-File Page Model

- Code-Behind Page Model

Peki hangisini seçmeli?

Öncelikle belirtmek gerekiyorki microsoft'un açıklamasına göre (bir kaç kere test ettim, gerçekten öyle) herhangi bir performans farkı yok, tamamen şahsi seçime bağlı. Aslında şahsi seçimler de durumlara göre yapıldığına göre, durumuna göre değişir de diyebiliriz.

Mesela eğer kendimizi geliştirmek için bir örnek çalışıyorsak ya da az kodlu bir sayfa olacaksa, single-file page model daha uygun bir seçim olabilir. Sebep olarak da:

   - Markup (kullanıcı arayüzü) ve kodlar aynı sayfada olacağından ötürü daha okunaklı ve daha hakim olacağımız bir ortam oluşturur.

   - Bir başka şahısla paylaşacaksak sayfayı, göndermesi daha kolay olur (netice de bir tek dosyadan oluşuyor)

gibi bazı örnekler verilebilir. Bu tip bir çalışmaya aşağıda bir örnek vereyim.

<%@ Page Language="C#" %>
<script runat="server">
void Button1_Click(Object sender, EventArgs e)
{
    Label1.Text = DateTime.Now.ToString();
}
</script>
<html>
<head>
  <title>Single-File Page Model</title>
</head>
<body>
  <form runat="server">
    <div>
       <asp:Label id="Label1"
         runat="server" Text="Label">
       </asp:Label>
       <br />
       <asp:Button id="Button1"
         runat="server"
         onclick="Button1_Click"
         Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>

Code-Behind page model'i ise ciddi çalışmalarımızda ve çok kodlu çalışmalarımızda kullanmamız daha mantıklı olacaktır. Yine birkaç sebep belirtmek gerekirse:

   - Markup ve kodlar ayrı sayfalarda olacağından ötürü kod yazarıyla tasarımcı aynı anda çalışabilir, bu da zamandan tasarruf sağlayıp verimliliği arttırır.

   - Kodu markup'dan ayıklamaya gerek kalmayacağı için rahatça başka sayfalarda da kullanılabilir.

   - Kodu tasarımcı görmeyeceği için, bir nevi güvenlik de sağlamış oluruz.

 Bu sebepler çoğaltılabilir. Bir de code-behind'a örnek kod vereyim.

SamplePage.aspx

 <%@ Page Language="C#" CodeFile="SamplePage.aspx.cs"
    Inherits="SamplePage" AutoEventWireup="true" %>
<html>
<head runat="server" >
   <title>Code-Behind Page Model</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
       <asp:Label id="Label1"
         runat="server" Text="Label" >
      </asp:Label>
      <br />
      <asp:Button id="Button1"
         runat="server"
         onclick="Button1_Click"
         Text="Button" >
       </asp:Button>
    </div>
  </form>
</body>
</html>

SamplePage.aspx.cs 

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class SamplePage : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToString();
    }
}
 

Netice de tamamen alışkanlıklara ve tercihlere göre insandan insana değişir bu seçim.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Hakkımda...

Aklıma gelen sorunlara çözümler yazmaya çalışıyorum burada. Eğer çözümünü yazmamı istediğiniz sorunlar varsa,  bana e-posta atın :-)

 Iyi kodlamalar..

Güncel yorumlar

None

Sayfa listesi

    Sign in