Veri Kaynağı Denetimleri

Microsoft tarafından

ASP.NET 1.x'teki DataGrid denetimi, Web uygulamalarında veri erişiminde büyük bir gelişme olduğunu işaret etti. Ancak, bu kadar kullanıcı dostu değildi. Yine de çok yararlı işlevler elde etmek için önemli miktarda kod gerektiriyor. Bu, 1.x'teki tüm veri erişim çabalarında modeldir.

ASP.NET 1.x'teki DataGrid denetimi, Web uygulamalarında veri erişiminde büyük bir gelişme olduğunu işaret etti. Ancak, bu kadar kullanıcı dostu değildi. Yine de çok yararlı işlevler elde etmek için önemli miktarda kod gerektiriyor. Bu, 1.x'teki tüm veri erişim çabalarında modeldir.

ASP.NET 2.0, bunu kısmen veri kaynağı denetimleriyle birlikte ele alır. ASP.NET 2.0'daki veri kaynağı denetimleri, geliştiricilere verileri almak, verileri görüntülemek ve verileri düzenlemek için bildirim temelli bir model sağlar. Veri kaynağı denetimlerinin amacı, bu verilerin kaynağından bağımsız olarak verilere bağlı denetimlere verilerin tutarlı bir gösterimini sağlamaktır. ASP.NET 2.0'daki veri kaynağı denetimlerinin merkezinde DataSourceControl soyut sınıfı yer alır. DataSourceControl sınıfı, IDataSource arabiriminin ve IListSource arabiriminin temel uygulamasını sağlar. Bunlardan ikincisi, veri kaynağı denetimini bir veriye bağlı denetimin DataSource'u olarak atamanıza olanak tanır (daha sonra ele alınan yeni DataSourceId özelliği aracılığıyla) ve verileri burada liste olarak kullanıma sunmanızı sağlar. Bir veri kaynağı denetimindeki her veri listesi DataSourceView nesnesi olarak sunulur. DataSourceView örneklerine erişim, IDataSource arabirimi tarafından sağlanır. Örneğin, GetViewNames yöntemi belirli bir veri kaynağı denetimiyle ilişkili DataSourceViews'ı listelemenizi sağlayan bir ICollection döndürür ve GetView yöntemi belirli bir DataSourceView örneğine ada göre erişmenize olanak tanır.

Veri kaynağı denetimlerinin kullanıcı arabirimi yoktur. Bildirim temelli söz dizimini destekleyebilecekleri ve istenirse sayfa durumuna erişebilmeleri için sunucu denetimleri olarak uygulanırlar. Veri kaynağı denetimleri istemciye herhangi bir HTML işaretlemesi işlemez.

Not

Daha sonra göreceğiniz gibi, veri kaynağı denetimlerini kullanarak elde edilen önbelleğe alma avantajları da vardır.

Bağlantı Dizelerini Depolama

Veri kaynağı denetimlerini yapılandırma konusuna geçmeden önce bağlantı dizeleriyle ilgili ASP.NET 2.0'da yeni bir özelliği ele almalıdır. ASP.NET 2.0, yapılandırma dosyasında çalışma zamanında dinamik olarak okunabilen bağlantı dizelerini kolayca depolamanızı sağlayan yeni bir bölüm sağlar. <connectionStrings> bölümü, bağlantı dizelerini depolamayı kolaylaştırır.

Aşağıdaki kod parçacığı yeni bir bağlantı dizesi ekler.

<connectionStrings> <add name="Northwind" connectionString="Data Source=localhost; Integrated Security=SSPI;Initial Catalog=Northwind;" providerName="System.Data.SqlClient" /> </connectionStrings>

Not

appSettings bölümünde olduğu gibi <connectionStrings> bölümü de <yapılandırma dosyasında system.web> bölümünün dışında <görünür.>

Bu bağlantı dizesini kullanmak için, bir sunucu denetiminin ConnectionString özniteliğini ayarlarken aşağıdaki söz dizimini kullanabilirsiniz.

ConnectionString="<%$ ConnectionStrings:Northwind%>"

<ConnectionStrings> bölümü, hassas bilgilerin açığa çıkarılmaması için de şifrelenebilir. Bu özellik sonraki bir modülde ele alınacaktır.

Veri Kaynaklarını Önbelleğe Alma

Her DataSourceControl, önbelleğe almayı yapılandırmak için dört özellik sağlar; EnableCaching, CacheDuration, CacheExpirationPolicy ve CacheKeyDependency.

EnableCaching

EnableCaching, veri kaynağı denetimi için önbelleğe almanın etkinleştirilip etkinleştirilmediğini belirleyen bir Boole özelliğidir.

CacheDuration Özelliği

CacheDuration özelliği, önbelleğin geçerli kalacağı saniye sayısını ayarlar. Bu özelliğin 0 olarak ayarlanması, önbelleğin açıkça geçersiz kılınana kadar geçerli kalmasına neden olur.

CacheExpirationPolicy Özelliği

CacheExpirationPolicy özelliği Mutlak veya Kayan olarak ayarlanabilir. Bunu Mutlak olarak ayarlamak, verilerin önbelleğe alınacağı en uzun sürenin CacheDuration özelliği tarafından belirtilen saniye sayısı olduğu anlamına gelir. Bunu Kayan olarak ayarlayarak, her işlem gerçekleştirildiğinde sona erme süresi sıfırlanır.

CacheKeyDependency Özelliği

CacheKeyDependency özelliği için bir dize değeri belirtilirse, ASP.NET bu dizeyi temel alan yeni bir önbellek bağımlılığı ayarlar. Bu, CacheKeyDependency değerini değiştirerek veya kaldırarak önbelleği açıkça geçersiz kılmanıza olanak tanır.

Önemli: Kimliğe bürünme etkinleştirildiyse ve veri kaynağına ve/veya veri içeriğine erişim istemci kimliğine dayalıysa, EnableCaching ayarı False olarak ayarlanarak önbelleğe almanın devre dışı bırakılması önerilir. Bu senaryoda önbelleğe alma etkinleştirildiyse ve verileri ilk olarak isteyen kullanıcı dışında bir kullanıcı istekte bulunursa, veri kaynağına yetkilendirme uygulanmaz. Veriler yalnızca önbellekten sunulur.

SqlDataSource Denetimi

SqlDataSource denetimi, bir geliştiricinin ADO.NET destekleyen herhangi bir ilişkisel veritabanında depolanan verilere erişmesini sağlar. Oracle'a erişmek için bir SQL Server veritabanına, System.Data.OleDb sağlayıcısına, System.Data.Odbc sağlayıcısına veya System.Data.OracleClient sağlayıcısına erişmek için System.Data.SqlClient sağlayıcısını kullanabilir. Bu nedenle, SqlDataSource kesinlikle yalnızca SQL Server veritabanındaki verilere erişmek için kullanılmaz.

SqlDataSource'ı kullanmak için ConnectionString özelliği için bir değer sağlamanız ve bir SQL komutu veya saklı yordam belirtmeniz yeterlidir. SqlDataSource denetimi, temel alınan ADO.NET mimarisiyle çalışmayı üstlenir. Bağlantıyı açar, veri kaynağını sorgular veya saklı yordamı yürütür, verileri döndürür ve ardından bağlantıyı sizin için kapatır.

Not

DataSourceControl sınıfı sizin için bağlantıyı otomatik olarak kapattığı için, veritabanı bağlantıları sızdırılarak oluşturulan müşteri çağrılarının sayısını azaltması gerekir.

Aşağıdaki kod parçacığı, yukarıda gösterildiği gibi yapılandırma dosyasında depolanan bağlantı dizesini kullanarak bir DropDownList denetimini SqlDataSource denetimine bağlar.

<asp:SqlDataSource id="SqlDataSource1" runat="server" DataSourceMode="DataReader" ConnectionString="<%$ ConnectionStrings:Northwind%>" SelectCommand="SELECT EmployeeID, LastName FROM Employees"> </asp:SqlDataSource><asp:DropDownList id="ListBox1" runat="server" DataTextField="LastName" DataValueField="EmployeeID" DataSourceID="SqlDataSource1"> </asp:DropDownList>

Yukarıda gösterildiği gibi, SqlDataSource'un DataSourceMode özelliği veri kaynağının modunu belirtir. Yukarıdaki örnekte DataSourceMode DataReader olarak ayarlanmıştır. Bu durumda SqlDataSource, salt iletme ve salt okunur bir imleç kullanarak bir IDataReader nesnesi döndürür. Döndürülen belirtilen nesne türü, kullanılan sağlayıcı tarafından denetlenür. Bu durumda, web.config dosyasının connectionStrings> bölümünde belirtildiği <gibi System.Data.SqlClient sağlayıcısını kullanıyorum. Bu nedenle, döndürülen nesne SqlDataReader türünde olacaktır. DataSet'in DataSourceMode değerini belirterek veriler sunucudaki bir DataSet'te depolanabilir. Bu mod sıralama, sayfalama gibi özellikler eklemenize olanak tanır. SqlDataSource'un bir GridView denetimine veri bağlaması yapmış olsaydım DataSet modunu seçerdim. Ancak DropDownList söz konusu olduğunda DataReader modu doğru seçimdir.

Not

SqlDataSource veya AccessDataSource önbelleğe alırken DataSourceMode özelliği DataSet olarak ayarlanmalıdır. DataReader DataSourceMode ile önbelleğe almayı etkinleştirirseniz bir özel durum oluşur.

SqlDataSource Özellikleri

SqlDataSource denetiminin özelliklerinden bazıları aşağıdadır.

CancelSelectOnNullParameter

Parametrelerden biri null olduğunda seçme komutunun iptal edilip edilmeyeceğini belirten boole değeri. Varsayılan olarak True.

Conflictdetection

Birden çok kullanıcının aynı anda bir veri kaynağını güncelleştirebileceği bir durumda, ConflictDetection özelliği SqlDataSource denetiminin davranışını belirler. Bu özellik, ConflictOptions sabit listesi değerlerinden birini değerlendirir. Bu değerler CompareAllValues ve OverwriteChanges değerleridir. OverwriteChanges olarak ayarlanırsa, veri kaynağına veri yazan son kişi önceki değişikliklerin üzerine yazar. Ancak, ConflictDetection özelliği CompareAllValues olarak ayarlanırsa, SelectCommand tarafından döndürülen sütunlar için parametreler oluşturulur ve bu sütunların her birinde özgün değerleri tutmak için parametreler de oluşturulur ve bu da SqlDataSource'un SelectCommand yürütüldükten sonra değerlerin değişip değişmediğini belirlemesine olanak sağlar.

Deletecommand

Veritabanından satır silerken kullanılan SQL dizesini ayarlar veya alır. Bu bir SQL sorgusu veya saklı yordam adı olabilir.

DeleteCommandType

DELETE komutunun türünü ayarlar veya alır( SQL sorgusu (Metin) veya saklı yordam (StoredProcedure).

Deleteparameters

SqlDataSource denetimiyle ilişkili SqlDataSourceView nesnesinin DeleteCommand'ı tarafından kullanılan parametreleri döndürür.

Oldvaluesparameterformatstring

Bu özellik, ConflictDetection özelliğinin CompareAllValues olarak ayarlandığı durumlarda özgün değer parametrelerinin biçimini belirtmek için kullanılır. Varsayılan değer, {0} özgün değer parametrelerinin özgün parametreyle aynı adı alması anlamına gelir. Başka bir deyişle, alan adı EmployeeID ise, özgün değer parametresi olacaktır @EmployeeID.

Selectcommand

Veritabanından veri almak için kullanılan SQL dizesini ayarlar veya alır. Bu bir SQL sorgusu veya saklı yordam adı olabilir.

SelectCommandType

SELECT komutunun türünü ayarlar veya alır; sql sorgusu (Metin) veya saklı yordam (StoredProcedure).

Selectparameters

SqlDataSource denetimiyle ilişkili SqlDataSourceView nesnesinin SelectCommand tarafından kullanılan parametreleri döndürür.

SortParameterName

Veri kaynağı denetimi tarafından alınan verileri sıralarken kullanılan saklı yordam parametresinin adını alır veya ayarlar. Yalnızca SelectCommandType StoredProcedure olarak ayarlandığında geçerlidir.

Sqlcachedependency

SQL Server önbellek bağımlılığında kullanılan veritabanlarını ve tabloları belirten noktalı virgülle ayrılmış dize. (SQL önbellek bağımlılıkları sonraki bir modülde ele alınacaktır.)

Updatecommand

Veritabanındaki verileri güncelleştirirken kullanılan SQL dizesini ayarlar veya alır. Bu bir SQL sorgusu veya saklı yordam adı olabilir.

UpdateCommandType

Sql sorgusu (Metin) veya saklı yordam (StoredProcedure) olmak üzere güncelleştirme komutunun türünü ayarlar veya alır.

Updateparameters

SqlDataSource denetimiyle ilişkili SqlDataSourceView nesnesinin UpdateCommand tarafından kullanılan parametreleri döndürür.

AccessDataSource Denetimi

AccessDataSource denetimi SqlDataSource sınıfından türetilir ve bir Microsoft Access veritabanına veri bağlamak için kullanılır. AccessDataSource denetiminin ConnectionString özelliği salt okunur bir özelliktir. DataFile özelliği, ConnectionString özelliğini kullanmak yerine aşağıda gösterildiği gibi Access Veritabanı'nı işaret etmek için kullanılır.

<asp:AccessDataSource id="AccessDataSource1" runat="server" DataFile="~/App_Data/Northwind.mdb"> </asp:AccessDataSource>

AccessDataSource her zaman temel SqlDataSource'un ProviderName değerini System.Data.OleDb olarak ayarlar ve Microsoft.Jet.OLEDB.4.0 OLE DB sağlayıcısını kullanarak veritabanına bağlanır. Parola korumalı bir Access veritabanına bağlanmak için AccessDataSource denetimini kullanamazsınız. Parola korumalı bir veritabanına bağlanmanız gerekiyorsa SqlDataSource denetimini kullanmanız gerekir.

Not

Web sitesinde depolanan Access veritabanları App_Data dizinine yerleştirilmelidir. ASP.NET bu dizindeki dosyalara göz atılması gerekmez. Access veritabanlarını kullanırken işlem hesabına App_Data dizinine Okuma ve Yazma izinleri vermeniz gerekir.

XmlDataSource Denetimi

XmlDataSource, XML verilerini veriye bağlı denetimlere bağlamak için kullanılır. DataFile özelliğini kullanarak bir XML dosyasına bağlanabilir veya Data özelliğini kullanarak bir XML dizesine bağlayabilirsiniz. XmlDataSource, XML özniteliklerini bağlanabilir alanlar olarak kullanıma sunar. Öznitelik olarak temsil edilmeyen değerlere bağlamanız gereken durumlarda XSL dönüşümü kullanmanız gerekir. XML verilerini filtrelemek için XPath ifadelerini de kullanabilirsiniz.

Aşağıdaki XML dosyasını göz önünde bulundurun:

<?xml version="1.0" encoding="utf-8" ?> <People> <Person FirstName="Jake" LastName="Stone"> <Address> <Street>345 Maple St.</Street> <City>Redmond</City> <Region>WA</Region> <ZipCode>01434</ZipCode> </Address> <Job> <Title>CEO</Title> <Description>Develops company strategies.</Description> </Job> </Person> <Person FirstName="Jacob" LastName="Ladder"> <Address> <Street>123 Elm St.</Street> <City>Seattle</City> <Region>WA</Region> <ZipCode>11223</ZipCode> </Address> <Job> <Title>Attorney</Title> <Description>Reviews legal issues.</Description> </Job> </Person> <Person FirstName="Angela" LastName="Hound"> <Address> <Street>34 Palm Avenue</Street> <City>Renton</City> <Region>WA</Region> <ZipCode>63910</ZipCode> </Address> <Job> <Title>IT Director</Title> <Description>In charge of corporate network.</Description> </Job> </Person> </People>

XmlDataSource'un yalnızca Kişi> düğümlerini filtrelemek için Kişiler/Person XPath özelliğini kullandığına <dikkat edin. DropDownList daha sonra DataTextField özelliğini kullanarak LastName özniteliğine veri bağlar.

XmlDataSource denetimi öncelikli olarak salt okunur XML verilerine veri bağlamak için kullanılırken, XML veri dosyasını düzenlemek mümkündür. Bu gibi durumlarda, XML dosyasındaki bilgilerin otomatik olarak eklenmesi, güncelleştirilmesi ve silinmesinin diğer veri kaynağı denetimlerinde olduğu gibi otomatik olarak gerçekleşmediğini unutmayın. Bunun yerine, XmlDataSource denetiminin aşağıdaki yöntemlerini kullanarak verileri el ile düzenlemek için kod yazmanız gerekir.

GetXmlDocument

XmlDataSource tarafından alınan XML kodunu içeren bir XmlDocument nesnesi alır.

Kaydet

Bellek içi XmlDocument'ı veri kaynağına geri kaydeder.

Save yönteminin yalnızca aşağıdaki iki koşul karşılandığında çalışacağını fark etmek önemlidir:

  1. XmlDataSource, bellek içi XML verilerine bağlanmak için Data özelliği yerine bir XML dosyasına bağlanmak için DataFile özelliğini kullanıyor.
  2. Transform veya TransformFile özelliği aracılığıyla dönüştürme belirtilmez.

Ayrıca Save yönteminin birden çok kullanıcı tarafından eş zamanlı olarak çağrıldığında beklenmeyen sonuçlar verebileceğini unutmayın.

ObjectDataSource Denetimi

Bu noktaya kadar ele aldığımız veri kaynağı denetimleri, veri kaynağı denetiminin doğrudan veri deposuyla iletişim kurduğu iki katmanlı uygulamalar için mükemmel seçeneklerdir. Ancak birçok gerçek dünya uygulaması, veri kaynağı denetiminin veri katmanıyla iletişim kuran bir iş nesnesiyle iletişim kurması gerekebilecek çok katmanlı uygulamalardır. Böyle durumlarda, ObjectDataSource faturayı güzel bir şekilde doldurur. ObjectDataSource bir kaynak nesneyle birlikte çalışır. ObjectDataSource denetimi kaynak nesnenin bir örneğini oluşturur, belirtilen yöntemi çağırır ve nesnenizin statik yöntemler (Visual Basic'te Paylaşılan) yerine örnek yöntemleri varsa nesne örneğini tek bir istek kapsamında atar. Bu nedenle, nesneniz durum bilgisi olmayan olmalıdır. Diğer bir ifadeyle, nesneniz tek bir isteğin yayılması içinde tüm gerekli kaynakları almalı ve serbest bırakmalıdır. ObjectDataSource denetiminin ObjectCreating olayını işleyerek kaynak nesnenin nasıl oluşturulduğunu denetleyebilirsiniz. Kaynak nesnenin bir örneğini oluşturabilir ve ardından ObjectDataSourceEventArgs sınıfının ObjectInstance özelliğini bu örneğe ayarlayabilirsiniz. ObjectDataSource denetimi, tek başına bir örnek oluşturmak yerine ObjectCreating olayında oluşturulan örneği kullanır.

Bir ObjectDataSource denetiminin kaynak nesnesi, verileri almak ve değiştirmek için çağrılabilen genel statik yöntemleri (Visual Basic'te Paylaşılan) kullanıma sunarsa, Bir ObjectDataSource denetimi bu yöntemleri doğrudan çağırır. Bir ObjectDataSource denetiminin yöntem çağrıları yapmak için kaynak nesnenin bir örneğini oluşturması gerekiyorsa, nesnenin parametre içermeyen bir ortak oluşturucu içermesi gerekir. ObjectDataSource denetimi, kaynak nesnenin yeni bir örneğini oluşturduğunda bu oluşturucuyu çağırır.

Kaynak nesne parametresiz bir ortak oluşturucu içermiyorsa, ObjectCreating olayında ObjectDataSource denetimi tarafından kullanılacak kaynak nesnenin bir örneğini oluşturabilirsiniz.

Nesne Yöntemlerini Belirtme

ObjectDataSource denetiminin kaynak nesnesi, verileri seçmek, eklemek, güncelleştirmek veya silmek için kullanılan herhangi bir sayıda yöntem içerebilir. Bu yöntemler, ObjectDataSource denetiminin SelectMethod, InsertMethod, UpdateMethod veya DeleteMethod özelliği kullanılarak tanımlandığında yöntemin adına göre ObjectDataSource denetimi tarafından çağrılır. Kaynak nesne, SelectCountMethod özelliği kullanılarak ObjectDataSource denetimi tarafından tanımlanan ve veri kaynağındaki toplam nesne sayısının sayısını döndüren isteğe bağlı bir SelectCount yöntemi de içerebilir. ObjectDataSource denetimi, disk belleği sırasında kullanılmak üzere veri kaynağındaki toplam kayıt sayısını almak üzere bir Select yöntemi çağrıldıktan sonra SelectCount yöntemini çağırır.

Veri Kaynağı Denetimlerini Kullanan Laboratuvar

Alıştırma 1 - SqlDataSource Denetimi ile Verileri Görüntüleme

Aşağıdaki alıştırmada, Northwind veritabanına bağlanmak için SqlDataSource denetimi kullanılır. SQL Server 2000 örneğindeki Northwind veritabanına erişiminiz olduğu varsayılır.

  1. Yeni bir ASP.NET Web sitesi oluşturun.

  2. Yeni bir web.config dosyası ekleyin.

    1. Çözüm Gezgini'da projeye sağ tıklayın ve Yeni Öğe Ekle'ye tıklayın.
    2. Şablon listesinden Web Yapılandırma Dosyası'nı seçin ve Ekle'ye tıklayın.
  3. <connectionStrings> bölümünü aşağıdaki gibi düzenleyin:

    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        ConnectionString="<%$ConnectionStrings:Northwind%>"
        SelectCommand="SELECT * FROM Products">
    </asp:SqlDataSource>
    
  4. Kod görünümüne geçin ve asp:SqlDataSource> denetimine <aşağıdaki gibi bir ConnectionString özniteliği ve SelectCommand özniteliği ekleyin:

    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        ConnectionString="<%$ConnectionStrings:Northwind%>"
        SelectCommand="SELECT * FROM Products">
    </asp:SqlDataSource>
    
  5. Tasarım görünümünde yeni bir GridView denetimi ekleyin.

  6. GridView Görevleri menüsündeki Veri Kaynağı Seç açılan listesinden SqlDataSource1'i seçin.

  7. Default.aspx'a sağ tıklayın ve menüden Tarayıcıda Görüntüle'yi seçin. Kaydetmek isteyip istemediğiniz sorulduğunda Evet'e tıklayın.

  8. GridView, Ürünler tablosundaki verileri görüntüler.

Alıştırma 2 - SqlDataSource Denetimi ile Verileri Düzenleme

Aşağıdaki alıştırmada, bildirim temelli söz dizimi kullanılarak bir DropDownList denetiminin nasıl bağlanacağınız gösterilmektedir ve DropDownList denetiminde sunulan verileri düzenlemenize olanak tanır.

  1. Tasarım görünümünde, GridView denetimini Default.aspx dosyasından silin.

    Önemli: Sayfada SqlDataSource denetimini bırakın.

  2. Default.aspx'a DropDownList denetimi ekleyin.

  3. Kaynak görünümüne geçin.

  4. asp:DropDownList> denetimine <aşağıdaki gibi bir DataSourceId, DataTextField ve DataValueField özniteliği ekleyin:

    <asp:DropDownList ID="ddlProducts" runat="server"
         DataSourceId="SqlDataSource1" DataTextField="ProductName"
         DataValueField="ProductID">
    </asp:DropDownList>
    
  5. Default.aspx dosyasını kaydedin ve tarayıcıda görüntüleyin. DropDownList'in Northwind veritabanındaki tüm ürünleri içerdiğini unutmayın.

  6. Tarayıcıyı kapatın.

  7. Default.aspx dosyasının Kaynak görünümünde DropDownList denetiminin altına yeni bir TextBox denetimi ekleyin. TextBox'ın ID özelliğini txtProductName olarak değiştirin.

  8. TextBox denetimi altında yeni bir Düğme denetimi ekleyin. Düğmenin ID özelliğini btnUpdate, Text özelliğini ise Ürün Adını Güncelleştir olarak değiştirin.

  9. Default.aspx dosyasının Kaynak görünümünde, SqlDataSource etiketine aşağıdaki gibi bir UpdateCommand özelliği ve iki yeni UpdateParameter ekleyin:

    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        ConnectionString="<%$ConnectionStrings:Northwind%>"
        SelectCommand="SELECT * FROM Products"
        UpdateCommand="UPDATE Products SET ProductName=@ProductName WHERE ProductID=@ProductID">
          <UpdateParameters>
          <asp:ControlParameter Name="ProductName" 
            ControlID="txtProductName" PropertyName="Text" />
          <asp:ControlParameter Name="ProductID" 
            ControlID="ddlProducts" PropertyName="SelectedValue" />
    </asp:SqlDataSource>
    

    Not

    Bu koda iki güncelleştirme parametresi (ProductName ve ProductID) eklendiğini unutmayın. Bu parametreler txtProductName TextBox'ın Text özelliğine ve ddlProducts DropDownList'in SelectedValue özelliğine eşlenir.

  10. Tasarım görünümüne geçin ve olay işleyicisi eklemek için Düğme denetimine çift tıklayın.

  11. btnUpdate_Click koduna aşağıdaki kodu ekleyin:

    SqlDataSource1.Update();
    
  12. Default.aspx'a sağ tıklayın ve tarayıcıda görüntülemeyi seçin. Tüm değişiklikleri kaydetmek isteyip istemediğiniz sorulduğunda Evet'e tıklayın.

  13. ASP.NET 2.0 kısmi sınıflar çalışma zamanında derlemeye olanak tanır. Kod değişikliklerinin etkili olduğunu görmek için bir uygulama oluşturmak gerekli değildir.

  14. DropDownList'ten bir ürün seçin.

  15. TextBox'a seçili ürün için yeni bir ad girin ve güncelleştir düğmesine tıklayın.

  16. Ürün adı veritabanında güncelleştirilir.

Alıştırma 3 ObjectDataSource Denetimini Kullanma

Bu alıştırmada, Northwind veritabanıyla etkileşim kurmak için ObjectDataSource denetiminin ve kaynak nesnenin nasıl kullanılacağı gösterilmektedir.

  1. Çözüm Gezgini'da projeye sağ tıklayın ve Yeni Öğe Ekle'ye tıklayın.

  2. Şablonlar listesinde Web Formu'nu seçin. Adı object.aspx olarak değiştirin ve Ekle'ye tıklayın.

  3. Çözüm Gezgini'da projeye sağ tıklayın ve Yeni Öğe Ekle'ye tıklayın.

  4. Şablonlar listesinde Sınıf'ı seçin. Sınıfın adını NorthwindData.cs olarak değiştirin ve Ekle'ye tıklayın.

  5. Sınıfı App_Code klasörüne eklemek isteyip istemediğiniz sorulduğunda Evet'e tıklayın.

  6. NorthwindData.cs dosyasına aşağıdaki kodu ekleyin:

    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;
    using System.Data.SqlClient;
    public class NorthwindData {
        private string _connectionString;
        public NorthwindData() {
            Initialize();
        }
    
        private void Initialize() {
            if (ConfigurationManager.ConnectionStrings["Northwind"] == null ||
                ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString.Trim() == "") {
                    throw new Exception("A connection string named 'Northwind' with " +
                    "a valid connection string must exist in the <connectionStrings> " +
                    "configuration section for the application.");
            }
            _connectionString = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
        }
    
        public DataTable GetAllEmployees(string sortColumns, int startRecord, int maxRecords) {
            VerifySortColumns(sortColumns);
            string sqlCmd = "SELECT EmployeeID, LastName, FirstName, Address, " +
                "City, Region, PostalCode FROM Employees ";
            if (sortColumns.Trim() == "")
                sqlCmd += "ORDER BY EmployeeID";
            else
                sqlCmd += "ORDER BY " + sortColumns;
    
            SqlConnection conn = new SqlConnection(_connectionString);
            SqlDataAdapter da = new SqlDataAdapter(sqlCmd, conn);
            DataSet ds = new DataSet();
            try {
                conn.Open();
                da.Fill(ds, startRecord, maxRecords, "Employees");
            } catch (SqlException e) {
                // Handle exception.
            } finally {
                conn.Close();
            }
            return ds.Tables["Employees"];
        }
    
        public int SelectCount() {
            SqlConnection conn = new SqlConnection(_connectionString);
            SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Employees", conn);
            int result = 0;
    
            try {
                conn.Open();
                result = (int)cmd.ExecuteScalar();
            } catch (SqlException e) {
                // Handle exception.
            } finally {
                conn.Close();
            }
            return result;
        }
    
        //////////
        // Verify that only valid columns are specified in the sort expression to
        // avoid a SQL Injection attack.
        private void VerifySortColumns(string sortColumns) {
            if (sortColumns.ToLowerInvariant().EndsWith(" desc"))
                sortColumns = sortColumns.Substring(0, sortColumns.Length - 5);
            string[] columnNames = sortColumns.Split(',');
            foreach (string columnName in columnNames) {
                switch (columnName.Trim().ToLowerInvariant()) {
                    case "employeeid":
                        break;
                    case "lastname":
                        break;
                    case "firstname":
                        break;
                    case "":
                        break;
                    default:
                        throw new ArgumentException("SortColumns contains an " +
                            "invalid column name.");
                        break;
                }
            }
        }
    
        // Select an employee.
        public DataTable GetEmployee(int EmployeeID) {
            SqlConnection conn = new SqlConnection(_connectionString);
            SqlDataAdapter da =
                new SqlDataAdapter("SELECT EmployeeID, LastName, FirstName, " +
                "Address, City, Region, PostalCode " +
                " FROM Employees WHERE EmployeeID = @EmployeeID", conn);
            da.SelectCommand.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;
            DataSet ds = new DataSet();
            try {
                conn.Open();
                da.Fill(ds, "Employees");
            } catch (SqlException e) {
                // Handle exception.
            } finally {
                conn.Close();
            }
    
            return ds.Tables["Employees"];
        }
    
        // Delete the Employee by ID.
        public int DeleteEmployee(int EmployeeID) {
             SqlConnection conn = new SqlConnection(_connectionString);
             SqlCommand cmd = new SqlCommand("DELETE FROM Employees WHERE " +
                 "EmployeeID = @EmployeeID", conn);
             cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;
             int result = 0;
             try {
                 conn.Open();
                 result = cmd.ExecuteNonQuery();
             } catch (SqlException e) {
                 // Handle exception.
             } finally {
                 conn.Close();
             }
    
             return result;
         }
    
         // Update the Employee by original ID.
         public int UpdateEmployee(int EmployeeID, string LastName, string FirstName,
             string Address, string City, string Region,
             string PostalCode) {
             if (String.IsNullOrEmpty(FirstName))
                 throw new ArgumentException("FirstName cannot be null or an empty string.");
             if (String.IsNullOrEmpty(LastName))
                 throw new ArgumentException("LastName cannot be null or an empty string.");
             if (Address == null) { Address = String.Empty; }
             if (City == null) { City = String.Empty; }
             if (Region == null) { Region = String.Empty; }
             if (PostalCode == null) { PostalCode = String.Empty; }
    
             SqlConnection conn = new SqlConnection(_connectionString);
             SqlCommand cmd = new SqlCommand("UPDATE Employees " +
                 " SET FirstName=@FirstName, " +
                 "LastName=@LastName, " +
                 "Address=@Address, City=@City, " +
                 "Region=@Region, " +
                 "PostalCode=@PostalCode " +
                 "WHERE EmployeeID=@EmployeeID", conn);
             cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = FirstName;
             cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = LastName;
             cmd.Parameters.Add("@Address", SqlDbType.VarChar, 60).Value = Address;
             cmd.Parameters.Add("@City", SqlDbType.VarChar, 15).Value = City;
             cmd.Parameters.Add("@Region", SqlDbType.VarChar, 15).Value = Region;
             cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode;
             cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;
    
             int result = 0;
             try {
                 conn.Open();
                 result = cmd.ExecuteNonQuery();
             } catch (SqlException e) {
                 // Handle exception.
             } finally {
                 conn.Close();
             }
    
             return result;
        }
    
        // Insert an Employee.
        public int InsertEmployee(string LastName, string FirstName,
            string Address, string City, string Region,
            string PostalCode) {
            if (String.IsNullOrEmpty(FirstName))
                throw new ArgumentException("FirstName cannot be null or an empty string.");
            if (String.IsNullOrEmpty(LastName))
                throw new ArgumentException("LastName cannot be null or an empty string.");
            if (Address == null) { Address = String.Empty; }
            if (City == null) { City = String.Empty; }
            if (Region == null) { Region = String.Empty; }
            if (PostalCode == null) { PostalCode = String.Empty; }
    
            SqlConnection conn = new SqlConnection(_connectionString);
            SqlCommand cmd = new SqlCommand("INSERT INTO Employees " +
                " (FirstName, LastName, Address, " +
                " City, Region, PostalCode) " +
                " Values(@FirstName, @LastName, " +
                "@Address, @City, @Region, @PostalCode); " +
                "SELECT @EmployeeID = SCOPE_IDENTITY()", conn);
    
            cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = FirstName;
            cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = LastName;
            cmd.Parameters.Add("@Address", SqlDbType.VarChar, 60).Value = Address;
            cmd.Parameters.Add("@City", SqlDbType.VarChar, 15).Value = City;
            cmd.Parameters.Add("@Region", SqlDbType.VarChar, 15).Value = Region;
            cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode;
            SqlParameter p = cmd.Parameters.Add("@EmployeeID", SqlDbType.Int);
                p.Direction = ParameterDirection.Output;
            int newEmployeeID = 0;
            try {
                conn.Open();
                cmd.ExecuteNonQuery();
                newEmployeeID = (int)p.Value;
            } catch (SqlException e) {
                // Handle exception.
            } finally {
                conn.Close();
            }
    
            return newEmployeeID;
        }
    
        //
        // Methods that support Optimistic Concurrency checks.
        //
        // Delete the Employee by ID.
        public int DeleteEmployee(int original_EmployeeID, string original_LastName,
            string original_FirstName, string original_Address,
            string original_City, string original_Region,
            string original_PostalCode) {
    
            if (String.IsNullOrEmpty(original_FirstName))
                throw new ArgumentException("FirstName cannot be null or an empty string.");
            if (String.IsNullOrEmpty(original_LastName))
                throw new ArgumentException("LastName cannot be null or an empty string.");
            if (original_Address == null) { original_Address = String.Empty; }
            if (original_City == null) { original_City = String.Empty; }
            if (original_Region == null) { original_Region = String.Empty; }
            if (original_PostalCode == null) { original_PostalCode = String.Empty; }
            string sqlCmd = "DELETE FROM Employees WHERE EmployeeID = " + @original_EmployeeID
    
            SqlConnection conn = new SqlConnection(_connectionString);
            SqlCommand cmd = new SqlCommand(sqlCmd, conn);
            cmd.Parameters.Add("@original_EmployeeID",
                SqlDbType.Int).Value = original_EmployeeID;
            cmd.Parameters.Add("@original_FirstName",
                SqlDbType.VarChar, 10).Value = original_FirstName;
            cmd.Parameters.Add("@original_LastName",
                SqlDbType.VarChar, 20).Value = original_LastName;
            cmd.Parameters.Add("@original_Address",
                SqlDbType.VarChar, 60).Value = original_Address;
            cmd.Parameters.Add("@original_City",
                SqlDbType.VarChar, 15).Value = original_City;
            cmd.Parameters.Add("@original_Region",
                SqlDbType.VarChar, 15).Value = original_Region;
            cmd.Parameters.Add("@original_PostalCode",
                SqlDbType.VarChar, 10).Value = original_PostalCode;
    
            int result = 0;
            try {
                conn.Open();
                result = cmd.ExecuteNonQuery();
            } catch (SqlException e) {
                // Handle exception.
            } finally {
                conn.Close();
            }
    
            return result;
        }
    
        // Update the Employee by original ID.
        public int UpdateEmployee(string LastName, string FirstName,
            string Address, string City, string Region,
            string PostalCode, int original_EmployeeID,
            string original_LastName, string original_FirstName,
            string original_Address, string original_City,
            string original_Region, string original_PostalCode) {
    
            if (String.IsNullOrEmpty(FirstName))
                throw new ArgumentException("FirstName cannot be null or an empty string.");
            if (String.IsNullOrEmpty(LastName))
                throw new ArgumentException("LastName cannot be null or an empty string.");
            if (Address == null) { Address = String.Empty; }
            if (City == null) { City = String.Empty; }
            if (Region == null) { Region = String.Empty; }
            if (PostalCode == null) { PostalCode = String.Empty; }
            if (original_Address == null) { original_Address = String.Empty; }
            if (original_City == null) { original_City = String.Empty; }
            if (original_Region == null) { original_Region = String.Empty; }
            if (original_PostalCode == null) { original_PostalCode = String.Empty; }
    
            string sqlCmd = "UPDATE Employees " +
                " SET FirstName = @FirstName, LastName = @LastName, " +
                " Address = @Address, City = @City, Region = @Region, " +
                " PostalCode = @PostalCode " +
                " WHERE EmployeeID = @original_EmployeeID";
    
            SqlConnection conn = new SqlConnection(_connectionString);
            SqlCommand cmd = new SqlCommand(sqlCmd, conn);
            cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = FirstName;
            cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 20).Value = LastName;
            cmd.Parameters.Add("@Address", SqlDbType.VarChar, 60).Value = Address;
            cmd.Parameters.Add("@City", SqlDbType.VarChar, 15).Value = City;
            cmd.Parameters.Add("@Region", SqlDbType.VarChar, 15).Value = Region;
            cmd.Parameters.Add("@PostalCode", SqlDbType.VarChar, 10).Value = PostalCode;
            cmd.Parameters.Add("@original_EmployeeID",
                SqlDbType.Int).Value = original_EmployeeID;
            cmd.Parameters.Add("@original_FirstName",
                SqlDbType.VarChar, 10).Value = original_FirstName;
            cmd.Parameters.Add("@original_LastName",
                SqlDbType.VarChar, 20).Value = original_LastName;
            cmd.Parameters.Add("@original_Address",
                SqlDbType.VarChar, 60).Value = original_Address;
            cmd.Parameters.Add("@original_City",
                SqlDbType.VarChar, 15).Value = original_City;
            cmd.Parameters.Add("@original_Region",
                SqlDbType.VarChar, 15).Value = original_Region;
            cmd.Parameters.Add("@original_PostalCode",
                SqlDbType.VarChar, 10).Value = original_PostalCode;
    
            int result = 0;
    
            try {
                conn.Open();
                result = cmd.ExecuteNonQuery();
            } catch (SqlException e) {
                // Handle exception.
            } finally {
                conn.Close();
            }
            return result;
        }
    }
    
  7. Object.aspx dosyasının Kaynak görünümüne aşağıdaki kodu ekleyin:

    <%@ Page language="C#" %>
    <script RunAt="server">
    void EmployeesDetailsView_ItemInserted(Object sender, DetailsViewInsertedEventArgs e) {
        EmployeesGridView.DataBind();
    }
    
    void EmployeesDetailsView_ItemUpdated(Object sender, DetailsViewUpdatedEventArgs e) {
        EmployeesGridView.DataBind();
    }
    
    void EmployeesDetailsView_ItemDeleted(Object sender, DetailsViewDeletedEventArgs e) {
        EmployeesGridView.DataBind();
    }
    void EmployeesGridView_OnSelectedIndexChanged(object sender, EventArgs e) {
        EmployeeDetailsObjectDataSource.SelectParameters["EmployeeID"].DefaultValue =
            EmployeesGridView.SelectedDataKey.Value.ToString();
        EmployeesDetailsView.DataBind();
    }
    void EmployeeDetailsObjectDataSource_OnInserted(object sender,
        ObjectDataSourceStatusEventArgs e) {
    
        EmployeeDetailsObjectDataSource.SelectParameters["EmployeeID"].DefaultValue =
            e.ReturnValue.ToString();
        EmployeesDetailsView.DataBind();
    }
    void EmployeeDetailsObjectDataSource_OnUpdated(object sender,
        ObjectDataSourceStatusEventArgs e) {
    
        if ((int)e.ReturnValue == 0)
            Msg.Text = "Employee was not updated. Please try again.";
    }
    void EmployeeDetailsObjectDataSource_OnDeleted(object sender,
        ObjectDataSourceStatusEventArgs e) {
    
        if ((int)e.ReturnValue == 0)
            Msg.Text = "Employee was not deleted. Please try again.";
    }
    void Page_Load() {
        Msg.Text = "";
    }
    </script>
    <html>
      <body>
        <form id="Form1" runat="server">
          <h3>ObjectDataSource Example</h3>
          <asp:Label id="Msg" runat="server" ForeColor="Red" />
          <asp:ObjectDataSource
              ID="EmployeesObjectDataSource"
              runat="server"
              TypeName="NorthwindData"
              SortParameterName="SortColumns"
              EnablePaging="true"
              SelectCountMethod="SelectCount"
              StartRowIndexParameterName="StartRecord"
              MaximumRowsParameterName="MaxRecords"
              SelectMethod="GetAllEmployees" >
          </asp:ObjectDataSource>
          <asp:ObjectDataSource
              ID="EmployeeDetailsObjectDataSource"
              runat="server"
              TypeName="NorthwindData"
              ConflictDetection="CompareAllValues"
              OldValuesParameterFormatString="{0}"
              SelectMethod="GetEmployee"
              InsertMethod="InsertEmployee"
              UpdateMethod="UpdateEmployee"
              DeleteMethod="DeleteEmployee"
              OnInserted="EmployeeDetailsObjectDataSource_OnInserted"
              OnUpdated="EmployeeDetailsObjectDataSource_OnUpdated"
              OnDeleted="EmployeeDetailsObjectDataSource_OnDeleted">
              <SelectParameters>
                  <asp:Parameter Name="EmployeeID" Type="Int32" />
              </SelectParameters>
          </asp:ObjectDataSource>
          <table cellspacing="10">
            <tr>
              <td valign="top">
                <asp:GridView ID="EmployeesGridView"
                    DataSourceID="EmployeesObjectDataSource"
                    AutoGenerateColumns="false"
                    AllowSorting="true"
                    AllowPaging="true"
                    PageSize="5"
                    DataKeyNames="EmployeeID"
                    OnSelectedIndexChanged="EmployeesGridView_OnSelectedIndexChanged"
                    RunAt="server">
                    <HeaderStyle backcolor="lightblue" forecolor="black"/>
                    <Columns>
                    <asp:ButtonField Text="Details..."
                    HeaderText="Show Details"
                    CommandName="Select"/>
    
                    <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID"
                    SortExpression="EmployeeID" />
                    <asp:BoundField DataField="FirstName" HeaderText="First Name"
                    SortExpression="FirstName" />
                    <asp:BoundField DataField="LastName" HeaderText="Last Name"
                    SortExpression="LastName, FirstName" />
                    </Columns>
                </asp:GridView>
              </td>
              <td valign="top">
                <asp:DetailsView ID="EmployeesDetailsView"
                    DataSourceID="EmployeeDetailsObjectDataSource"
                    AutoGenerateRows="false"
                    EmptyDataText="No records."
                    DataKeyNames="EmployeeID"
                    Gridlines="Both"
                    AutoGenerateInsertButton="true"
                    AutoGenerateEditButton="true"
                    AutoGenerateDeleteButton="true"
                    OnItemInserted="EmployeesDetailsView_ItemInserted"
                    OnItemUpdated="EmployeesDetailsView_ItemUpdated"
                    OnItemDeleted="EmployeesDetailsView_ItemDeleted"
                    RunAt="server">
                    <HeaderStyle backcolor="Navy" forecolor="White"/>
                    <RowStyle backcolor="White"/>
                    <AlternatingRowStyle backcolor="LightGray"/>
                    <EditRowStyle backcolor="LightCyan"/>
                    <Fields>
                        <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID"
                            InsertVisible="False" ReadOnly="true"/>
                        <asp:BoundField DataField="FirstName" HeaderText="First Name"/>
                        <asp:BoundField DataField="LastName" HeaderText="Last Name"/>
                        <asp:BoundField DataField="Address" HeaderText="Address"/>
                        <asp:BoundField DataField="City" HeaderText="City"/>
                        <asp:BoundField DataField="Region" HeaderText="Region"/>
                        <asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>
                    </Fields>
                  </asp:DetailsView>
                </td>
              </tr>
            </table>
          </form>
        </body>
      </html>
    
  8. Tüm dosyaları kaydedin ve object.aspx dosyasına göz atın.

  9. Ayrıntıları görüntüleyerek, çalışanları düzenleyerek, çalışan ekleyerek ve çalışanları silerek arabirimle etkileşim kurun.