SqlDataSource ile Parametreli Sorgular Kullanma (C#)
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 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 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 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 @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 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 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). 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 , ProductName
ve UnitPrice
sütunlarını işaretleyinProductID
.
Ş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.
Ş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ı @UnitPrice
parametreye 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 SelectCommand
kaynakları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.
Ş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 MaxPrice
ayarlayı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ı ProductsFilteredByPriceDataSource
yeni 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.
Ş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.
Ş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 PropertyName
gibi ControlID
ek özellikleri içeren bir ControlParameter
olduğunu unutmayın. SqlDataSource yöntemi Select()
çağrıldığında, ControlParameter
değeri belirtilen Web denetimi özelliğinden alır ve içindeki SelectCommand
ilgili 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.
Ş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.
Ş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 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.
Ş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())
{
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ı ProductsByCategoryDataSource
yeni 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.
Ş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 DefaultValue
CategoryID
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.
Ş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 , UPDATE
ve DELETE
deyimlerinin 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 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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin