Aracılığıyla paylaş


SqlDataSource ile Parametreli Sorgular Kullanma (VB)

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 sonra da bir tablodan veya görünümden döndürülecek sütunları seçebiliriz; özel bir SQL deyimi girin; veya saklı bir yordam kullanın. Tablo veya görünümden sütun seçme veya özel SQL deyimi girme gibi durumlarda, SqlDataSource denetimi s SelectCommand özelliğine sonuçta elde edilen geçici SQL SELECT deyimi atanır ve SqlDataSource yöntemi Select() çağrıldığında (program aracılığıyla veya veri Web denetiminden otomatik olarak) yürütülen bu SELECT deyimdir.

Önceki öğreticinin tanıtımlarında kullanılan SQL SELECT deyimlerinde yan tümceler eksiktir WHERE . 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 tümcesinde WHERE 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 çekilebilir 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 ile SqlDataSource'un kavramsal benzerliklerini belirttik. Bu benzerlikler parametrelere de yayılabilir. İş Mantığı Katmanı'ndaki yöntemlerin giriş parametrelerine eşlenen ObjectDataSource parametreleri. SqlDataSource ile parametreler doğrudan SQL sorgusunun 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. Bununla birlikte, ö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 de göz atalım. Başlamak için klasördeki sayfayı ParameterizedQueries.aspx açın, Araç Kutusu'ndan SqlDataSource 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). Bunu yapmak otomatik olarak bir SQL SELECT deyimi oluşturur. Bu, SqlDataSource Select() yöntemi çağrıldığında veritabanına gönderilen ifadedir. Önceki öğreticide yaptığımız gibi, açılan listeden Ürünler tablosunu seçin ve , ProductNameve UnitPrice sütunlarını denetleyinProductID.

Tablodan 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çin (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 (=, <, <=, >ve benzeri). Son olarak, querystring veya oturum durumu gibi parametre değerinin kaynağını seçin. Parametreyi yapılandırdıktan sonra, sorguya eklemek SELECT için Ekle düğmesine tıklayın.

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 <= iş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 Hiçbiri'ni 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ırlama (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Parametresini 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 deyimi artık adlı @UnitPriceparametreye sahip bir yan tümce içermelidirWHERE:

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

Not

Yan Tümce Ekle WHERE iletişim kutusunda yan tümcesinde WHERE birden çok koşul belirtirseniz, sihirbaz bunları işleçle birleştirirAND. Yan tümcesine (örneğinWHERE UnitPrice <= @UnitPrice OR Discontinued = 1) bir WHEREOR eklemeniz gerekiyorsa, deyimini özel SQL deyimi ekranı aracılığıyla oluşturmanız SELECT 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ı heceleyen 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 parametresine @UnitPrice parametre SelectCommand 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ünleri listelenmiş olarak 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 görüntüyü 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 Text Eşleşen Ürünleri Görüntüle olarak ayarlayın.

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ından Ö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 OR @MaximumPrice = -1.0

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

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

Ş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)

Sorgu parametreler içerdiğinden, 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. Ayrıca, 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'ın 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 bölümündeki <SelectParameters> parametresinin ve PropertyNamegibi ControlID ek özellikleri içeren bir ControlParameterolduğunu unutmayın. SqlDataSource Select() yöntemi çağrıldığında, ControlParameter değeri belirtilen Web denetimi özelliğinden alır ve içindeki ilgili parametreye SelectCommandatar. 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 bekleyin. 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ülenmiyor

Şekil 6: TextBox Boş Olduğunda MaxPrice Kayıt Görüntülenmiyor (Tam boyutlu görüntüyü 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ülmüyor.

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 Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
    ' Get the data from the SqlDataSource as a DataView
    Dim randomCategoryView As DataView = CType _
        (RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty), DataView)
    If randomCategoryView.Count > 0 Then
        ' Assign the CategoryName value to the Label
        CategoryNameLabel.Text = String.Format( _
            "Here are Products in the {0} Category...", _
            randomCategoryView(0)("CategoryName").ToString())
    End If
End Sub

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() Then
   Dim categoryName as String = randomCategoryReader("CategoryName').ToString()
   ...
End If

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 RandomCategoryDataSource döndürülen sütun değerine göre CategoryID 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'u 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 CategoryID olay işleyicisinde Page_Load program aracılığıyla atayabilirizDefaultValue:

' 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 de inceledik.

ObjectDataSource'ta olduğu gibi, SqlDataSource da temel alınan verileri değiştirmek için özellikler sağlar. Sonraki öğreticide, , UPDATEve DELETE deyimlerinin SqlDataSource ile 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 Hours 2.0'dır. 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 oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.