Hesaplanan Sütunlar ile Çalışma (C#)

tarafından Scott Mitchell

PDF’yi İndir

Bir veritabanı tablosu oluştururken, Microsoft SQL Server değeri genellikle aynı veritabanı kaydındaki diğer değerlere başvuran bir ifadeden hesaplanan bir hesaplanmış 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ütunlardan gelen değerlere başvuran bir ifadeden hesaplanan sütunlar olan hesaplanan sütunlara izin verir. Örnek olarak, zaman izleme veri modellerinde , EmployeeID, Rateve Durationgibi sütunlar içeren ServicePerformedadlı ServiceLog bir tablo olabilir. Servis maddesi başına ödenmesi gereken tutar (süreyle çarpılan oran) bir web sayfası veya başka bir program arabirimi aracılığıyla hesaplanabilir, ancak 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 * Durationkullanarak sütunu hesaplanan bir sütun haline getirmektirAmountDue. Bunun yapılması, SQL Server bir sorguda başvurulduysa sütun değerini otomatik olarak hesaplamasına AmountDue 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 tableadapter için ana sorgunun bir parçası olduğunda, bunlar otomatik olarak oluşturulan INSERT ve UPDATE deyimlerine eklenir. Sonuç olarak, tableAdapter'ın INSERT ve UPDATE sorgularının ve UpdateCommandInsertCommand özelliklerinin hesaplanan sütunlara yapılan başvuruları 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 ve UPDATE sorgularından INSERT el ile kaldırılan hesaplanan sütunlar yeniden görüntülenir. Saklı yordamları kullanan TableAdapters bu kırılganlıktan etkilenmese de, 3. Adımda ele alacakları kendi ilginçliklerine sahiptir.

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 kullanım saklı yordamlarımızı kullanacağız.

Haydi başlayalım!

1. Adım: TabloyaSuppliersHesaplanan Sütun Ekleme

Northwind veritabanında hesaplanan sütun yok, bu nedenle kendimiz eklememiz gerekecek. Bu öğretici için, tabloya Suppliers kişinin adını, başlığı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, sağlayıcılarla 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 NULL verip vermedikleri 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 olarak kullanılabilir. Yukarıdaki ifadede CASE deyimi şu şekilde okunabilir: Değilse ContactTitleNULLContactTitle 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 ISNULLCASE bu örnekte çalışacak olsa da deyiminin esnekliğinin CASE ile ISNULLeş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.

Sağlayıcılar Tablosuna FullContactName Adlı Bir Hesaplanan Sütun Ekleme

Ş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 listesinde 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çlarla ([] çevreleyen 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. Hesaplanan sütunlar oluşturma adım adım izlenecek yol için Nasıl yapılır: Hesaplanan Sütunları Belirtme başlıklı makaleye de göz atın.

Not

Varsayılan olarak, hesaplanan sütunlar tabloda fiziksel olarak depolanmaz, ancak 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. Bunu yapmak hesaplanan sütunda bir dizin oluşturulmasını sağlar 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 tablosundan CompanyName, ContactName, ContactTitleve 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, ldquo; (, CompanyName) biçimini kullanarak , ContactNameve ContactTitle sütunlarını listeleyen CompanyNameöğesini içerirFullContactName.ContactTitleContactName

FullContactName, ContactName (ContactTitle, CompanyName) Biçimini Kullanır

Şekil 2: Biçimi FullContactName Kullanır ContactName (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ışabilmek için öncelikle DAL'mizde 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ı iyi değerlendiren birkaç kırışıklık ortaya çıkmıştır.

Geçici SQL deyimleri kullanan bir TableAdapter kullanıyorsanız, Hesaplanan sütunu TableAdapter Yapılandırma sihirbazı aracılığıyla TableAdapter ana sorgusuna eklemeniz yeterlidir. Ancak bu, hesaplanan sütunu içeren ve UPDATE deyimlerini otomatik olarak oluştururINSERT. Bu yöntemlerden birini yürütmeye çalışırsanız, SqlException ColumnName sütunu hesaplanan bir sütun olduğundan veya UNION işlecinin sonucu oluştuğundan columnName sütunu değiştirilemez. 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 TableAdapter'ların kırılganlığı nedeniyle, hesaplanan sütunlarla çalışırken saklı yordamları kullanmamız önerilir. Mevcut saklı yordamları kullanıyorsanız, TableAdapter'ı Typed DataSet s TableAdapters için Mevcut Saklı Yordamları Kullanma öğreticisinde açıklandığı gibi yapılandırmanız yeterlidir. Saklı yordamları sizin için TableAdapter sihirbazı oluşturduysanız, 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 ilgili 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 NorthwindWithSprocs klasörde 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.

Yeni saklı yordam oluştur Seçeneğini belirleyin

Ş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, ContactNameve ContactTitle sütunlarını SupplierIDdö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 girdikten ve İ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_InsertSuppliers_Update, ve Suppliers_Deleteolarak adlandırın.

Otomatik Oluşturulan Saklı Yordamların Adlarını Özelleştirme

Ş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 kutusunu da işaretli bırakın, ancak yöntemini olarak GetSuppliersyeniden adlandırınGetData. Sihirbazı tamamlamak için Son’a tıklayın.

GetData Yöntemini GetSuppliers olarak yeniden adlandırı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'ı Türlenmiş DataSet'e ekler.

4. Adım: TableAdapter Ana Sorgusuna Hesaplanan Sütunu Ekleme

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

  1. Suppliers_Select Hesaplanan sütunu döndürmek FullContactName için saklı yordamı güncelleştirme ve
  2. 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ğunda kaydet simgesine tıklayarak, Ctrl+S tuşlarına basarak veya Dosya menüsünden Kaydet Suppliers_Select seçeneğini belirleyerek değişiklikleri saklı yordama kaydedin.

Ardından DataSet Tasarım Aracı dönün, öğesine SuppliersTableAdaptersağ tıklayın 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.

DataTable Sütunlarını Güncelleştirmek için TableAdapter Yapılandırma Sihirbazı'nı çalıştırı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 SuppliersDataTableekler. 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ütun s ReadOnly özelliğini olarak trueayarlar. Bunu doğrulamak için sütunundan SuppliersDataTable sütunu seçin ve Özellikler penceresi gidin (bkz. Şekil 7). FullContactName Sütun s DataType ve MaxLength özelliklerinin de buna göre ayarlandığını unutmayın.

FullContactName Sütunu Salt Okunur Olarak İşaretlendi

Şekil 7: FullContactName Sütun Read-Only olarak İşaretlendi (Tam boyutlu görüntüyü 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, belirli bir 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ştirilen 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.

Satırları döndüren SEÇ seçeneğini belirleyin

Şekil 8: Satırları döndüren SEÇ seçeneğini belirleyin (Tam boyutlu görüntüyü 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ın ve İleri'ye tıklayın.

Saklı Yordamı adlandırma Suppliers_SelectBySupplierID

Ş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 GetSupplierBySupplierIDolarak yeniden adlandırınFillBy.FillBySupplierIDGetDataBy

TableAdapter Yöntemlerini FillBySupplierID ve GetSupplierBySupplierID olarak adlandırın

Şekil 10: TableAdapter Yöntemlerini FillBySupplierID adlandırın 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 sağlayıcıları görüntülemesine ve düzenlemesine olanak sağlayacak. 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:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class SuppliersBLLWithSprocs
{
    private SuppliersTableAdapter _suppliersAdapter = null;
    protected SuppliersTableAdapter Adapter
    {
        get
        {
            if (_suppliersAdapter == null)
                _suppliersAdapter = new SuppliersTableAdapter();
            return _suppliersAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
    {
        return Adapter.GetSuppliers();
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Update, true)]
    public bool UpdateSupplier(string companyName, string contactName, 
        string contactTitle, int supplierID)
    {
        NorthwindWithSprocs.SuppliersDataTable suppliers = 
            Adapter.GetSupplierBySupplierID(supplierID);
        if (suppliers.Count == 0)
            // no matching record found, return false
            return false;
        NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
        supplier.CompanyName = companyName;
        if (contactName == null) 
            supplier.SetContactNameNull(); 
        else 
            supplier.ContactName = contactName;
        if (contactTitle == null) 
            supplier.SetContactTitleNull(); 
        else 
            supplier.ContactTitle = contactTitle;
        // Update the product record
        int rowsAffected = Adapter.Update(supplier);
        // Return true if precisely one row was updated, otherwise false
        return rowsAffected == 1;
    }
}

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 birAdapterprotectedözelliği vardır: GetSuppliers ve UpdateSupplier. yöntemi, GetSuppliers Veri Erişim Katmanı'nda SuppliersDataTable karşılık gelen GetSupplier yöntem tarafından döndürülen öğesini ç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 , ContactNameve özelliklerini güncelleştirir CategoryNameve değiştirilen nesneyi geçirerek SuppliersRow Veri Erişim Katmanı Update yöntemini çağırarak bu ContactTitle değişiklikleri veritabanına işler.

Not

SupplierID ve CompanyNamedışında, Suppliers tablosundaki tüm sütunlar değerlere izin verirNULL. Bu nedenle, geçirilen contactName veya contactTitle parametreleri null 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 eklendiğinde ve DAL ve BLL buna göre güncelleştirildiğinde, 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 Araç Kutusu'ndan bir GridView'ı Tasarım Aracı sürükleyin. GridView s ID özelliğini Suppliers akıllı etiketinden ve olarak ayarlayın, bunu adlı SuppliersDataSourceyeni bir ObjectDataSource'a bağlayın. ObjectDataSource'ı 6. Adımda geri eklediğimiz sınıfı kullanacak SuppliersBLLWithSprocs şekilde yapılandırın ve İleri'ye tıklayın.

ObjectDataSource'ı SuppliersBLLWithSprocs Sınıfını Kullanacak Şekilde Yapılandırma

Ş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 sırasıyla , ContactName, ContactTitleve FullContactName BoundFields özelliklerini CompanyNameŞ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 eklemenin yanı sıra, Veri Kaynağı Sihirbazı'nın tamamlanması Visual Studio'nun OldValuesParameterFormatString ObjectDataSource özelliğini 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.

Her Sağlayıcı Kılavuzda Listelenir

Şekil 12: Her Sağlayıcı Kılavuzda Listelenir (Tam boyutlu görüntüyü 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 tamamlanmasının ardından BoundField'ler GridView'a eklendiğinde, FullContactName içindeki ilgili FullContactName sütunun SuppliersDataTableReadOnly özelliği olarak ayarlandığından BoundField ReadOnly özelliği olarak ayarlanmıştırtrue.true 4. Adımda belirtildiği gibi, FullContactName TableAdapter sütunun hesaplanan bir sütun olduğunu algıladığından s ReadOnly özelliği olarak ayarlanmıştır true .

FullContactName Sütunu Düzenlenemez

Şekil 13: FullContactName Sütun Düzenlenemez (Tam boyutlu görüntüyü 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çlanabilir. 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'i TemplateField'e dönüştürme ve doğrulama denetimleri ekleme hakkında adım adım yönergeler için , Düzenleme ve Arabirim 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, bunlar salt okunurdur ve bir veya UPDATE deyiminde INSERT değer atanamaz. Bu, karşılık gelen INSERT, UPDATEve DELETE deyimlerini otomatik olarak oluşturmaya çalışan bir TableAdapter'ın ana sorgusunda hesaplanan bir sütun kullanırken karşılaşılan güçlüklere neden olabilir.

Bu öğreticide, hesaplanan sütunlar tarafından ortaya konan zorlukları aşmaya yönelik teknikler ele alınmıştı. Özellikle, geçici SQL deyimlerini kullanan TableAdapter'larda bulunan 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 ilk kez 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 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 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.