Hesaplanan Sütunlar ile Çalışma (VB)
tarafından Scott Mitchell
Microsoft SQL Server veritabanı tablosu oluştururken, değeri genellikle aynı veritabanı kaydındaki diğer değerlere başvuran bir ifadeden hesaplanan hesaplanan bir sütun tanımlamanıza olanak tanır. Bu tür değerler veritabanında salt okunurdur ve TableAdapters ile çalışırken dikkat edilmesi gereken özel noktalar gerekir. Bu öğreticide, hesaplanan sütunların neden olduğu zorlukları nasıl karşılayacağınızı öğreneceğiz.
Giriş
Microsoft SQL Server, değerleri genellikle aynı tablodaki diğer sütunlardaki değerlere başvuran bir ifadeden hesaplanan sütunlar olan hesaplanan sütunlara izin verir. Örneğin, zaman izleme veri modellerinde , , Rate
EmployeeID
ve Duration
gibi sütunların da bulunduğu ServicePerformed
adlı ServiceLog
bir tablo olabilir. Hizmet öğesi başına ödenmesi gereken tutar (süreyle çarpılan oran) bir web sayfası veya başka bir program arabirimi aracılığıyla hesaplanabilirken, tabloya bu bilgileri bildiren adlı AmountDue
bir sütun ServiceLog
eklemek yararlı olabilir. Bu sütun normal bir sütun olarak oluşturulabilir, ancak veya Duration
sütun değerleri her değiştiğinde Rate
güncelleştirilmiş olması gerekir. daha iyi bir yaklaşım, ifadesini Rate * Duration
kullanarak sütunu hesaplanan bir sütun yapmaktırAmountDue
. Bunun yapılması, SQL Server bir sorguda AmountDue
başvurulduysa sütun değerini otomatik olarak hesaplamasına neden olur.
Hesaplanan sütunun değeri bir ifade tarafından belirlendiğinden, bu tür sütunlar salt okunurdur ve bu nedenle veya UPDATE
deyimlerinde INSERT
bunlara atanmış değerler olamaz. Ancak, hesaplanan sütunlar geçici SQL deyimleri kullanan bir TableAdapter için ana sorgunun parçası olduğunda, otomatik olarak oluşturulan INSERT
ve UPDATE
deyimlerine eklenirler. Sonuç olarak, TableAdapter'ın INSERT
ve UPDATE
sorgularının ve UpdateCommand
InsertCommand
özelliklerinin hesaplanan sütunların başvurularını kaldıracak şekilde güncelleştirilmiş olması gerekir.
Geçici SQL deyimleri kullanan bir TableAdapter ile hesaplanan sütunları kullanmanın bir zorluğu, TableAdapter Yapılandırma sihirbazı her tamamlandığında TableAdapter s INSERT
ve UPDATE
sorgularının otomatik olarak yeniden üretiliyor olmasıdır. Bu nedenle, sihirbaz yeniden çalıştırılırsa hesaplanan sütunlar ve UPDATE
sorgularından INSERT
el ile kaldırılır. Saklı yordamları kullanan TableAdapters bu kırılganlıktan etkilenmese de, 3. Adımda ele alacakları kendi ilginçlikleri vardır.
Bu öğreticide, Northwind veritabanındaki tabloya Suppliers
hesaplanan bir sütun ekleyecek ve ardından bu tablo ve hesaplanan sütunuyla çalışmak için karşılık gelen bir TableAdapter oluşturacağız. TableAdapter Yapılandırma sihirbazı kullanıldığında özelleştirmelerimizin kaybolmaması için geçici SQL deyimleri yerine TableAdapter saklı yordamlarımızı kullanacağız.
Haydi başlayalım!
1. Adım: TabloyaSuppliers
Hesaplanan Sütun Ekleme
Northwind veritabanında hesaplanan sütun olmadığından kendi sütununu eklememiz gerekir. Bu öğretici için, tabloya Suppliers
kişinin adını, unvanını ve çalıştıkları şirketi şu biçimde döndüren adlı FullContactName
bir hesaplanan sütun ekleyelim: ContactName
(ContactTitle
, CompanyName
). Bu hesaplanan sütun, tedarikçilerle ilgili bilgiler görüntülenirken raporlarda kullanılabilir.
Sunucu Gezgini'nde tabloya Suppliers
sağ tıklayıp bağlam menüsünden Suppliers
Tablo Tanımını Aç'ı seçerek tablo tanımını açarak başlayın. Bu, tablonun sütunlarını ve veri türleri, izin verip vermedikleri NULL
vb. gibi özelliklerini görüntüler. Hesaplanan sütun eklemek için, tablo tanımına sütunun adını yazarak başlayın. Ardından, sütun Özellikler penceresi Hesaplanan Sütun Belirtimi bölümünün altındaki (Formül) metin kutusuna ifadesini girin (bkz. Şekil 1). Hesaplanan sütunu FullContactName
adlandırın ve aşağıdaki ifadeyi kullanın:
ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN
ContactTitle + ', ' ELSE '' END + CompanyName + ')'
Dizelerin işleci kullanılarak +
SQL'de birleştirilebileceğini unutmayın. deyimi CASE
, geleneksel bir programlama dilinde koşullu gibi kullanılabilir. Yukarıdaki ifadede CASE
deyimi şu şekilde okunabilir: Değilse ContactTitle
NULL
ContactTitle
değeri virgülle birleştirir, aksi takdirde hiçbir şey yaymaz. deyiminin kullanışlılığı CASE
hakkında daha fazla bilgi için bkz. SQL CASE
Deyimleri.
Not
Burada bir CASE
deyimi kullanmak yerine alternatif olarak kullanabilirdik ISNULL(ContactTitle, '')
. ISNULL(checkExpression, replacementValue)
null değilse checkExpression döndürür, aksi takdirde replacementValue döndürür. Ya da ISNULL
CASE
bu örnekte çalışacak olsa da, deyiminin esnekliğinin CASE
ile ISNULL
eşleştirilemediği daha karmaşık senaryolar vardır.
Bu hesaplanan sütunu ekledikten sonra ekranınız Şekil 1'deki ekran görüntüsü gibi görünmelidir.
Şekil 1: Tabloya Suppliers
Adlı FullContactName
Hesaplanan Sütun Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Hesaplanan sütunu adlandırdıktan ve ifadesini girdikten sonra, araç çubuğundaki Kaydet simgesine tıklayarak, Ctrl+S tuşlarına basarak veya Dosya menüsüne gidip Kaydet'i seçerek tablodaki değişiklikleri kaydedin Suppliers
.
Tablonun kaydedilmesi, tablo sütun listesindeki yeni eklenen sütun da dahil olmak üzere Sunucu Gezgini'ni Suppliers
yenilemelidir. Ayrıca, (Formül) metin kutusuna girilen ifade otomatik olarak gereksiz boşluğu silen, sütun adlarını köşeli ayraç[]
() içine alan ve işlemlerin sırasını daha açık bir şekilde göstermek için parantezler içeren eşdeğer bir ifadeye ayarlanır:
(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL
then [ContactTitle]+', ' else '' end)+[CompanyName])+')')
Microsoft SQL Server'da hesaplanan sütunlar hakkında daha fazla bilgi için teknik belgelere bakın. Ayrıca, hesaplanan sütunlar oluşturma adım adım izlenecek yol için Nasıl yapılır: Hesaplanan Sütunları Belirtme makalesine de göz atın.
Not
Varsayılan olarak, hesaplanan sütunlar fiziksel olarak tabloda depolanmaz, bunun yerine sorguda her başvurulduğunda yeniden hesaplanır. Ancak KalıcıDır onay kutusunu işaretleyerek SQL Server hesaplanan sütunu tabloda fiziksel olarak depolamasını bildirebilirsiniz. Bunun yapılması hesaplanan sütunda dizin oluşturulmasına olanak tanır ve bu da yan tümcelerinde WHERE
hesaplanan sütun değerini kullanan sorguların performansını geliştirebilir. Daha fazla bilgi için bkz. Hesaplanan Sütunlarda Dizin Oluşturma .
2. Adım: Hesaplanan Sütunun Değerlerini Görüntüleme
Veri Erişim Katmanı üzerinde çalışmaya başlamadan önce değerleri görüntülemek FullContactName
bir dakika sürebilir. Sunucu Gezgini'nden tablo adına sağ tıklayın Suppliers
ve bağlam menüsünden Yeni Sorgu'yu seçin. Bu, sorguya eklenecek tabloları seçmemizi isteyen bir Sorgu penceresi açar. Suppliers
Tabloyu ekleyin ve Kapat'a tıklayın. Ardından, Sağlayıcılar tablosundaki CompanyName
, ContactName
, ContactTitle
ve FullContactName
sütunlarını denetleyin. Son olarak, sorguyu yürütmek ve sonuçları görüntülemek için Araç Çubuğu'ndaki kırmızı ünlem işareti simgesine tıklayın.
Şekil 2'de gösterildiği gibi, sonuçlar FullContactName
, ve ContactTitle
sütunlarını (ContactTitle
, CompanyName
) biçimini ContactName
kullanarak listeleyen CompanyName
ContactName
içerir.
Şekil 2: Biçimi FullContactName
ContactName
Kullanır (ContactTitle
, CompanyName
) (Tam boyutlu görüntüyü görüntülemek için tıklayın)
3. Adım: Veri Erişim Katmanına eklemeSuppliersTableAdapter
Uygulamamızdaki tedarikçi bilgileriyle çalışmak için öncelikle DAL'mizde bir TableAdapter ve DataTable oluşturmamız gerekir. İdeal olarak, bu, önceki öğreticilerde incelenen aynı basit adımlar kullanılarak gerçekleştirilebilir. Ancak, hesaplanan sütunlarla çalışmak tartışmayı değerlendiren birkaç kırışıklık ortaya konur.
Geçici SQL deyimleri kullanan bir TableAdapter kullanıyorsanız, TableAdapter Yapılandırma sihirbazı aracılığıyla TableAdapter'ın ana sorgusuna hesaplanan sütunu ekleyebilirsiniz. Ancak bu, hesaplanan sütunu içeren ve UPDATE
deyimlerini otomatik olarak oluştururINSERT
. Bu yöntemlerden birini yürütmeye çalışırsanız ColumnName SqlException
sütunu hesaplanan bir sütun olduğundan veya UNION işlecinin sonucu olduğundan columnName sütunu değiştirilemiyor iletisiyle oluşturulur. INSERT
ve UPDATE
deyimi TableAdapter s InsertCommand
ve UpdateCommand
özellikleri aracılığıyla el ile ayarlanabilir ancak TableAdapter Yapılandırma sihirbazı yeniden çalıştırıldığında bu özelleştirmeler kaybolur.
Geçici SQL deyimlerini kullanan TableAdapters'ın kırılganlığı nedeniyle, hesaplanan sütunlarla çalışırken saklı yordamları kullanmamız önerilir. Mevcut saklı yordamları kullanıyorsanız, Typed DataSet'in TableAdapers öğreticisi için Varolan Saklı Yordamları Kullanma öğreticisinde açıklandığı gibi TableAdapter'ı yapılandırmanız yeterlidir. Saklı yordamları sizin için TableAdapter sihirbazı oluşturduysa, ancak başlangıçta ana sorgudan hesaplanan sütunları atlamalısınız. Ana sorguya hesaplanan bir sütun eklerseniz TableAdapter Yapılandırma sihirbazı, tamamlandıktan sonra ilgili saklı yordamları oluşturamayacağını size bildirir. Kısacası, tableAdapter'ı başlangıçta hesaplanmış sütun içermeyen bir ana sorgu kullanarak yapılandırmamız ve ardından karşılık gelen saklı yordamı ve TableAdapter'ları SelectCommand
hesaplanan sütunu içerecek şekilde el ile güncelleştirmemiz gerekir. Bu yaklaşım, TableAdapter'ı KullanmaJOIN
öğreticisinde kullanılan yaklaşıma benzer.
Bu öğretici için yeni bir TableAdapter ekleyelim ve bizim için saklı yordamları otomatik olarak oluşturmasını sağlayalım. Sonuç olarak, hesaplanan sütunu başlangıçta ana sorgudan atlamalıyız FullContactName
.
İlk olarak klasöründeki NorthwindWithSprocs
DataSet'i ~/App_Code/DAL
açın. Tasarım Aracı sağ tıklayın ve bağlam menüsünden yeni bir TableAdapter eklemeyi seçin. Bu işlem TableAdapter Yapılandırma sihirbazını başlatır. Veri sorgulamak için veritabanını belirtin (NORTHWNDConnectionString
kaynak Web.config
) ve İleri'ye tıklayın. Tabloyu sorgulamak veya değiştirmek Suppliers
için henüz herhangi bir saklı yordam oluşturmadığımız için, sihirbazın bunları bizim için oluşturması için Yeni saklı yordamlar oluştur seçeneğini belirleyin ve İleri'ye tıklayın.
Şekil 3: Yeni saklı yordam oluştur Seçeneğini belirleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sonraki adım bizden ana sorguyu ister. Her sağlayıcı için , CompanyName
, ContactName
ve ContactTitle
sütunlarını SupplierID
döndüren aşağıdaki sorguyu girin. Bu sorgunun hesaplanan sütunu (FullContactName
) bilerek atladığını unutmayın; ilgili saklı yordamı 4. Adım'da bu sütunu içerecek şekilde güncelleştireceğiz.
SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers
Ana sorguyu girip İleri'ye tıkladıktan sonra sihirbaz, oluşturacağı dört saklı yordamı adlandırmamıza olanak tanır. Şekil 4'de gösterildiği gibi, bu saklı yordamları Suppliers_Select
, Suppliers_Insert
Suppliers_Update
, ve Suppliers_Delete
olarak adlandırın.
Şekil 4: Otomatik Oluşturulan Saklı Yordamların Adlarını Özelleştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sonraki sihirbaz adımı TableAdapter yöntemlerini adlandırmamıza ve verilere erişmek ve verileri güncelleştirmek için kullanılan desenleri belirtmemize olanak tanır. Üç onay kutusunun tümünü de işaretli bırakın, ancak yöntemini GetSuppliers
olarak yeniden adlandırınGetData
. Sihirbazı tamamlamak için Son’a tıklayın.
Şekil 5: Yöntemi GetSuppliers
olarak yeniden adlandırın GetData
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Son'a tıklandığında, sihirbaz dört saklı yordamı oluşturur ve TableAdapter ile karşılık gelen DataTable'ı Yazılan DataSet'e ekler.
4. Adım: TableAdapter Ana Sorgusuna Hesaplanan Sütunu Dahil
Şimdi 3. Adımda oluşturulan TableAdapter ve DataTable'ı hesaplanan sütunu içerecek FullContactName
şekilde güncelleştirmemiz gerekiyor. Bu iki adımdan oluşur:
Suppliers_Select
Saklı yordamı hesaplanan sütunu döndürecekFullContactName
şekilde güncelleştirme ve- DataTable'ı ilgili
FullContactName
sütunu içerecek şekilde güncelleştirme.
Başlangıç olarak Sunucu Gezgini'ne gidin ve Saklı Yordamlar klasörüne gidin. Suppliers_Select
Saklı yordamı açın ve sorguyu SELECT
hesaplanan sütunu içerecek şekilde güncelleştirinFullContactName
:
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
Araç Çubuğundaki Kaydet simgesine tıklayarak, Ctrl+S tuşlarına basarak veya Dosya menüsünden Kaydet Suppliers_Select
seçeneğini belirleyerek saklı yordamdaki değişiklikleri kaydedin.
Ardından DataSet Tasarım Aracı dönün, öğesine sağ tıklayın SuppliersTableAdapter
ve bağlam menüsünden Yapılandır'ı seçin. Sütunun Suppliers_Select
artık sütunu Veri Sütunları koleksiyonuna dahil FullContactName
ettiğini unutmayın.
Şekil 6: DataTable Sütunlarını Güncelleştirmek için TableAdapter Yapılandırma Sihirbazı'nı Çalıştırın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sihirbazı tamamlamak için Son’a tıklayın. Bu, öğesine otomatik olarak karşılık gelen bir sütun SuppliersDataTable
ekler. TableAdapter sihirbazı, sütunun FullContactName
hesaplanan bir sütun olduğunu ve dolayısıyla salt okunur olduğunu algılayabilecek kadar akıllıdır. Sonuç olarak, sütununun ReadOnly
özelliğini olarak true
ayarlar. Bunu doğrulamak için sütunundan sütunu SuppliersDataTable
seçin ve ardından Özellikler penceresi gidin (bkz. Şekil 7). FullContactName
Sütun s DataType
ve MaxLength
özelliklerinin de buna göre ayarlandığını unutmayın.
Şekil 7: FullContactName
Sütun Read-Only Olarak İşaretlendi (Tam boyutlu resmi görüntülemek için tıklayın)
5. Adım: TableAdapter'a Yöntem EklemeGetSupplierBySupplierID
Bu öğretici için, sağlayıcıları güncelleştirilebilir bir kılavuzda görüntüleyen bir ASP.NET sayfası oluşturacağız. Önceki öğreticilerde, bu kaydı DAL'den kesin olarak türü belirlenmiş bir DataTable olarak alarak, özelliklerini güncelleştirerek ve sonra değişiklikleri veritabanına yaymak için güncelleştirilmiş DataTable'ı DAL'ye geri göndererek İş Mantığı Katmanı'ndan tek bir kaydı güncelleştirdik. Dal'dan güncelleştirilmekte olan kaydı almak üzere bu ilk adımı gerçekleştirmek için önce DAL'ye bir GetSupplierBySupplierID(supplierID)
yöntem eklememiz gerekir.
DataSet Tasarımı'nda öğesine SuppliersTableAdapter
sağ tıklayın ve bağlam menüsünden Sorgu Ekle seçeneğini belirleyin. 3. Adımda yaptığımız gibi, Yeni saklı yordam oluştur seçeneğini belirleyerek sihirbazın bizim için yeni bir saklı yordam oluşturmasına izin verin (bu sihirbaz adımının ekran görüntüsü için Şekil 3'e bakın). Bu yöntem birden çok sütun içeren bir kayıt döndüreceğinden, satırları döndüren select olan bir SQL sorgusu kullanmak istediğimizi belirtin ve İleri'ye tıklayın.
Şekil 8: Satırları döndüren SEÇ seçeneğini belirleyin (Tam boyutlu resmi görüntülemek için tıklayın)
Sonraki adım, sorgunun bu yöntem için kullanılmasını ister. Ana sorguyla aynı veri alanlarını ancak belirli bir sağlayıcı için döndüren aşağıdakileri girin.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
Sonraki ekranda bizden otomatik olarak oluşturulacak saklı yordamı adlandırmamızı ister. Bu saklı yordamı Suppliers_SelectBySupplierID
adlandırıp İleri'ye tıklayın.
Şekil 9: Saklı Yordamı Suppliers_SelectBySupplierID
Adlandırın (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Son olarak, sihirbaz TableAdapter için kullanılacak veri erişim desenlerini ve yöntem adlarını ister. Her iki onay kutusunu da işaretli bırakın, ancak ve yöntemlerini sırasıyla ve GetSupplierBySupplierID
olarak yeniden adlandırınFillBy
.FillBySupplierID
GetDataBy
Şekil 10: TableAdapter Yöntemlerini adlandırın FillBySupplierID
ve GetSupplierBySupplierID
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sihirbazı tamamlamak için Son’a tıklayın.
6. Adım: İş Mantığı Katmanı Oluşturma
1. Adımda oluşturulan hesaplanan sütunu kullanan bir ASP.NET sayfası oluşturmadan önce BLL'ye karşılık gelen yöntemleri eklememiz gerekir. 7. Adımda oluşturacağımız ASP.NET sayfamız, kullanıcıların tedarikçileri görüntülemesine ve düzenlemesine olanak tanıyacak. Bu nedenle, BLL'mizin en azından tüm tedarikçileri almak için bir yöntem ve belirli bir tedarikçiyi güncelleştirmek için başka bir yöntem sağlaması gerekir.
klasöründe adlı SuppliersBLLWithSprocs
~/App_Code/BLL
yeni bir sınıf dosyası oluşturun ve aşağıdaki kodu ekleyin:
Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class SuppliersBLLWithSprocs
Private _suppliersAdapter As SuppliersTableAdapter = Nothing
Protected ReadOnly Property Adapter() As SuppliersTableAdapter
Get
If _suppliersAdapter Is Nothing Then
_suppliersAdapter = New SuppliersTableAdapter()
End If
Return _suppliersAdapter
End Get
End Property
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Select, True)> _
Public Function GetSuppliers() As NorthwindWithSprocs.SuppliersDataTable
Return Adapter.GetSuppliers()
End Function
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateSupplier(companyName As String, contactName As String, _
contactTitle As String, supplierID As Integer) As Boolean
Dim suppliers As NorthwindWithSprocs.SuppliersDataTable = _
Adapter.GetSupplierBySupplierID(supplierID)
If suppliers.Count = 0 Then
' no matching record found, return false
Return False
End If
Dim supplier As NorthwindWithSprocs.SuppliersRow = suppliers(0)
supplier.CompanyName = companyName
If contactName Is Nothing Then
supplier.SetContactNameNull()
Else
supplier.ContactName = contactName
End If
If contactTitle Is Nothing Then
supplier.SetContactTitleNull()
Else
supplier.ContactTitle = contactTitle
End If
' Update the product record
Dim rowsAffected As Integer = Adapter.Update(supplier)
' Return true if precisely one row was updated, otherwise false
Return rowsAffected = 1
End Function
End Class
Diğer BLL sınıfları gibi, SuppliersBLLWithSprocs
iki Public
yöntemle birlikte sınıfının bir örneğini SuppliersTableAdapter
döndüren birAdapter
Protected
özelliği vardır: GetSuppliers
ve UpdateSupplier
. GetSuppliers
yöntemi, Veri Erişim Katmanı'nda SuppliersDataTable
karşılık gelen GetSupplier
yöntem tarafından döndürüleni çağırır ve döndürür. yöntemi, UpdateSupplier
DAL GetSupplierBySupplierID(supplierID)
yöntemine yapılan bir çağrı aracılığıyla güncelleştirilen belirli sağlayıcı hakkındaki bilgileri alır. Ardından , ContactName
ve özelliklerini güncelleştirir CategoryName
ve değiştirilen nesneyi geçirerek Veri Erişim Katmanı yöntemini Update
çağırarak SuppliersRow
bu ContactTitle
değişiklikleri veritabanına işler.
Not
ve CompanyName
dışındaSupplierID
, Suppliers tablosundaki tüm sütunlar değerlere izin verirNULL
. Bu nedenle, geçirilen contactName
veya contactTitle
parametreler Nothing
ise, sırasıyla ve SetContactTitleNull
yöntemlerini kullanarak SetContactNameNull
ilgili ContactName
ve ContactTitle
özelliklerini bir NULL
veritabanı değerine ayarlamamız gerekir.
7. Adım: Sunu Katmanından Hesaplanan Sütunla Çalışma
Hesaplanan sütun tabloya Suppliers
eklenip DAL ve BLL buna uygun olarak güncelleştirildiğinden hesaplanan sütunla FullContactName
çalışan bir ASP.NET sayfası oluşturmaya hazırız. İlk olarak klasördeki AdvancedDAL
sayfayı ComputedColumns.aspx
açın ve Toolbox'tan bir GridView'ı Tasarım Aracı sürükleyin. GridView s ID
özelliğini Suppliers
akıllı etiketinden ve olarak ayarlayın, bunu adlı SuppliersDataSource
yeni bir ObjectDataSource'a bağlayın. 6. Adımda geri eklediğimiz sınıfı kullanmak SuppliersBLLWithSprocs
için ObjectDataSource'ı yapılandırın ve İleri'ye tıklayın.
Şekil 11: ObjectDataSource'ı Sınıfı Kullanacak SuppliersBLLWithSprocs
Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
sınıfında tanımlanan SuppliersBLLWithSprocs
yalnızca iki yöntem vardır: GetSuppliers
ve UpdateSupplier
. Bu iki yöntemin sırasıyla SELECT ve UPDATE sekmelerinde belirtildiğinden emin olun ve ObjectDataSource yapılandırmasını tamamlamak için Son'a tıklayın.
Veri Kaynağı Yapılandırma sihirbazı tamamlandıktan sonra Visual Studio, döndürülen her veri alanı için bir BoundField ekler. BoundField'i SupplierID
kaldırın ve , ContactName
, ContactTitle
ve FullContactName
BoundFields özelliklerini CompanyName
sırasıyla Şirket, Kişi Adı, Başlık ve Tam Kişi Adı olarak değiştirinHeaderText
. GridView'un yerleşik düzenleme özelliklerini açmak için akıllı etiketten Düzenlemeyi Etkinleştir onay kutusunu işaretleyin.
GridView'a BoundFields eklemeye ek olarak, Veri Kaynağı Sihirbazı'nın tamamlanması Visual Studio'nun ObjectDataSource özelliğini OldValuesParameterFormatString
original_{0} olarak ayarlamasına da neden olur. Bu ayarı varsayılan değerine geri döndür. {0}
GridView ve ObjectDataSource'ta bu düzenlemeleri yaptıktan sonra bildirim temelli işaretlemeleri aşağıdakine benzer olmalıdır:
<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False"
DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="CompanyName"
HeaderText="Company"
SortExpression="CompanyName" />
<asp:BoundField DataField="ContactName"
HeaderText="Contact Name"
SortExpression="ContactName" />
<asp:BoundField DataField="ContactTitle"
HeaderText="Title"
SortExpression="ContactTitle" />
<asp:BoundField DataField="FullContactName"
HeaderText="Full Contact Name"
SortExpression="FullContactName"
ReadOnly="True" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs"
UpdateMethod="UpdateSupplier">
<UpdateParameters>
<asp:Parameter Name="companyName" Type="String" />
<asp:Parameter Name="contactName" Type="String" />
<asp:Parameter Name="contactTitle" Type="String" />
<asp:Parameter Name="supplierID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Ardından bu sayfayı bir tarayıcı üzerinden ziyaret edin. Şekil 12'de gösterildiği gibi, her sağlayıcı sütunu içeren FullContactName
bir kılavuzda listelenir ve değeri yalnızca (ContactTitle
, CompanyName
) olarak ContactName
biçimlendirilmiş diğer üç sütunun birleştirilmiş olmasıdır.
Şekil 12: Her Sağlayıcı Kılavuzda Listelenir (Tam boyutlu resmi görüntülemek için tıklayın)
Belirli bir sağlayıcı için Düzenle düğmesine tıklanması geri göndermeye neden olur ve bu satırın düzenleme arabiriminde işlenmesini sağlar (bkz. Şekil 13). İlk üç sütun, varsayılan düzenleme arabiriminde işlenir- özelliği veri alanının değerine ayarlanmış bir TextBox denetimi Text
. FullContactName
Ancak sütun metin olarak kalır. Veri Kaynağı Yapılandırma sihirbazının tamamlandığı sırada BoundField'ler GridView'a eklendiğinde, FullContactName
boundField s ReadOnly
özelliği olarak ayarlanmıştır çünkü içindeki ilgili FullContactName
sütunda SuppliersDataTable
ReadOnly
özelliği olarak True
ayarlanmıştır.True
4. Adımda belirtildiği gibi, FullContactName
TableAdapter sütunun hesaplanan bir sütun olduğunu algıladığı için True
s ReadOnly
özelliği olarak ayarlanmıştır.
Şekil 13: FullContactName
Sütun Düzenlenemez (Tam boyutlu resmi görüntülemek için tıklayın)
Devam edin ve düzenlenebilir sütunlardan birinin veya daha fazlasının değerini güncelleştirin ve Güncelleştir'e tıklayın. S değerinin FullContactName
değişikliği yansıtacak şekilde otomatik olarak nasıl güncelleştirileceğini unutmayın.
Not
GridView şu anda düzenlenebilir alanlar için BoundFields kullanır ve bu da varsayılan düzenleme arabirimiyle sonuçlanır. CompanyName
Alan gerekli olduğundan, RequiredFieldValidator içeren bir TemplateField'e dönüştürülmelidir. Bunu ilgili okuyucu için bir alıştırma olarak bırakıyorum. BoundField'ı TemplateField'e dönüştürme ve doğrulama denetimleri ekleme hakkındaki adım adım yönergeler için , Arabirimleri Düzenleme ve Ekleme öğreticisine Doğrulama Denetimleri Ekleme öğreticisine başvurun.
Özet
Bir tablonun şemasını tanımlarken Microsoft SQL Server hesaplanan sütunların eklenmesine izin verir. Bunlar, değerleri genellikle aynı kayıttaki diğer sütunlardaki değerlere başvuran bir ifadeden hesaplanan sütunlardır. Hesaplanan sütunların değerleri bir ifadeyi temel aldıklarından, salt okunurdur ve bir veya UPDATE
deyiminde INSERT
değer atanamaz. Bu, karşılık gelen INSERT
, UPDATE
ve DELETE
deyimlerini otomatik olarak oluşturmaya çalışan tableadapter'ın ana sorgusunda hesaplanan sütun kullanırken zorluklara neden olabilir.
Bu öğreticide, hesaplanan sütunların neden olduğu zorlukları atlatma tekniklerini ele aldık. Özellikle, geçici SQL deyimlerini kullanan TableAdapers'daki kırılganlığın üstesinden gelmek için TableAdapter'ımızdaki saklı yordamları kullandık. TableAdapter sihirbazının yeni saklı yordamlar oluşturmasını sağlarken, ana sorgunun başlangıçta tüm hesaplanan sütunları atlamasını sağlamamız önemlidir, çünkü bunların varlığı veri değişikliği saklı yordamlarının oluşturulmasını engeller. TableAdapter başlangıçta yapılandırıldıktan sonra saklı yordamı, SelectCommand
hesaplanan sütunları içerecek şekilde yeniden kullanılabilir.
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 Hilton Geisenow ve Teresa Murphy'ydi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden 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