Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Bu öğreticide iyimser eşzamanlılık denetiminin temellerini gözden geçirecek ve ardından SqlDataSource denetimini kullanarak bunu nasıl uygulayacağımızı keşfedeceğiz.
Giriş
Önceki öğreticide SqlDataSource denetimine ekleme, güncelleştirme ve silme özelliklerinin nasıl ekleneceğini inceledik. Kısacası, bu özellikleri sağlamak için, denetimin INSERT, UPDATE veya DELETE özelliklerinde ilgili InsertCommand, UpdateCommand veya DeleteCommand SQL deyimini ve InsertParameters, UpdateParameters ve DeleteParameters koleksiyonlarındaki uygun parametreleri belirtmemiz gerekiyordu. Bu özellikler ve koleksiyonlar el ile belirtilebilir, ancak Veri Kaynağını Yapılandırma sihirbazının Gelişmiş düğmesi, INSERT deyimine göre bu deyimleri otomatik olarak oluşturacak bir UPDATE, DELETE, ve SELECT ifadeleri oluşturma onay kutusu sunar.
Gelişmiş SQL Oluşturma Seçenekleri iletişim kutusunda, INSERT, UPDATE ve DELETE deyimlerini oluştur onay kutusunun yanı sıra bir İyimser eşzamanlılık kullan seçeneği bulunur (bkz. Şekil 1). İşaretlendiğinde, WHERE otomatik oluşturulan UPDATE ve DELETE deyimlerindeki koşullar, yalnızca kullanıcının verileri en son kılavuza yüklemesinden bu yana temel alınan veritabanı verileri değiştirilmediyse güncelleme veya silme işlemini gerçekleştirecek şekilde değiştirilir.
Şekil 1: Gelişmiş SQL Oluşturma Seçenekleri İletişim Kutusundan İyimser Eşzamanlılık Desteği Ekleyebilirsiniz
İyimser Eşzamanlılık Uygulama öğreticisine geri dönüp iyimser eşzamanlılık denetiminin temellerini ve bunu ObjectDataSource'a nasıl ekleyebileceğimizi inceledik. Bu öğreticide iyimser eşzamanlılık denetiminin temel bileşenlerine rötuş yapacağız ve ardından SqlDataSource kullanarak bunu nasıl uygulayacağımızı keşfedeceğiz.
İyimser Eşzamanlılığın Özeti
Aynı anda birden çok kullanıcının aynı verileri düzenlemesine veya silmesine izin veren web uygulamaları için, bir kullanıcının yanlışlıkla başka bir değişikliğin üzerine yazma olasılığı vardır. İyimser Eşzamanlılık Uygulama öğreticisinde aşağıdaki örneği sağladım:
Jisun ve Sam adlı iki kullanıcının, ziyaretçilerin GridView denetimi aracılığıyla ürünleri güncelleştirmesine ve silmesine izin veren bir uygulamada bir sayfayı ziyaret ettiğini düşünün. Her ikisi de Chai için Düzenle düğmesine aynı anda tıklayın. Jisun, ürün adını Chai Tea olarak değiştirir ve Güncelleştir düğmesine tıklar. Net sonuç, veritabanına gönderilen ve UPDATE (Jisun yalnızca bir alanı güncelleştirmiş olsa bile) ayarlayan bir ProductName deyimdir. Bu aşamada veritabanında bu ürün için Chai Tea, İçecekler kategorisi, tedarikçi Exotik Sıvılar ve benzeri değerler bulunmaktadır. Ancak, Sam'in ekranındaki GridView, düzenlenebilir GridView satırındaki ürün adını hala Chai olarak gösteriyor. Jisun'un değişiklikleri işlendikten birkaç saniye sonra Sam kategoriyi Çeşniler olarak güncelleştirir ve Güncelleştir'e tıklar. Bu, veritabanına gönderilen ve ürün adını Chai, UPDATE karşılık gelen Condiments kategori kimliği vb. ayarlayan bir CategoryID deyimle sonuçlanabilir. Jisun'un ürün adında yapılan değişikliklerin üzerine yazıldı.
Şekil 2'de bu etkileşim gösterilmektedir.
Şekil 2: İki Kullanıcı Aynı Anda Bir Kaydı Güncelleştirdiğinde, Bir Kullanıcının Diğer Kullanıcıların Üzerine YazmaSına Yönelik Değişiklikler Olabilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu senaryonun ortaya çıkmasını önlemek için bir eşzamanlılık denetimi biçimi uygulanmalıdır. İyimser eşzamanlılık Bu öğreticinin odaklandığı konu, ara sıra eşzamanlılık çakışmaları görülse de, bu tür çakışmaların büyük çoğunlukla ortaya çıkmayacağı varsayımına dayanır. Bu nedenle, bir çakışma oluşursa iyimser eşzamanlılık denetimi, başka bir kullanıcı aynı verileri değiştirdiği için değişikliklerinin kaydedilemediğini kullanıcıya bildirir.
Uyarı
Birçok eşzamanlılık çakışması olacağı varsayılan uygulamalar için veya bu tür çakışmalar toleranslı değilse, bunun yerine kötümser eşzamanlılık denetimi kullanılabilir. Kötümser eşzamanlılık denetimi hakkında daha kapsamlı bir tartışma için İyimser Eşzamanlılık Uygulama öğreticisine geri bakın.
İyimser eşzamanlılık denetimi, güncelleştirilen veya silinen kaydın, güncelleştirme veya silme işlemi başladığındaki değerlerle aynı değerlere sahip olduğundan emin olarak çalışır. Örneğin, düzenlenebilir bir GridView'da Düzenle düğmesine tıklandığında, kayıt değerleri veritabanından okunur ve TextBoxes ve diğer Web denetimlerinde görüntülenir. Bu özgün değerler GridView tarafından kaydedilir. Daha sonra, kullanıcı değişikliklerini yaptıktan ve Güncelleştir düğmesine tıkladıktan sonra, kullanılan deyimin UPDATE özgün değerleri ve yeni değerleri hesaba katması ve yalnızca kullanıcının düzenlemeye başladığı özgün değerlerin veritabanındaki değerlerle aynı olması durumunda temel alınan veritabanı kaydını güncelleştirmesi gerekir. Şekil 3'de bu olay dizisi gösterilmektedir.
Şekil 3: Güncelleştirme veya Silme işleminin Başarılı Olması için Özgün Değerlerin Geçerli Veritabanı Değerlerine Eşit Olması Gerekir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
İyimser eşzamanlılık uygulamak için çeşitli yaklaşımlar vardır (birkaç seçeneğe kısa bir bakış için bkz . Peter A. Bromberg'inİyimser Eşzamanlılık Güncelleştirme Mantığı ). SqlDataSource tarafından kullanılan teknik (veri erişim katmanımızda kullanılan ADO.NET Yazılan Veri Kümeleri tarafından da) tüm özgün değerlerin karşılaştırmasını içerecek şekilde yan tümcesini genişletmektedir WHERE . Örneğin aşağıdaki UPDATE deyim, yalnızca geçerli veritabanı değerleri GridView'da kaydı güncelleştirirken alınan değerlere eşitse ürünün adını ve fiyatını güncelleştirir.
@ProductName ve @UnitPrice parametreleri kullanıcı tarafından girilen yeni değerleri içerirken @original_ProductName ve @original_UnitPrice Düzenle düğmesine tıklandığında başlangıçta GridView'a yüklenen değerleri içerir:
UPDATE Products SET
ProductName = @ProductName,
UnitPrice = @UnitPrice
WHERE
ProductID = @original_ProductID AND
ProductName = @original_ProductName AND
UnitPrice = @original_UnitPrice
Bu öğreticide göreceğimiz gibi, SqlDataSource ile iyimser eşzamanlılık denetimini etkinleştirmek, onay kutusunu işaretlemek kadar basittir.
1. Adım: İyimser Eşzamanlılığı Destekleyen Bir SqlDataSource Oluşturma
Öncelikle OptimisticConcurrency.aspx klasöründen SqlDataSource sayfasını açarak başlayın. Bir SqlDataSource denetimini Araç Kutusu'ndan Tasarımcı'ya sürükleyin, ardından ID özelliğini ProductsDataSourceWithOptimisticConcurrency olarak ayarlayın. Ardından, denetimin akıllı etiketinden Veri Kaynağını Yapılandır bağlantısına tıklayın. Sihirbazın ilk ekranında NORTHWINDConnectionString ile çalışmayı seçin ve İleri'ye tıklayın.
Şekil 4: Ile NORTHWINDConnectionString Çalışmayı Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu örnekte, kullanıcıların tabloyu düzenlemesine Products olanak tanıyan bir GridView ekleyeceğiz. Bu nedenle, Deyimi Seç'i Yapılandır ekranında, açılır listeden Products tabloyu seçin ve ProductID, ProductName, UnitPrice ve Discontinued sütunlarını Şekil 5'te gösterildiği gibi seçin.
Şekil 5: TablodanProducts, , ProductID, ProductNameve UnitPrice Sütunlarını Döndür Discontinued(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sütunları seçtikten sonra Gelişmiş düğmesine tıklayarak Gelişmiş SQL Oluşturma Seçenekleri iletişim kutusunu açın. , ve INSERTdeyimleri oluştur UPDATEve DELETE İyimser eşzamanlılık kullan onay kutularını işaretleyin ve Tamam'a tıklayın (ekran görüntüsü için Şekil 1'e geri bakın). İleri'ye ve ardından Son'a tıklayarak sihirbazı tamamlayın.
Veri Kaynağını Yapılandırma sihirbazını tamamladıktan sonra, elde DeleteCommand edilen ve özellikleri UpdateCommand ile DeleteParameters ve UpdateParameters koleksiyonlarını incelemek için biraz bekleyin. Bunu yapmanın en kolay yolu, sayfanın bildirim temelli söz dizimini görmek için sol alt köşedeki Kaynak sekmesine tıklamaktır. Burada şunun değerini UpdateCommand bulacaksınız:
UPDATE [Products] SET
[ProductName] = @ProductName,
[UnitPrice] = @UnitPrice,
[Discontinued] = @Discontinued
WHERE
[ProductID] = @original_ProductID AND
[ProductName] = @original_ProductName AND
[UnitPrice] = @original_UnitPrice AND
[Discontinued] = @original_Discontinued
Koleksiyonda yedi parametre ile UpdateParameters :
<asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency"
runat="server" ...>
<DeleteParameters>
...
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
<asp:Parameter Name="original_ProductID" Type="Int32" />
<asp:Parameter Name="original_ProductName" Type="String" />
<asp:Parameter Name="original_UnitPrice" Type="Decimal" />
<asp:Parameter Name="original_Discontinued" Type="Boolean" />
</UpdateParameters>
...
</asp:SqlDataSource>
Benzer şekilde, DeleteCommand özellik ve DeleteParameters koleksiyon aşağıdaki gibi görünmelidir:
DELETE FROM [Products]
WHERE
[ProductID] = @original_ProductID AND
[ProductName] = @original_ProductName AND
[UnitPrice] = @original_UnitPrice AND
[Discontinued] = @original_Discontinued
<asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency"
runat="server" ...>
<DeleteParameters>
<asp:Parameter Name="original_ProductID" Type="Int32" />
<asp:Parameter Name="original_ProductName" Type="String" />
<asp:Parameter Name="original_UnitPrice" Type="Decimal" />
<asp:Parameter Name="original_Discontinued" Type="Boolean" />
</DeleteParameters>
<UpdateParameters>
...
</UpdateParameters>
...
</asp:SqlDataSource>
ve WHERE özelliklerinin yan tümcelerini UpdateCommand artırmaya DeleteCommand (ve ilgili parametre koleksiyonlarına ek parametreleri eklemeye) ek olarak, İyimser eşzamanlılık kullan seçeneğinin seçilmesi diğer iki özelliği ayarlar:
-
ConflictDetectionözelliğiniOverwriteChanges(varsayılan) olarak değiştirirCompareAllValues -
OldValuesParameterFormatStringözelliğini{0} (varsayılan){0} original_ olarak değiştirir.
Veri Web denetimi SqlDataSource s Update() veya Delete() yöntemini çağırdığında, özgün değerleri geçirir. SqlDataSource özelliği ConflictDetection olarak CompareAllValuesayarlanırsa, bu özgün değerler komutuna eklenir. özelliği, OldValuesParameterFormatString bu özgün değer parametreleri için kullanılan adlandırma desenini sağlar. Veri Kaynağını Yapılandır sihirbazı original_{0} kullanır ve ve özelliklerindeki ve UpdateCommandDeleteCommand koleksiyonlarındaki her özgün parametreyi UpdateParametersDeleteParameters buna göre adlandırın.
Uyarı
SqlDataSource denetiminin ekleme özelliklerini kullanmadığımız için özelliği ve InsertCommand koleksiyonunu kaldırmaktan InsertParameters çekinmeyin.
Değerleri Doğru İşlemeNULL
Ne yazık ki, iyimser eşzamanlılık kullanılırken Veri Kaynağını Yapılandırma sihirbazı tarafından otomatik olarak oluşturulan artırılmış UPDATE ve DELETE deyimler, değer içeren kayıtlarla NULL Bunun nedenini görmek için SqlDataSource s UpdateCommand:
UPDATE [Products] SET
[ProductName] = @ProductName,
[UnitPrice] = @UnitPrice,
[Discontinued] = @Discontinued
WHERE
[ProductID] = @original_ProductID AND
[ProductName] = @original_ProductName AND
[UnitPrice] = @original_UnitPrice AND
[Discontinued] = @original_Discontinued
UnitPrice Tablodaki sütunun Products değerleri olabilirNULL. Belirli bir kayıt için NULLUnitPrice bir WHERE değere sahipse yan tümce bölümü [UnitPrice] = @original_UnitPriceher zaman False olarak değerlendirilir çünkü NULL = NULL her zaman False döndürür. Bu nedenle, NULL ve UPDATE deyimlerinin DELETE yan tümceleri, güncellenecek veya silinecek herhangi bir satır döndürmeyeceğinden, WHERE değer içeren kayıtlar düzenlenemez veya silinemez.
Uyarı
Bu hata ilk olarak Haziran 2004'te SqlDataSource Yanlış SQL Deyimleri Oluşturuyor'da Microsoft'a bildirildi ve ASP.NET'ın sonraki sürümünde düzeltilmesi için zamanlandığı bildirildi.
Bunu düzeltmek için, değerleri olabilecek WHERE sütunların UpdateCommand ve DeleteCommand özelliklerindeki yan tümcelerini manuel olarak güncellememiz gerekir. Genel olarak şu şekilde değiştirin [ColumnName] = @original_ColumnName :
(
([ColumnName] IS NULL AND @original_ColumnName IS NULL)
OR
([ColumnName] = @original_ColumnName)
)
Bu değişiklik doğrudan bildirim temelli işaretleme yoluyla, Özellikler penceresindeki UpdateQuery veya DeleteQuery seçenekleri aracılığıyla ya da Veri Kaynağını Yapılandırma sihirbazındaki Özel SQL deyimi veya saklı yordam belirtme seçeneğindeki UPDATE ve DELETE sekmeleri aracılığıyla yapılabilir. Yine, ve UpdateCommand'deki DeleteCommand tümcesinde WHERE değerler içerebilen NULL sütun için bu değişiklik yapılmalıdır.
Bunu örneğimize uygulamak aşağıdaki değiştirilmiş UpdateCommand ve DeleteCommand değerlerle sonuçlanır:
UPDATE [Products] SET
[ProductName] = @ProductName,
[UnitPrice] = @UnitPrice,
[Discontinued] = @Discontinued
WHERE
[ProductID] = @original_ProductID AND
[ProductName] = @original_ProductName AND
(([UnitPrice] IS NULL AND @original_UnitPrice IS NULL)
OR ([UnitPrice] = @original_UnitPrice)) AND
[Discontinued] = @original_Discontinued
DELETE FROM [Products]
WHERE
[ProductID] = @original_ProductID AND
[ProductName] = @original_ProductName AND
(([UnitPrice] IS NULL AND @original_UnitPrice IS NULL)
OR ([UnitPrice] = @original_UnitPrice)) AND
[Discontinued] = @original_Discontinued
2. Adım: Düzenleme ve Silme Seçenekleriyle GridView Ekleme
SqlDataSource iyimser eşzamanlılığı destekleyecek şekilde yapılandırıldığında, geriye kalan tek şey bu eşzamanlılık denetimini kullanan sayfaya bir veri Web denetimi eklemektir. Bu öğretici için hem düzenleme hem de silme işlevi sağlayan bir GridView ekleyelim. Bunu başarmak için Araç Kutusu'ndan bir GridView'i Tasarımcı'ya sürükleyin ve ID değerini Products olarak ayarlayın. GridView akıllı etiketinden, 1. Adımda eklenen SqlDataSource denetimine ProductsDataSourceWithOptimisticConcurrency bağlayın. Son olarak, akıllı etiketten Düzenlemeyi Etkinleştir ve Silmeyi Etkinleştir seçeneklerini işaretleyin.
Şekil 6: GridView'ı SqlDataSource'a bağlama ve Düzenleme ve Silmeyi Etkinleştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
GridView'u ekledikten sonra, ProductID BoundField'i kaldırarak, ProductName BoundField'in HeaderText özelliğini "Product" olarak değiştirerek ve UnitPrice BoundField'in HeaderText özelliğini "Price" olarak güncelleyerek görünümünü yapılandırın. tr-TR: İdeal olarak, ProductName değeri için bir RequiredFieldValidator ve UnitPrice değeri için bir CompareValidator içerecek şekilde düzenleme arabirimini geliştirebiliriz (bunun düzgün biçimlendirilmiş bir sayısal değer olduğundan emin olmak için). GridView'un düzenleme arabirimini özelleştirmeye daha ayrıntılı bir bakış için Veri Değiştirme Arabirimini Özelleştirme öğreticisine bakın.
Uyarı
GridView'dan SqlDataSource'a geçirilen özgün değerler görünüm durumunda depolandığından GridView görünüm durumunun etkinleştirilmesi gerekir.
GridView'da bu değişiklikleri yaptıktan sonra GridView ve SqlDataSource bildirim temelli işaretleme aşağıdakine benzer olmalıdır:
<asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency"
runat="server" ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
DeleteCommand=
"DELETE FROM [Products]
WHERE [ProductID] = @original_ProductID
AND [ProductName] = @original_ProductName
AND (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL)
OR ([UnitPrice] = @original_UnitPrice))
AND [Discontinued] = @original_Discontinued"
OldValuesParameterFormatString=
"original_{0}"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice], [Discontinued]
FROM [Products]"
UpdateCommand=
"UPDATE [Products]
SET [ProductName] = @ProductName, [UnitPrice] = @UnitPrice,
[Discontinued] = @Discontinued
WHERE [ProductID] = @original_ProductID
AND [ProductName] = @original_ProductName
AND (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL)
OR ([UnitPrice] = @original_UnitPrice))
AND [Discontinued] = @original_Discontinued">
<DeleteParameters>
<asp:Parameter Name="original_ProductID" Type="Int32" />
<asp:Parameter Name="original_ProductName" Type="String" />
<asp:Parameter Name="original_UnitPrice" Type="Decimal" />
<asp:Parameter Name="original_Discontinued" Type="Boolean" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
<asp:Parameter Name="original_ProductID" Type="Int32" />
<asp:Parameter Name="original_ProductName" Type="String" />
<asp:Parameter Name="original_UnitPrice" Type="Decimal" />
<asp:Parameter Name="original_Discontinued" Type="Boolean" />
</UpdateParameters>
</asp:SqlDataSource>
<asp:GridView ID="Products" runat="server"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="ProductsDataSourceWithOptimisticConcurrency">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
SortExpression="UnitPrice" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
</Columns>
</asp:GridView>
İyimser eşzamanlılık denetiminin çalıştığını görmek için iki tarayıcı penceresi açın ve her ikisinde de sayfayı OptimisticConcurrency.aspx yükleyin. Her iki tarayıcıdaki ilk ürünün Düzenle düğmelerine tıklayın. Tek bir tarayıcıda ürün adını değiştirin ve Güncelleştir'e tıklayın. Tarayıcı geri döner ve GridView önceki düzenleme moduna döner ve yeni düzenlenen kaydın yeni ürün adını gösterir.
İkinci tarayıcı penceresinde fiyatı değiştirin (ancak ürün adını özgün değeri olarak bırakın) ve Güncelleştir'e tıklayın. Geri göndermede, kılavuz ön düzenleme moduna döner, ancak fiyat değişikliği kaydedilmez. İkinci tarayıcı, eski fiyatla yeni ürün adı olan ilk tarayıcıyla aynı değeri gösterir. İkinci tarayıcı penceresinde yapılan değişiklikler kayboldu. Ayrıca, eşzamanlılık ihlalinin oluştuğunu belirten bir özel durum veya ileti olmadığından, değişiklikler sessizce kayboldu.
Şekil 7: İkinci Tarayıcı Penceresindeki Değişiklikler SessizCe Kayboldu (Tam boyutlu görüntüyü görüntülemek için tıklayın)
İkinci tarayıcıdaki değişikliklerin işlenmemesinin nedeni, UPDATE deyiminin WHERE yan tümcesinin tüm kayıtları filtrelemesi ve bu nedenle hiçbir satırı etkilememiş olmasıydı. İfadeye UPDATE yeniden göz atalım:
UPDATE [Products] SET
[ProductName] = @ProductName,
[UnitPrice] = @UnitPrice,
[Discontinued] = @Discontinued
WHERE
[ProductID] = @original_ProductID AND
[ProductName] = @original_ProductName AND
(([UnitPrice] IS NULL AND @original_UnitPrice IS NULL) OR
([UnitPrice] = @original_UnitPrice)) AND
[Discontinued] = @original_Discontinued
İkinci tarayıcı penceresi kaydı güncelleştirdiğinde, yan tümcesinde WHERE belirtilen özgün ürün adı mevcut ürün adıyla eşleşmiyor (ilk tarayıcı tarafından değiştirildiğinden). Bu nedenle, deyimi [ProductName] = @original_ProductName False döndürür ve UPDATE hiçbir kaydı etkilemez.
Uyarı
Silme işlemi aynı şekilde çalışır. İki tarayıcı penceresi açıkken, belirli bir ürünü tek bir ürünle düzenleyip değişiklikleri kaydederek işe başlayın. Değişiklikleri bir tarayıcıda kaydettikten sonra, diğerinde aynı ürünün Sil düğmesine tıklayın. Özgün değerler DELETE deyiminin WHERE yan tümcesinde eşleşmediğinden silme işlemi sessizce başarısız olur.
İkinci tarayıcı penceresinde son kullanıcının perspektifinden, Güncelleştir düğmesine tıkladıktan sonra kılavuz ön düzenleme moduna döner, ancak değişiklikleri kaybolur. Fakat değişikliklerinin kalıcı olmadığını gösteren görsel bir geri bildirim yok. İdeal olarak, bir kullanıcının değişiklikleri eşzamanlılık ihlali nedeniyle kaybolursa, onları bilgilendirir ve belki de kılavuzu düzenleme modunda tutarız. Şimdi bunu nasıl başarmak istediğinize bakalım.
3. Adım: Eşzamanlılık İhlalinin Ne Zaman Oluştuğunı Belirleme
Eşzamanlılık ihlali yapılan değişiklikleri reddettiği için, eşzamanlılık ihlali oluştuğunda kullanıcıyı uyarmak iyi olur. Kullanıcıyı uyarmak için, sayfanın en üstüne, ConcurrencyViolationMessage özelliği şu iletiyi görüntüleyen Text adında bir Label Web denetimi ekleyelim: Başka bir kullanıcı tarafından aynı anda güncelleştirilen bir kaydı güncelleştirmeye veya silmeye çalıştınız. Lütfen diğer kullanıcının değişikliklerini gözden geçirin ve güncelleştirmenizi veya silme işleminizi yineleyin. Etiket denetimi s CssClass özelliğini Uyarı olarak ayarlayın; metin kırmızı, italik, kalın ve büyük bir yazı tipiyle görüntülenen, içinde Styles.css tanımlanmış bir CSS sınıfıdır. Son olarak, Etiket s Visible ve EnableViewState özelliklerini olarak Falseayarlayın. Bu, yalnızca Visible özelliğini True olarak açıkça ayarladığımız postback'ler haricinde Etiketi gizleyecektir.
Şekil 8: Uyarıyı Görüntülemek için Sayfaya Etiket Denetimi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Güncelleştirme veya silme işlemi gerçekleştirirken GridView s RowUpdated ve RowDeleted olay işleyicileri, veri kaynağı denetimi istenen güncelleştirmeyi veya silmeyi gerçekleştirdikten sonra tetikler. Bu etkinlik işleyicileri aracılığıyla işlem sonucunda kaç satırın etkilendiğini belirleyebiliriz. Eğer sıfır satır etkilenmişse, ConcurrencyViolationMessage Etiket'i görüntülemek istiyoruz.
hem hem RowUpdated de RowDeleted olayları için bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:
Protected Sub Products_RowUpdated(sender As Object, e As GridViewUpdatedEventArgs) _
Handles Products.RowUpdated
If e.AffectedRows = 0 Then
ConcurrencyViolationMessage.Visible = True
e.KeepInEditMode = True
' Rebind the data to the GridView to show the latest changes
Products.DataBind()
End If
End Sub
Protected Sub Products_RowDeleted(sender As Object, e As GridViewDeletedEventArgs) _
Handles Products.RowDeleted
If e.AffectedRows = 0 Then
ConcurrencyViolationMessage.Visible = True
End If
End Sub
Her iki olay işleyicisinde de e.AffectedRows özelliğini denetleriz ve 0'a eşitse, ConcurrencyViolationMessage Label'in Visible özelliğini True olarak ayarlarız.
RowUpdated Olay işleyicisinde, özelliği true olarak ayarlayarak KeepInEditMode GridView'a düzenleme modunda kalmasını da bildiririz. Bunu yaparken, diğer kullanıcının verilerinin düzenleme arabirimine yüklenmesi için verileri kılavuza yeniden bağlamamız gerekir. Bu, GridView s DataBind() yöntemi çağrılarak gerçekleştirilir.
Şekil 9'da gösterildiği gibi, bu iki olay işleyicisiyle eşzamanlılık ihlali oluştuğunda çok belirgin bir ileti görüntülenir.
Şekil 9: Eşzamanlılık İhlalinin Karşısında İleti Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Özet
Birden çok eşzamanlı kullanıcının aynı verileri düzenleyebileceği bir web uygulaması oluştururken eşzamanlılık denetimi seçeneklerini göz önünde bulundurmak önemlidir. Varsayılan olarak, ASP.NET veri Web denetimleri ve veri kaynağı denetimleri herhangi bir eşzamanlılık denetimi kullanmaz. Bu öğreticide gördüğümüz gibi, SqlDataSource ile iyimser eşzamanlılık denetimi uygulamak nispeten hızlı ve kolaydır. SqlDataSource, otomatik olarak oluşturulan WHERE ve UPDATE ifadelerine artırılmış DELETE yan tümceleri ekleme sürecinin büyük kısmını halleder, ancak NULL değer sütunlarının işlenmesinde, Değerleri Doğru İşleme NULL bölümünde açıklandığı gibi, bazı incelikler vardır.
Bu öğreticide SqlDataSource incelememiz tamamlanmıştır. Kalan öğreticilerimiz ObjectDataSource ve katmanlı mimariyi kullanarak verilerle çalışmaya geri dönecektir.
Mutlu Programlama!
Yazar Hakkında
Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.