Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Bu öğreticide, SqlDataSource denetimine bakmaya devam edeceğiz ve parametreli sorguların nasıl tanımlanacağını öğreneceğiz. Parametreler hem bildirimli hem de programlı olarak belirtilebilir ve sorgu dizesi, oturum durumu, diğer denetimler ve daha fazlası gibi bir dizi konumdan çekilebilir.
Giriş
Önceki öğreticide, verileri doğrudan bir veritabanından almak için SqlDataSource denetiminin nasıl kullanılacağını gördük. Veri Kaynağını Yapılandır sihirbazını kullanarak veritabanını seçebilir ve ardından şunlardan birini yapabiliriz: bir tablodan veya görünümden döndürülecek sütunları seçin; özel bir SQL ifadesi girin; veya saklı bir yordam kullanın. Bir tablodan veya görünümden sütun seçerken ya da özel bir SQL deyimi girilirken, SqlDataSource denetiminin 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 otomatik olarak bir veri Web denetiminden yürütülen) bu deyimdirSelect().
Önceki öğreticinin tanıtımlarında kullanılan SQL SELECT deyimlerinde yan tümceler eksikti WHERE . Bir SELECT deyimde, WHERE yan tümce döndürülen sonuçları sınırlamak için kullanılabilir. Örneğin, maliyeti 50,00 ABD dolarından 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, bir WHERE yan tümcede kullanılan değerler, bir sorgu dizesi değeri, bir oturum değişkeni veya sayfadaki bir Web denetiminden gelen kullanıcı girişi gibi bazı dış kaynaklar tarafından belirlenir. İdeal olarak, bu tür girişler parametreler kullanılarak belirtilir. Microsoft SQL Server ile parametreler aşağıdaki gibi kullanılarak gösterilir @parameterName:
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource, hem deyimler hem SELECTde , INSERTve UPDATE deyimleri için DELETE parametreli sorguları destekler. Ayrıca, parametre değerleri, sorgu dizesi, oturum durumu, sayfadaki denetimler vb. gibi çeşitli kaynaklardan otomatik olarak çekilebilir veya programlı olarak atanabilir. Bu öğreticide, parametreli sorguların nasıl tanımlanacağını ve parametre değerlerinin hem bildirimli hem de programlı olarak nasıl belirtileceğini göreceğiz.
Uyarı
Önceki öğreticide, ilk 46 öğreticide tercih ettiğimiz araç olan ObjectDataSource'u SqlDataSource ile karşılaştırdık ve kavramsal benzerliklerine dikkat çektik. Bu benzerlikler parametrelere de uzanır. ObjectDataSource'un parametreleri, İş Mantığı Katmanı'ndaki yöntemler için giriş parametreleriyle eşlenir. SqlDataSource ile parametreler doğrudan SQL sorgusu içinde tanımlanır. Her iki denetimin de , Select(), Insert()ve Update() yöntemleri için parametre koleksiyonları Delete()vardır ve her ikisinde de bu parametre değerleri önceden tanımlanmış kaynaklardan (sorgu dizesi değerleri, oturum değişkenleri vb.) doldurulabilir veya program aracılığıyla atanabilir.
Parametreli sorgu oluşturma
SqlDataSource denetiminin Veri Kaynağını Yapılandır sihirbazı, veritabanı kayıtlarını almak için yürütülecek komutu tanımlamak için üç yol sunar:
- Varolan 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ümceye WHERE ilişkin parametrelerin Yan Tümce Ekle WHERE iletişim kutusu aracılığıyla belirtilmesi gerekir. Bununla birlikte, özel bir SQL deyimi oluştururken, parametreleri doğrudan yan tümceye WHERE girebilirsiniz (her parametreyi belirtmek için kullanarak @parameterName ). Saklı yordam bir veya daha fazla SQL deyiminden oluşur ve bu deyimler parametreleştirilebilir. Bununla birlikte, SQL deyimlerinde kullanılan parametreler, saklı yordama giriş parametreleri olarak geçirilmelidir.
Parametreli bir sorgu oluşturmak SqlDataSource s'un SelectCommand nasıl belirtildiğine bağlı olduğundan, üç yaklaşıma da göz atalım. Başlamak için klasördeki sayfayı açınParameterizedQueries.aspx, Araç Kutusu'ndan SqlDataSource bir SqlDataSource denetimini Tasarımcı'ya sürükleyin ve olarak IDayarlayınProducts25BucksAndUnderDataSource. Ardından, kontrolün akıllı etiketinden Veri Kaynağını Yapılandır bağlantısını tıklayın. Kullanılacak veritabanını seçin (NORTHWINDConnectionString) ve İleri'ye tıklayın.
Adım 1: Bir 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ır sihirbazı yalnızca mevcut bir tablodan veya görünümden döndürülecek sütunları seçmemize olanak tanır (bkz. Şekil 1). Bunu yapmak otomatik olarak bir SQL SELECT deyimi oluşturur ve bu deyim SqlDataSource yöntemi Select() çağrıldığında veritabanına gönderilir. Önceki öğreticide yaptığımız gibi, açılan listeden Ürünler tablosunu seçin ve , ProductIDve ProductName sütunlarını kontrol edinUnitPrice.
Şekil 1: Bir 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)
Deyime WHERE bir SELECT yan tümce eklemek için, Yan Tümce Ekle WHERE iletişim kutusunu getiren düğmeyi tıklatı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 verilerin filtreleneceği sütunu seçin. Ardından, filtreleme için kullanılacak işleci seçin (=, <, <=, >vb.). Son olarak, sorgu dizesi veya oturum durumu gibi parametre değerinin kaynağını seçin. Parametreyi yapılandırdıktan sonra, sorguya SELECT dahil etmek için Ekle düğmesine tıklayın.
Bu örnekte, yalnızca değerin 25,00 TL'ye UnitPrice eşit veya daha küçük olduğu sonuçları döndürelim. Bu nedenle, Sütun açılır listesinden ve UnitPriceİşleç açılır listesinden = öğesini seçin<. Sabit kodlanmış bir parametre değeri (örneğin, $25.00) 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'e sabit kodlanmış parametre değerini girin ve Ekle düğmesine tıklayarak işlemi tamamlayın.
Şekil 2: Yan Tümce Ekle WHERE İletişim Kutusundan Döndürülen Sonuçları Sınırla (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Parametreyi ekledikten sonra, Veri Kaynağını Yapılandır sihirbazına dönmek için Tamam'ı tıklatın. Sihirbazın SELECT altındaki deyim artık şu adlı WHEREbir parametreye sahip bir @UnitPrice yan tümce içermelidir:
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
Uyarı
Yan Tümce Ekle WHERE iletişim kutusundan yan tümcede WHERE birden çok koşul belirtirseniz, sihirbaz bunları işleçle AND birleştirir. Yan tümceye bir ORWHERE eklemeniz gerekiyorsa (örneğin WHERE UnitPrice <= @UnitPrice OR Discontinued = 1) o zaman deyimi SELECT özel SQL deyimi ekranı aracılığıyla oluşturmanız gerekir.
SqlDataSource'u yapılandırmayı tamamlayın (İleri'ye ve ardından Son'a tıklayın) ve ardından SqlDataSource'un bildirim temelli işaretlemesini inceleyin. İşaretleme artık, içindeki <SelectParameters>parametreler için kaynakları açıklayan bir SelectCommand 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 yöntemi Select() çağrıldığında, UnitPrice parametre değeri (25.00) veritabanına gönderilmeden önce parametreye @UnitPrice uygulanırSelectCommand. Net sonuç, tablodan Products yalnızca 25,00 ABD dolarına eşit veya daha düşük olan ürünlerin döndürülmesidir. Bunu onaylamak için sayfaya bir GridView ekleyin, bu veri kaynağına bağlayın ve ardından sayfayı bir tarayıcı aracılığıyla görüntüleyin. Şekil 3'ün onayladığı gibi, yalnızca 25,00 ABD dolarına eşit veya daha az olan ürünlerin listelendiğini görmelisiniz.
Şekil 3: Yalnızca 25,00 ABD dolarından küçük veya buna eşit olan Ü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 bir SQL deyimine parametre ekleme
Özel bir SQL deyimi eklerken, yan tümceyi WHERE açıkça girebilir veya Sorgu Oluşturucusu'nun Filtre hücresinde bir değer belirtebilirsiniz. Bunu göstermek için, bir GridView'da yalnızca fiyatları belirli bir eşiğin altında olan ürünleri gösterelim. Kullanıcıdan bu eşik değerini toplamak için sayfaya bir TextBox ParameterizedQueries.aspx ekleyerek başlayın. TextBox s özelliğini ID şu şekilde MaxPriceayarlayın: . Bir 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'ı sayfaya sürükleyin ve akıllı etiketinden adlı yeni bir SqlDataSource ProductsFilteredByPriceDataSourceoluşturmayı seçin. Veri Kaynağını Yapılandır sihirbazından, Özel bir SQL deyimi veya saklı yordam belirtin ekranına ilerleyin (bkz. Şekil 4) ve aşağıdaki sorguyu girin:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice
Sorguyu girdikten sonra (manuel olarak veya Sorgu Oluşturucu aracılığıyla), İleri'ye tıklayın.
Şekil 4: Yalnızca Bir Parametre Değerinden Küçük veya Ona Eşit Ürünleri Döndür (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sorgu parametreler içerdiğinden, sihirbazdaki bir sonraki ekran bize parametre değerlerinin kaynağını sorar. Parametre kaynağı açılan listesinden Denetim'i ve MaxPrice ControlID açılan listesinden (TextBox denetiminin değeri ID ) öğesini seçin. Ayrıca, kullanıcının TextBox'a MaxPrice herhangi bir metin girmediği durumda kullanmak üzere isteğe bağlı bir varsayılan değer de girebilirsiniz. Şimdilik, varsayılan bir değer girmeyin.
Şekil 5: TextBox'ın MaxPriceText Özelliği Parametre Kaynağı Olarak Kullanılır (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Veri Kaynağını Yapılandır sihirbazını tamamlamak için İleri'yi ve ardından Son'u tıklatı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> parametrenin, ve ControlParametergibi ControlID ek özellikler içeren bir PropertyNameolduğunu unutmayın. SqlDataSource yöntemi Select() çağrıldığında, belirtilen ControlParameter Web denetimi özelliğinden değeri alır ve içindeki ilgili parametreye SelectCommandatar. Bu örnekte, MaxPrice parametre değeri olarak @MaxPrice s Text özelliği kullanılmıştır.
Bu sayfayı bir tarayıcı aracılığıyla görüntülemek için bir dakikanızı ayırın. Sayfayı ilk kez ziyaret ettiğinizde veya TextBox'ta MaxPrice bir değer eksik olduğunda, GridView'da hiçbir kayıt görüntülenmez.
Şekil 6: Metin Kutusu Boş Olduğunda MaxPrice Hiçbir 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, bir parametre değeri için boş bir dizenin bir 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ülmez.
Metin kutusuna 5,00 gibi bir değer girin ve Eşleşen Ürünleri Görüntüle düğmesini tıklayın. Geri göndermede SqlDataSource, GridView'a parametre kaynaklarından birinin değiştiğini bildirir. Sonuç olarak, GridView SqlDataSource'a yeniden bağlanır ve bu ürünleri 5,00 ABD dolarına eşit veya daha küçük görüntüler.
Şekil 7: 5,00 ABD dolarından küçük veya buna eşit Ürünler Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Başlangıçta Tüm Ürünler Gösteriliyor
Sayfa ilk yüklendiğinde hiçbir ürün göstermemek yerine, tüm ürünleri görüntülemek isteyebiliriz. TextBox boş olduğunda MaxPrice tüm ürünleri listelemenin bir yolu, parametrenin varsayılan değerini 10000000 gibi delicesine yüksek bir değere ayarlamaktır, çünkü Northwind Traders'ın birim fiyatı 1.000.000 $ 'ı aşan envantere sahip olması pek olası değildir. Ancak, bu yaklaşım dar görüşlüdür ve diğer durumlarda işe yaramayabilir.
Önceki derslerde - Bildirime Dayalı Parametreler ve Ana/Detay Filtreleme DropDownList ile benzer bir sorunla karşı karşıya kaldık. Oradaki çözümümüz bu mantığı Business Logic Layer'a koymaktı. Özellikle, BLL gelen değeri inceledi ve eğer veya NULL ayrılmış bir değerse, ç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 parametreli WHERE bir yan tümce kullanan bir SQL deyimini yürüten DAL yöntemine bir çağrı yapıldı.
Ne yazık ki, SqlDataSource kullanırken mimariyi atlıyoruz. Bunun yerine, parametre @MaximumPrice veya ayrılmış bir değer varsa NULL tüm kayıtları akıllıca almak için SQL ifadesini özelleştirmemiz gerekir. Bu alıştırma için, parametre 'ye @MaximumPriceeşitse -1.0, tüm kayıtların döndürülmesi için bunu yapalım (-1.0 hiçbir ürün negatif UnitPrice bir değere sahip olamayacağından ayrılmış bir değer olarak çalışır). Bunu başarmak için aşağıdaki SQL ifadesini kullanabiliriz:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
Bu yan tümce, WHERE parametre eşittirse @MaximumPrice kayıtları -1.0 döndürür. Parametre değeri değilse-1.0, yalnızca parametre değerinden küçük veya parametre UnitPrice değerine eşit olan @MaximumPrice ürünler döndürülür. Parametrenin @MaximumPrice-1.0varsayılan değeri olarak ayarlandığında, ilk sayfa yüklemesinde (veya TextBox boş olduğunda MaxPrice ) @MaximumPrice değerine -1.0 sahip olur ve tüm ürünler görüntülenir.
Şekil 8: Artık Metin Kutusu Boş Olduğunda MaxPrice 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 ilgili dikkat edilmesi gereken birkaç uyarı var. İlk olarak, parametrenin veri türünün SQL sorgusundaki kullanımıyla çıkarıldığını fark edin. 'den 'ye WHERE@MaximumPrice = -1.0değiştirirseniz@MaximumPrice = -1, çalışma zamanı parametreyi bir tamsayı olarak değerlendirir. Daha sonra TextBox'ı MaxPrice ondalık bir değere (5,00 gibi) atamayı denerseniz, 5,00'ı bir tamsayıya dönüştüremediği için bir hata oluşur. Bunu düzeltmek için, yan tümcede kullandığınızdan @MaximumPrice = -1.0WHERE emin olun veya daha da iyisi, nesnenin ControlParameter özelliğini Decimal olarak ayarlayınType.
İkinci olarak, yan tümceye OR @MaximumPrice = -1.0 eklendiğindeWHERE, sorgu motoru üzerinde UnitPrice bir dizin kullanamaz (bir tane olduğu varsayılarak), bu nedenle bir tablo taramasına neden olur. Tabloda yeterince fazla sayıda kayıt Products varsa bu durum performansı etkileyebilir. Bu mantığı, bir dizinin kullanılabilmesi için tüm IF kayıtların döndürülmesi gerektiğinde bir deyimin SELECT yan tümce olmadan tablodan bir ProductsWHERE sorgu gerçekleştirdiği veya yan tümcesi yalnızca ölçütleri içeren bir WHERE deyimin bulunduğu saklı bir yordama UnitPrice taşımak daha iyi bir yaklaşım olabilir.
3. Adım: Parametreli Saklı Yordamlar Oluşturma ve Kullanma
Saklı yordamlar, daha sonra saklı yordam içinde tanımlanan SQL deyimlerinde kullanılabilecek bir dizi giriş parametresi içerebilir. SqlDataSource'u 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ın kullanımını göstermek için, Northwind veritabanında GetProductsByCategoryadlı yeni bir saklı yordam oluşturalım, adlı bir parametreyi @CategoryID 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 NORTHWND.MDF detaya gidin. (Sunucu Gezgini'ni görmüyorsanız, Görünüm menüsüne gidip Sunucu Gezgini seçeneğini belirleyerek açın.)
Veritabanından NORTHWND.MDF Saklı Yordamlar klasörüne sağ tıklayın, Yeni Saklı Yordam Ekle'yi seçin ve aşağıdaki sözdizimini 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ıklatarak ve Yürüt'ü seçerek test edebilirsiniz. Bu sizden saklı yordamın parametrelerini (@CategoryID, bu örnekte) isteyecek ve ardından sonuçlar Çıkış penceresinde görüntülenecektir.
Şekil 9: 1 GetProductsByCategory ile @CategoryID Yürütüldüğünde Saklı Prosedür (Tam boyutlu görüntüyü görüntülemek için tıklayın)
İçecekler kategorisindeki tüm ürünleri bir GridView'da görüntülemek için bu saklı yordamı kullanalım. Sayfaya yeni bir GridView ekleyin ve adlı yeni bir SqlDataSource'a BeverageProductsDataSourcebağlayın. Özel bir SQL deyimi veya saklı yordam belirtin ekranına devam edin, Saklı yordam radyo düğmesini seçin ve açılan listeden saklı yordamı seçin GetProductsByCategory .
Ş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ıklamak bu parametrenin değeri için kaynağı belirtmemizi ister. İçecekler 1'dir CategoryID , bu nedenle Parametre kaynağı açılır listesini Yok'ta bırakın ve VarsayılanDeğer metin kutusuna 1 girin.
Şekil 11: İçecek Kategorisindeki Ürünleri İade Etmek için 1 Hard-Coded Değerini Kullanın (Tam boyutlu resmi görüntülemek için tıklayın)
Aşağıdaki bildirim temelli işaretlemenin gösterdiği gibi, bir saklı yordam kullanılırken, SqlDataSource s SelectCommand özelliği saklı yordamın adına ayarlanır ve SelectCommandType özellikStoredProcedure, 'nin geçici bir SQL deyimi yerine saklı yordamın adı olduğunu SelectCommand gösterir.
<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>
Sayfayı bir tarayıcıda test edin. Yalnızca İçecekler kategorisine ait olan ürünler görüntülenir, ancak saklı yordam tablodaki tüm sütunları döndürdüğü için GetProductsByCategory ürün alanları görüntülenirProducts. Elbette, GridView'ın Sütunları Düzenle iletişim kutusundan GridView'da görüntülenen alanları sınırlayabilir veya özelleştirebiliriz.
Şekil 12: Tüm İçecekler Görüntüleniyor (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 ve bu öğreticide şu ana kadar gördüğümüz örnekler, SqlDataSource denetimlerini doğrudan bir GridView'a bağlamıştır. Ancak SqlDataSource denetiminin verilerine program aracılığıyla erişilebilir ve kodda numaralandırılabilir. Bu, özellikle verileri incelemek için sorgulamanız gerektiğinde, ancak görüntülemeniz gerekmediğinde yararlı olabilir. Veritabanına bağlanmak, komutu belirtmek ve sonuçları almak için tüm ortak ADO.NET kodunu yazmak zorunda kalmak yerine, SqlDataSource'un bu monoton kodu işlemesine izin verebilirsiniz.
SqlDataSource'un verileriyle programlı olarak ç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. Yani bir kullanıcı bu sayfayı ziyaret ettiğinde tablodan Categories rastgele bir kategori seçmek, kategori adını göstermek ve ardından o kategoriye ait ürünleri listelemek istiyoruz.
Bunu başarmak için, biri tablodan rastgele bir kategori almak ve diğeri kategorinin Categories ürünlerini almak için olmak üzere iki SqlDataSource denetimine ihtiyacımız var. Bu adımda rastgele bir kategori kaydı alan SqlDataSource'u oluşturacağız; 5. adımda, kategorinin ürünlerini alan SqlDataSource'un oluşturulmasına göz atılır.
öğesine bir SqlDataSource ParameterizedQueries.aspx ekleyerek başlayın ve değerini IDRandomCategoryDataSourceolarak ayarlayı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()rasgele sıraya göre sıralanmış kayıtları döndürür (bkz. Kayıtları Rasgele Sıralamak İçin KullanmaNEWID()).
SELECT TOP 1 Sonuç kümesinden ilk kaydı döndürür. Bir araya getirildiğinde, bu sorgu rastgele seçilen tek bir kategoriden ve CategoryID sütun değerlerini döndürürCategoryName.
Kategorinin CategoryName değerini görüntülemek için, sayfaya bir Etiket Web denetimi ekleyin, özelliğini IDolarak ayarlayın CategoryNameLabel ve özelliğini temizleyinText. Verileri bir SqlDataSource denetiminden program aracılığıyla almak için yöntemini Select() çağırmamız gerekir. yöntemi Select() , verilerin döndürülmeden önce nasıl ileti gönderilmesi 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 verileri sıralarken veya sayfalama yaparken veri Web denetimleri tarafından kullanılır. Örneğimiz için, verilerin döndürülmeden önce değiştirilmesine ihtiyacımız yok ve bu nedenle nesneye DataSourceSelectArguments.Empty geçeceğiz.
yöntemi Select() , uygulayan IEnumerablebir nesne döndürür. Döndürülen kesin tür, SqlDataSource denetiminin DataSourceMode özelliğinin değerine bağlıdır. Önceki öğreticide açıklandığı gibi, bu özellik ya da DataSetDataReaderdeğerine ayarlanabilir. olarak ayarlanırsa DataSet, Select() yöntem bir DataView nesnesi döndürür; olarak ayarlanırsa DataReader, uygulayan IDataReaderbir nesne döndürür. SqlDataSource'un RandomCategoryDataSourceDataSourceMode özelliği (varsayılan) olarak DataSet ayarlandığından, bir DataView nesnesiyle çalışacağız.
Aşağıdaki kod, SqlDataSource'tan RandomCategoryDataSource kayıtların DataView olarak nasıl alınacağını ve ilk DataView satırından sütun değerinin nasıl okunacağını CategoryName gösterir:
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'da ilkini DataRowView döndürür.
randomCategoryView[0]["CategoryName"] Bu ilk satırdaki sütunun CategoryName değerini döndürür. DataView'ın gevşek bir şekilde yazıldığını unutmayın. Belirli bir sütun değerine başvurmak için sütunun adını bir dize olarak iletmemiz gerekir ( bu durumda CategoryName). Şekil 13, sayfayı görüntülerken görüntülenen CategoryNameLabel mesajı göstermektedir. Elbette, görüntülenen gerçek kategori adı, sayfaya yapılan her ziyarette (geri göndermeler dahil) SqlDataSource tarafından RandomCategoryDataSource rastgele seçilir.
Ş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)
Uyarı
SqlDataSource denetiminin DataSourceMode özelliği olarak DataReaderayarlanmışsa, yöntemden Select() döndürülen değerin öğesine IDataReaderçevrilmesi gerekirdi. İlk satırdan sütun değerini okumak CategoryName 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.
Uyarı
Kategorinin adını görüntülemek için bir Etiket Web denetimi kullanmak yerine, sayfaya bir FormView veya DetailsView ekleyerek bunu SqlDataSource'a bağlayabilirdik. Ancak Label'ı kullanmak, SqlDataSource'un Select() deyimini programlama yoluyla nasıl çağıracağımızı ve sonuçta elde edilen verilerle kodda nasıl çalışacağımızı keşfetmemize olanak sağladı.
Adım 5: Parametre Değerlerini Programlı Olarak Atama
Bu öğreticide şu ana kadar gördüğümüz tüm örneklerde sabit kodlanmış bir parametre değeri veya önceden tanımlanmış parametre kaynaklarından birinden (sorgu dizesi değeri, sayfadaki bir Web denetimi vb.) alınan bir değer kullanılmıştır. Ancak, SqlDataSource denetiminin parametreleri program aracılığıyla da ayarlanabilir. Mevcut ö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 CategoryID sütun değerine göre CategoryID değeri ayarlanması gereken bir RandomCategoryDataSource parametreye Page_Load sahip olacaktır.
Sayfaya bir GridView ekleyerek başlayın ve adlı yeni bir SqlDataSource'a ProductsByCategoryDataSourcebağlayın. 3. Adımda yaptığımız gibi, SqlDataSource'u saklı yordamı GetProductsByCategory çağıracak şekilde yapılandırın. Parametre kaynağı açılır listesini Yok olarak bırakın, ancak bu varsayılan değeri programlı olarak ayarlayacağımız için varsayılan bir değer girmeyin.
Şekil 14: Parametre Kaynağı veya Varsayılan Değer Belirtme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
SqlDataSource sihirbazını tamamladı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>
Parametreyi DefaultValue olay işleyicisinde CategoryID programlı olarak atayabilirizPage_Load:
// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
randomCategoryView[0]["CategoryID"].ToString();
Bu eklemeyle, sayfa rastgele seçilen kategoriyle ilişkili ürünleri gösteren bir GridView içerir.
Şekil 15: Parametre Kaynağı veya Varsayılan Değer Belirtme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Özet
SqlDataSource, sayfa geliştiricilerinin parametre değerleri sabit kodlanabilen, ö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 sorgunun nasıl oluşturulacağını 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 verilerini değiştirmek için yetenekler sağlar. Sonraki öğreticide, SqlDataSource ile , INSERTve UPDATE deyimlerinin nasıl tanımlanacağına DELETEbakacağı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ışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. 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, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.
ile