SqlDataSource ile Parametreli Sorgular Kullanma (VB)
tarafından Scott Mitchell
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 SELECT
WHERE
, 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 @parameterName
belirtilir:
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource, hem deyimler hem de , UPDATE
ve INSERT
DELETE
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 ID
Products25BucksAndUnderDataSource
ayarlayı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 , ProductName
ve UnitPrice
sütunlarını denetleyinProductID
.
Ş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.
Ş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ı @UnitPrice
parametreye 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 WHERE
OR
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 SelectCommand
kaynakları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.
Ş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 MaxPrice
ayarlayı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ı ProductsFilteredByPriceDataSource
yeni 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.
Ş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.
Ş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 PropertyName
gibi ControlID
ek özellikleri içeren bir ControlParameter
olduğ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 SelectCommand
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 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.
Ş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.
Ş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.0
tü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.0
bu 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.0
varsayı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.
Ş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 = -1
değ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ı GetProductsByCategory
yeni 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 (@CategoryID
bu örnekte) ister ve ardından sonuçlar Çıkış penceresinde görüntülenir.
Ş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ı BeverageProductsDataSource
yeni 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.
Ş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.
Ş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.
Ş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 RandomCategoryDataSource
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()
, 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 CategoryNameLabel
ayarlayı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 DataSourceSelectArguments
tek 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 IEnumerable
bir 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 DataReader
değerine DataSet
ayarlanabilir. olarak ayarlanırsaDataSet
Select()
, yöntemi bir DataView nesnesi döndürür; olarak ayarlanırsa DataReader
uygulayan IDataReader
bir 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.
Ş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 DataReader
ayarlanmışsa, yönteminden dönüş değerinin Select()
öğesine yayınlanması IDataReader
gerekirdi. İ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ı ProductsByCategoryDataSource
yeni 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.
Ş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.
Ş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, , UPDATE
ve DELETE
deyimlerinin SqlDataSource ile nasıl tanımlanacağına INSERT
bakacağı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.