SqlDataSource ile Parametreli Sorgular Kullanma (C#)

tarafından Scott Mitchell

PDF’yi İndir

Bu öğreticide SqlDataSource denetimine göz atıp parametreli sorguları tanımlamayı öğreneceğiz. Parametreler hem bildirimli hem de programlı olarak belirtilebilir ve sorgu dizesi, Oturum durumu, diğer denetimler ve daha fazlası gibi çeşitli konumlardan çekilebilir.

Giriş

Önceki öğreticide, verileri doğrudan veritabanından almak için SqlDataSource denetiminin nasıl kullanılacağını gördük. Veri Kaynağını Yapılandırma sihirbazını kullanarak veritabanını seçebilir ve ardından bir tablodan veya görünümden döndürülecek sütunları seçebiliriz; özel bir SQL deyimi girin; veya saklı yordam kullanın. İster tablodan sütun seçme, ister görünüm veya özel SQL deyimi girme olsun, SqlDataSource denetimi s SelectCommand özelliğine sonuçta elde edilen geçici SQL SELECT deyimi atanır ve SqlDataSource'un Select() yöntemi çağrıldığında yürütülen bu SELECT deyimdir (program aracılığıyla veya veri Web denetiminden otomatik olarak).

Önceki öğreticinin tanıtımlarında kullanılan SQL SELECT deyimlerinde eksik WHERE yan tümceler vardır. Deyiminde SELECTWHERE , döndürülen sonuçları sınırlamak için yan tümcesi kullanılabilir. Örneğin, maliyeti 50,00 TL'den fazla olan ürünlerin adlarını görüntülemek için aşağıdaki sorguyu kullanabiliriz:

SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00

Genellikle, yan WHERE tümcesinde kullanılan değerler querystring değeri, oturum değişkeni veya sayfadaki bir Web denetiminden kullanıcı girişi gibi bir dış kaynak tarafından belirlenir. İdeal olarak, bu tür girişler parametrelerin kullanımıyla belirtilir. Microsoft SQL Server ile parametreler aşağıdaki gibi kullanılarak @parameterNamebelirtilir:

SELECT ProductName
FROM Products
WHERE UnitPrice > @Price

SqlDataSource, hem deyimler hem de , UPDATEve INSERTDELETE deyimleri için SELECT parametreli sorguları destekler. Ayrıca parametre değerleri querystring, oturum durumu, sayfadaki denetimler gibi çeşitli kaynaklardan otomatik olarak alınabilir veya program aracılığıyla atanabilir. Bu öğreticide parametreli sorguları tanımlamanın yanı sıra parametre değerlerini hem bildirimli hem de programlı olarak belirtmeyi öğreneceksiniz.

Not

Önceki öğreticide, ilk 46 öğreticide tercih ettiğimiz ObjectDataSource'u SqlDataSource ile karşılaştırdık ve kavramsal benzerliklerine dikkat ettik. Bu benzerlikler parametrelere de uzanır. İş Mantığı Katmanı'ndaki yöntemlerin giriş parametreleriyle eşlenen ObjectDataSource parametreleri. SqlDataSource ile parametreler doğrudan SQL sorgusu içinde tanımlanır. Her iki denetim de , Insert(), Update()ve Delete() yöntemleri için parametre koleksiyonlarına Select()sahiptir ve her ikisi de bu parametre değerlerini önceden tanımlanmış kaynaklardan (sorgu dizesi değerleri, oturum değişkenleri vb.) doldurabilir veya program aracılığıyla atanabilir.

Parametreleştirilmiş Sorgu Oluşturma

SqlDataSource denetiminin Veri Kaynağını Yapılandırma sihirbazı, veritabanı kayıtlarını almak için yürütülecek komutu tanımlamaya yönelik üç yol sunar:

  • Mevcut bir tablo veya görünümden sütunları seçerek,
  • Özel bir SQL deyimi girerek veya
  • Saklı yordam seçerek

Varolan bir tablo veya görünümden sütun seçerken, yan tümcenin WHERE parametreleri Yan Tümce Ekle WHERE iletişim kutusu aracılığıyla belirtilmelidir. Ancak özel bir SQL deyimi oluştururken, parametreleri doğrudan yan tümcesine WHERE girebilirsiniz (her parametreyi belirtmek için kullanarak @parameterName ). Saklı yordam bir veya daha fazla SQL deyiminden oluşur ve bu deyimler parametrelendirilebilir. Ancak SQL deyimlerinde kullanılan parametreler, saklı yordama giriş parametreleri olarak geçirilmelidir.

Parametreli sorgu oluşturmak SqlDataSource'un SelectCommand nasıl belirtildiğine bağlı olduğundan, üç yaklaşımın tümüne göz atalım. Başlamak için, klasördeki SqlDataSource sayfayı ParameterizedQueries.aspx açın, Araç Kutusundan bir SqlDataSource denetimini Tasarım Aracı sürükleyin ve olarak IDProducts25BucksAndUnderDataSourceayarlayın. Ardından, denetimin akıllı etiketinden Veri Kaynağını Yapılandır bağlantısına tıklayın. Kullanılacak veritabanını seçin (NORTHWINDConnectionString) ve İleri'ye tıklayın.

1. Adım: Tablo veya Görünümden Sütunları Seçerken WHERE Yan Tümcesi Ekleme

SqlDataSource denetimiyle veritabanından döndürülecek verileri seçerken, Veri Kaynağını Yapılandırma sihirbazı var olan bir tablo veya görünümden döndürülecek sütunları seçmemizi sağlar (bkz. Şekil 1). Bunun yapılması, SqlDataSource Select() yöntemi çağrıldığında veritabanına gönderilen bir SQL SELECT deyimini otomatik olarak oluşturur. Önceki öğreticide yaptığımız gibi, açılan listeden Ürünler tablosunu seçin ve , ProductNameve UnitPrice sütunlarını işaretleyinProductID.

Tablo veya Görünümden Döndürülecek Sütunları Seçme

Şekil 1: Tablo veya Görünümden Döndürülecek Sütunları Seçme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Deyimine SELECT yan WHERE tümce eklemek için, Yan Tümce Ekle WHERE iletişim kutusunu açan düğmeye tıklayın WHERE (bkz. Şekil 2). Sorgu tarafından SELECT döndürülen sonuçları sınırlamak üzere bir parametre eklemek için, önce verileri filtrelemek için sütunu seçin. Ardından, filtreleme için kullanılacak işleci seçin (=, <, <=, >, vb.). Son olarak, querystring veya oturum durumu gibi parametre değerinin kaynağını seçin. Parametreyi yapılandırdıktan sonra ekle düğmesine tıklayarak bunu sorguya SELECT ekleyin.

Bu örnekte yalnızca değerin UnitPrice 25,00 TL'den küçük veya buna eşit olduğu sonuçları döndürelim. Bu nedenle, Sütun açılan listesinden ve <İşleç açılan listesinden = öğesini seçinUnitPrice. Sabit kodlanmış bir parametre değeri (25,00 TL gibi) kullanırken veya parametre değeri program aracılığıyla belirtilecekse, Kaynak açılan listesinden Yok'u seçin. Ardından, Değer metin kutusu 25.00'a sabit kodlanmış parametre değerini girin ve Ekle düğmesine tıklayarak işlemi tamamlayın.

WHERE Yan Tümcesi Ekle İletişim Kutusundan Döndürülen Sonuçları Sınırlama

Şekil 2: Yan Tümce Ekle WHERE İletişim Kutusundan Döndürülen Sonuçları Sınırlandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Parametreyi ekledikten sonra, Veri Kaynağını Yapılandırma sihirbazına dönmek için Tamam'a tıklayın. SELECT Sihirbazın en altındaki deyiminde artık WHERE adlı @UnitPriceparametreye sahip bir yan tümce bulunmalıdır:

SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)

Not

Yan tümcesinde WHERE Yan Tümce Ekle WHERE iletişim kutusundan birden çok koşul belirtirseniz, sihirbaz bunları işleçle birleştirir AND . Yan tümcesine WHERE (gibiWHERE UnitPrice <= @UnitPrice OR Discontinued = 1) bir OR eklemeniz gerekiyorsa, deyimini SELECT özel SQL deyimi ekranı aracılığıyla oluşturmanız gerekir.

SqlDataSource'u yapılandırmayı tamamlayın (İleri'ye tıklayın, ardından Son'a tıklayın) ve ardından SqlDataSource'un bildirim temelli işaretlemesini inceleyin. İşaretleme artık içindeki parametrelerin SelectCommandkaynaklarının yazıldığı bir <SelectParameters> koleksiyon içerir.

<asp:SqlDataSource ID="Products25BucksAndUnderDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand=
        "SELECT [ProductID], [ProductName], [UnitPrice]
        FROM [Products] WHERE ([UnitPrice] <= @UnitPrice)">
    <SelectParameters>
        <asp:Parameter DefaultValue="25.00" Name="UnitPrice" Type="Decimal" />
    </SelectParameters>
</asp:SqlDataSource>

SqlDataSource Select() yöntemi çağrıldığında, UnitPrice veritabanına gönderilmeden önce içindeki SelectCommand parametresine @UnitPrice parametre değeri (25.00) uygulanır. Net sonuç, tablodan yalnızca 25,00 ABD dolarından Products küçük veya buna eşit olan ürünlerin döndürülür. Bunu onaylamak için sayfaya bir GridView ekleyin, bu veri kaynağına bağlayın ve ardından sayfayı bir tarayıcı üzerinden görüntüleyin. Şekil 3'ün onayladığınız gibi yalnızca 25,00 ABD dolarından küçük veya buna eşit olan ürünlerin listelendiğini görmeniz gerekir.

Yalnızca 25,00 ABD Dolarından Küçük veya Buna Eşit Olan Ürünler Görüntülenir

Şekil 3: Yalnızca 25,00 ABD Dolarından Küçük veya Buna Eşit Ürünler Görüntülenir (Tam boyutlu resmi görüntülemek için tıklayın)

2. Adım: Özel SQL Deyimine Parametre Ekleme

Özel bir SQL deyimi eklerken yan tümcesini WHERE açıkça girebilir veya Sorgu Oluşturucusu'nun Filtre hücresinde bir değer belirtebilirsiniz. Bunu göstermek için yalnızca fiyatları belirli bir eşiğin altında olan ürünleri GridView'da görüntüleyelim. Kullanıcıdan bu eşik değerini toplamak için sayfaya ParameterizedQueries.aspx bir TextBox ekleyerek başlayın. TextBox s ID özelliğini olarak MaxPriceayarlayın. Düğme Web denetimi ekleyin ve özelliğini Eşleşen Ürünleri Görüntüle olarak ayarlayın Text .

Ardından, bir GridView'u sayfaya sürükleyin ve akıllı etiketinden adlı ProductsFilteredByPriceDataSourceyeni bir SqlDataSource oluşturmayı seçin. Veri Kaynağını Yapılandırma sihirbazında Özel SQL deyimi veya saklı yordam belirtme ekranına geçin (bkz. Şekil 4) ve aşağıdaki sorguyu girin:

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice

Sorguyu girdikten sonra (el ile veya Sorgu Oluşturucu aracılığıyla), İleri'ye tıklayın.

Yalnızca Parametre Değerinden Küçük veya Eşit Olan Ürünleri Döndürme

Şekil 4: Yalnızca Parametre Değerinden Küçük veya Eşit Olan Ürünleri Döndürme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sorguda parametreler bulunduğundan, sihirbazdaki bir sonraki ekranda parametre değerlerinin kaynağı sorulur. Parametre kaynağı açılan listesinden Denetim'i ve MaxPrice ControlID açılan listesinden (TextBox denetiminin ID değeri) Denetim'i seçin. Kullanıcının TextBox'a herhangi bir metin MaxPrice girmemesi durumunda kullanmak üzere isteğe bağlı bir varsayılan değer de girebilirsiniz. Şimdilik varsayılan bir değer girmeyin.

MaxPrice TextBox'ın Metin Özelliği Parametre Kaynağı Olarak Kullanılır

Şekil 5: MaxPrice TextBox s Text Özelliği Parametre Kaynağı Olarak Kullanılır (Tam boyutlu görüntüyü görüntülemek için tıklayın)

İleri'ye ve ardından Son'a tıklayarak Veri Kaynağını Yapılandırma sihirbazını tamamlayın. GridView, TextBox, Button ve SqlDataSource için bildirim temelli işaretleme aşağıdaki gibidir:

Maximum price:
$<asp:TextBox ID="MaxPrice" runat="server" Columns="5" />
 
<asp:Button ID="DisplayProductsLessThanButton" runat="server"
    Text="Display Matching Products" />
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
    DataSourceID="ProductsFilteredByPriceDataSource" EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            HtmlEncode="False" DataFormatString="{0:c}"
            SortExpression="UnitPrice" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsFilteredByPriceDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand=
        "SELECT ProductName, UnitPrice 
        FROM Products WHERE UnitPrice <= @MaximumPrice">
    <SelectParameters>
        <asp:ControlParameter ControlID="MaxPrice" Name="MaximumPrice"
            PropertyName="Text" />
    </SelectParameters>
</asp:SqlDataSource>

SqlDataSource'un <SelectParameters> bölümündeki parametresinin ve PropertyNamegibi ControlID ek özellikleri içeren bir ControlParameterolduğunu unutmayın. SqlDataSource yöntemi Select() çağrıldığında, ControlParameter değeri belirtilen Web denetimi özelliğinden alır ve içindeki SelectCommandilgili parametreye atar. Bu örnekte, MaxPrice parametre değeri olarak @MaxPrice s Text özelliği kullanılır.

Bu sayfayı bir tarayıcı üzerinden görüntülemek için bir dakika sürebilir. Sayfayı ilk kez ziyaret ettiğinizde veya MaxPrice TextBox'ta değer olmadığında GridView'da hiçbir kayıt görüntülenmez.

MaxPrice TextBox Boş Olduğunda Hiçbir Kayıt Görüntülenmez

Şekil 6: TextBox Boş Olduğunda MaxPrice Hiçbir Kayıt Görüntülenmiyor (Tam boyutlu resmi görüntülemek için tıklayın)

Hiçbir ürünün gösterilmemesinin nedeni, varsayılan olarak parametre değeri için boş bir dizenin veritabanı NULL değerine dönüştürülmesidir. karşılaştırması [UnitPrice] <= NULL her zaman False olarak değerlendirildiğinden hiçbir sonuç döndürülmedi.

Metin kutusuna 5,00 gibi bir değer girin ve Eşleşen Ürünleri Görüntüle düğmesine tıklayın. Geri göndermede SqlDataSource, GridView'a parametre kaynaklarından birinin değiştiğini bildirir. Sonuç olarak GridView, 5,00 TL'den küçük veya buna eşit olan ürünleri görüntüleyerek SqlDataSource'a yeniden bağlanıyor.

5,00 ABD Dolarından Küçük veya Buna Eşit Ürünler Görüntüleniyor

Şekil 7: 5,00 TL'den Küçük veya Buna Eşit Ürünler Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Başlangıçta Tüm Ürünleri Görüntüleme

Sayfa ilk yüklendiğinde ürün göstermemek yerine tüm ürünleri görüntülemek isteyebiliriz. TextBox boş olduğunda tüm ürünleri listelemenin MaxPrice bir yolu parametrenin varsayılan değerini 10000000 gibi çılgınca yüksek bir değere ayarlamaktır, çünkü Northwind Traders'ın birim fiyatı 1.000.000 TL'yi aşan envantere sahip olma olasılığı düşüktür. Ancak bu yaklaşım kısa sürelidir ve başka durumlarda çalışmayabilir.

Önceki öğreticilerde - Bildirim temelli Parametreler ve DropDownList ile Ana/Ayrıntı Filtreleme benzer bir sorunla karşılaştık. Buradaki çözümümüz, bu mantığı İş Mantığı Katmanı'na koymaktı. Özellikle, BLL gelen değeri inceledi ve ayrılmış bir değer veya ayrılmış bir değerse NULL , çağrı tüm kayıtları döndüren DAL yöntemine yönlendirildi. Gelen değer normal bir filtreleme değeriyse, sağlanan değerle parametreleştirilmiş WHERE yan tümcesi kullanan bir SQL deyimini yürüten DAL yöntemine bir çağrı yapılmıştır.

Ne yazık ki SqlDataSource kullanırken mimariyi atlıyoruz. Bunun yerine, parametre NULL veya ayrılmış bir değerse tüm kayıtları akıllı bir şekilde almak için SQL deyimini @MaximumPrice özelleştirmemiz gerekir. Bu alıştırmada, parametresi değerine eşitse @MaximumPrice-1.0tüm kayıtların döndürülmesi için bunu yapalım (-1.0 hiçbir ürünün negatif UnitPrice değeri olmadığından ayrılmış değer olarak çalışır). Bunu gerçekleştirmek için aşağıdaki SQL deyimini kullanabiliriz:

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0

Parametresi eşitse @MaximumPrice-1.0bu WHERE yan tümce tüm kayıtları döndürür. Parametre değeri değilse-1.0, yalnızca parametre değerinden küçük veya buna eşit @MaximumPrice olan UnitPrice ürünler döndürülür. parametresinin @MaximumPrice-1.0varsayılan değerini olarak ayarlayarak, ilk sayfa yüklemesinde (veya TextBox boş olduğunda MaxPrice ) @MaximumPrice değeri -1.0 olur ve tüm ürünler görüntülenir.

Artık MaxPrice TextBox Boş Olduğunda Tüm Ürünler Görüntüleniyor

Şekil 8: TextBox Boş Olduğunda MaxPrice Artık Tüm Ürünler Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu yaklaşımla dikkat edilmesi gereken birkaç uyarı vardır. İlk olarak, parametrenin veri türünün SQL sorgusundaki kullanımı tarafından çıkarıldığını fark edin. yan tümcesini WHERE olarak @MaximumPrice = -1.0@MaximumPrice = -1değiştirirseniz, çalışma zamanı parametresini tamsayı olarak işler. Daha sonra TextBox'ı MaxPrice ondalık değere (5,00 gibi) atamaya çalışırsanız, 5,00 değerini tamsayıya dönüştüremediğinden bir hata oluşur. Bunu düzeltmek için yan tümcesinde kullandığınızdan @MaximumPrice = -1.0 emin olun veya daha iyisi, object s Type özelliğini Ondalık olarak ayarlayınControlParameter.WHERE

İkinci olarak, yan tümcesine WHERE ekleyerek OR @MaximumPrice = -1.0 sorgu altyapısı üzerinde UnitPrice bir dizin kullanamaz (varsayarak) ve bu da tablo taramasına neden olur. Tabloda yeterince fazla sayıda kayıt Products varsa bu durum performansı etkileyebilir. Daha iyi bir yaklaşım, bu mantığı bir deyimin IF tüm kayıtların döndürülmesi gerektiğinde bir yan tümcesi olmadan WHERE tablodan Products sorgu gerçekleştireceği SELECT veya WHERE yan tümcesi yalnızca UnitPrice ölçütleri içeren bir deyimin kullanılabileceği saklı bir yordama taşımaktır.

3. Adım: Parametreli Saklı Yordamları Oluşturma ve Kullanma

Saklı yordamlar, saklı yordam içinde tanımlanan SQL deyimlerinde kullanılabilecek bir dizi giriş parametresi içerebilir. SqlDataSource'ı giriş parametrelerini kabul eden bir saklı yordam kullanacak şekilde yapılandırırken, bu parametre değerleri geçici SQL deyimleriyle aynı teknikler kullanılarak belirtilebilir.

SqlDataSource'ta saklı yordamları kullanmayı göstermek için, Northwind veritabanında adlı GetProductsByCategoryyeni bir saklı yordam oluşturalım. Bu, adlı @CategoryID bir parametreyi kabul eder ve sütunu eşleşen @CategoryIDürünlerin CategoryID tüm sütunlarını döndürür. Saklı yordam oluşturmak için Sunucu Gezgini'ne gidin ve veritabanında detaya NORTHWND.MDF gidin. (Sunucu Gezgini'ni görmüyorsanız Görünüm menüsüne gidip Sunucu Gezgini seçeneğini belirleyerek açın.)

NORTHWND.MDF Veritabanında Saklı Yordamlar klasörüne sağ tıklayın, Yeni Saklı Yordam Ekle'yi seçin ve aşağıdaki söz dizimini girin:

CREATE PROCEDURE dbo.GetProductsByCategory
(
      @CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID

Saklı yordamı kaydetmek için Kaydet simgesine (veya Ctrl+S) tıklayın. Saklı yordamı, Saklı Yordamlar klasöründen sağ tıklayıp Yürüt'e tıklayarak test edebilirsiniz. Bu sizden saklı yordamın parametrelerini (@CategoryIDbu örnekte) ister ve ardından sonuçlar Çıkış penceresinde görüntülenir.

1 inç /><span class=@CategoryID ile Yürütürken GetProductsByCategory Saklı Yordamı

Şekil 9: GetProductsByCategory 1 ile @CategoryID Yürütürken Saklı Yordam (Tam boyutlu görüntüyü görüntülemek için tıklayın)

GridView'da İçecekler kategorisindeki tüm ürünleri görüntülemek için bu saklı yordamı kullanalım. Sayfaya yeni bir GridView ekleyin ve adlı BeverageProductsDataSourceyeni bir SqlDataSource'a bağlayın. Özel SQL deyimi veya saklı yordam belirtin ekranına devam edin, Saklı yordam radyo düğmesini seçin ve açılan listeden GetProductsByCategory saklı yordamı seçin.

Drop-Down Listesinden GetProductsByCategory Saklı Yordamını seçin

Şekil 10: Drop-Down Listesinden Saklı Yordamı Seçin GetProductsByCategory (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Saklı yordam bir giriş parametresi ()@CategoryID kabul ettiğinden, İleri'ye tıklandığında bu parametrenin değerinin kaynağını belirtmemiz istenir. İçecekler CategoryID 1'dir, bu nedenle Parametre kaynağı açılan listesini Yok olarak bırakın ve DefaultValue metin kutusuna 1 girin.

İçecek Kategorisindeki Ürünleri İade Etmek için 1 Hard-Coded Değeri Kullanın

Şekil 11: İçecek Kategorisindeki Ürünleri Döndürmek için 1 Hard-Coded Değeri Kullanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Aşağıdaki bildirim temelli işaretlemenin gösterdiği gibi, saklı yordam kullanılırken SqlDataSource özelliği SelectCommand saklı yordamın SelectCommandType adına, özelliği ise geçici SQL deyimi yerine saklı yordamın adı olduğunu SelectCommand belirten olarak ayarlanırStoredProcedure.

<asp:SqlDataSource ID="BeverageProductsDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter DefaultValue="1" Name="CategoryID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

Tarayıcıda sayfayı test edin. Saklı yordam tablodaki tüm sütunları Products döndürdüğünden tüm ürün alanları görüntülense de yalnızca İçecekler kategorisine ait ürünler görüntülenirGetProductsByCategory. Elbette GridView'da görüntülenen alanları GridView'un Sütunları Düzenle iletişim kutusundan sınırlayabilir veya özelleştirebiliriz.

Tüm İçecekler Görüntülenir

Şekil 12: Tüm İçecekler Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

4. Adım: SqlDataSource'un Select() Deyimini Program Aracılığıyla Çağırma

Önceki öğreticide gördüğümüz örneklerde ve bu öğreticide şimdiye kadar SqlDataSource denetimleri doğrudan bir GridView'a bağlanmıştı. Ancak SqlDataSource denetimi s verilerine program aracılığıyla erişilebilir ve kodda numaralandırılabilir. Bu, verileri incelemek için sorgulamanız gerektiğinde ancak görüntülemeniz gerekmeyen durumlarda özellikle yararlı olabilir. Veritabanına bağlanmak için tüm ortak ADO.NET kodunu yazmak, komutu belirtmek ve sonuçları almak yerine, SqlDataSource'un bu monoton kodu işlemesine izin vekleyebilirsiniz.

SqlDataSource verileriyle program aracılığıyla çalışmayı göstermek için, patronunuzun rastgele seçilen bir kategorinin adını ve ilişkili ürünlerini görüntüleyen bir web sayfası oluşturma isteğiyle size yaklaştığını düşünün. Başka bir ifadeyle, bir kullanıcı bu sayfayı ziyaret ettiğinde tablodan Categories rastgele bir kategori seçmek, kategori adını görüntülemek ve ardından bu kategoriye ait ürünleri listelemek istiyoruz.

Bunu başarmak için biri tablodan rastgele bir kategoriyi, diğeri de kategorinin Categories ürünlerini almak için iki SqlDataSource denetimine ihtiyacımız var. Bu adımda rastgele bir kategori kaydı alan SqlDataSource'ı oluşturacağız; 5. adım, kategorinin ürünlerini alan SqlDataSource'un nasıl üretildiğini gösterir.

başlangıç olarak bir SqlDataSource ParameterizedQueries.aspx ekleyin ve öğesini ID olarak RandomCategoryDataSourceayarlayın. Aşağıdaki SQL sorgusunu kullanacak şekilde yapılandırın:

SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()

ORDER BY NEWID(), kayıtları rastgele sıralanmış olarak döndürür (bkz. Kayıtları Rastgele Sıralamak için KullanmaNEWID()). SELECT TOP 1 sonuç kümesindeki ilk kaydı döndürür. Bu sorgu bir araya getirerek CategoryID rastgele seçilen tek bir kategorideki ve CategoryName sütun değerlerini döndürür.

Kategorinin CategoryName değerini görüntülemek için sayfaya bir Etiket Web denetimi ekleyin, özelliğini olarak CategoryNameLabelayarlayın ID ve özelliğini temizleyinText. SqlDataSource denetiminden program aracılığıyla veri almak için yöntemini çağırmamız Select() gerekir. yöntemi, Select() döndürülmeden önce verilerin nasıl iletilmesi gerektiğini belirten türünde DataSourceSelectArgumentstek bir giriş parametresi bekler. Bu, verileri sıralama ve filtreleme yönergelerini içerebilir ve Bir SqlDataSource denetiminden veriler arasında sıralama veya sayfalama yaparken veri Web denetimleri tarafından kullanılır. Ancak örneğimiz için verilerin döndürülmeden önce değiştirilmesine gerek yoktur ve bu nedenle nesnesi geçirilir DataSourceSelectArguments.Empty .

yöntemi, Select() uygulayan IEnumerablebir nesnesi döndürür. Döndürülen kesin tür, SqlDataSource denetim s DataSourceMode özelliğinin değerine bağlıdır. Önceki öğreticide açıklandığı gibi, bu özellik veya DataReaderdeğerine DataSet ayarlanabilir. olarak ayarlanırsaDataSetSelect(), yöntemi bir DataView nesnesi döndürür; olarak ayarlanırsa DataReaderuygulayan IDataReaderbir nesne döndürür. RandomCategoryDataSource SqlDataSource'un DataSourceMode özelliği (varsayılan) olarak ayarlandığından DataSet , bir DataView nesnesiyle çalışacağız.

Aşağıdaki kodda, SqlDataSource'taki RandomCategoryDataSource kayıtların DataView olarak nasıl alınduğu ve ilk DataView satırından sütun değerinin CategoryName nasıl okunduğu gösterilmektedir:

protected void Page_Load(object sender, EventArgs e)
{
    // Get the data from the SqlDataSource as a DataView
    DataView randomCategoryView =
        (DataView)RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty);
    if (randomCategoryView.Count > 0)
    {
        // Assign the CategoryName value to the Label
        CategoryNameLabel.Text =
            string.Format("Here are Products in the {0} Category...",
                randomCategoryView[0]["CategoryName"].ToString());
    }
}

randomCategoryView[0] , DataView'daki ilki DataRowView döndürür. randomCategoryView[0]["CategoryName"] bu ilk satırdaki sütunun CategoryName değerini döndürür. DataView'un gevşek bir şekilde yazıldığını unutmayın. Belirli bir sütun değerine başvurmak için sütunun adını dize olarak geçirmemiz gerekir ( Bu örnekte CategoryName). Şekil 13'te, sayfayı görüntülerken görüntülenen CategoryNameLabel ileti gösterilir. Elbette, görüntülenen gerçek kategori adı, sayfaya yapılan her ziyarette RandomCategoryDataSource (geri göndermeler dahil) SqlDataSource tarafından rastgele seçilir.

Rastgele Seçilen Kategorinin Adı Görüntülenir

Şekil 13: Rastgele Seçilen KategoriNin Adı Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

SqlDataSource denetiminin DataSourceMode özelliği olarak DataReaderayarlanmışsa, yönteminden dönüş değerinin Select() öğesine yayınlanması IDataReadergerekirdi. İlk satırdaki CategoryName sütun değerini okumak için aşağıdaki gibi bir kod kullanırız:

if (randomCategoryReader.Read())
{
   string categoryName = randomCategoryReader["CategoryName"].ToString();
   ...
}

SqlDataSource rastgele bir kategori seçtiğinde, kategorinin ürünlerini listeleyen GridView'ı eklemeye hazırız.

Not

Kategorinin adını görüntülemek için Etiket Web denetimi kullanmak yerine sayfaya bir FormView veya DetailsView ekleyerek Bunu SqlDataSource'a bağlayabilirdik. Ancak Etiket'i kullanarak SqlDataSource deyimini Select() program aracılığıyla çağırmayı ve sonuçta elde edilen verilerle kodda çalışmayı keşfetmemize olanak sağladı.

5. Adım: Parametre Değerlerini Program Aracılığıyla Atama

Bu öğreticide şimdiye kadar gördüğümüz tüm örnekler sabit kodlanmış bir parametre değeri veya önceden tanımlanmış parametre kaynaklarından birinden alınan bir değer (sorgu dizesi değeri, sayfadaki bir Web denetimi vb.) kullandı. Ancak SqlDataSource denetiminin parametreleri program aracılığıyla da ayarlanabilir. Geçerli örneğimizi tamamlamak için, belirtilen bir kategoriye ait tüm ürünleri döndüren bir SqlDataSource'a ihtiyacımız var. Bu SqlDataSource,olay işleyicisinde SqlDataSource tarafından döndürülen sütun değerine göre CategoryID değerinin RandomCategoryDataSource ayarlanması gereken bir CategoryID parametreye Page_Load sahip olacaktır.

Sayfaya bir GridView ekleyerek başlayın ve bunu adlı ProductsByCategoryDataSourceyeni bir SqlDataSource'a bağlayın. 3. Adımda yaptığımız gibi, SqlDataSource'ı saklı yordamı çağırabilecek GetProductsByCategory şekilde yapılandırın. Parametre kaynağı açılan listesini Yok olarak bırakın, ancak bu varsayılan değeri program aracılığıyla ayarlayacağımız için varsayılan bir değer girmeyin.

Parametre kaynağı Yok olarak ayarlanmış Veri Kaynağını Yapılandır penceresini gösteren ekran görüntüsü.

Şekil 14: Parametre Kaynağı veya Varsayılan Değer Belirtmeyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

SqlDataSource sihirbazı tamamlandıktan sonra, sonuçta elde edilen bildirim temelli işaretleme aşağıdakine benzer görünmelidir:

<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter Name="CategoryID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

parametresini DefaultValueCategoryID olay işleyicisinde Page_Load program aracılığıyla atayabiliriz:

// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
    randomCategoryView[0]["CategoryID"].ToString();

Bu eklemeyle, sayfada rastgele seçilen kategoriyle ilişkili ürünleri gösteren bir GridView bulunur.

Rastgele Seçtiğiniz Kategori sayfasını gösteren ekran görüntüsü.

Şekil 15: Parametre Kaynağı veya Varsayılan Değer Belirtmeyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özet

SqlDataSource, sayfa geliştiricilerin parametre değerleri sabit kodlanmış, önceden tanımlanmış parametre kaynaklarından çekilebilen veya program aracılığıyla atanabilen parametreli sorgular tanımlamasına olanak tanır. Bu öğreticide, hem geçici SQL sorguları hem de saklı yordamlar için Veri Kaynağını Yapılandırma sihirbazından parametreli bir sorgu oluşturmayı gördük. Ayrıca sabit kodlanmış parametre kaynaklarını, parametre kaynağı olarak bir Web denetimini kullanmayı ve parametre değerini program aracılığıyla belirtmeyi inceledik.

ObjectDataSource'ta olduğu gibi, SqlDataSource da temel verilerini değiştirme özellikleri sağlar. Sonraki öğreticide SqlDataSource ile , UPDATEve DELETE deyimlerinin nasıl tanımlanacağına INSERTbakacağız. Bu deyimler eklendikten sonra GridView, DetailsView ve FormView denetimlerine özgü yerleşik ekleme, düzenleme ve silme özelliklerini kullanabiliriz.

Mutlu Programlama!

Yazar hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri Scott Clyde, Randell Schmidt ve Ken Pespisa'ydı. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır mitchell@4GuysFromRolla.combırakın.