Veritabanı Değişikliklerini Bir İşlemin İçinde Sarmalama (VB)Wrapping Database Modifications within a Transaction (VB)

Scott Mitchell tarafındanby Scott Mitchell

Kodu indirin veya PDF 'yi indirinDownload Code or Download PDF

Bu öğretici, veri toplu işlerini güncelleştirme, silme ve ekleme konusunda görünen dört ilkidir.This tutorial is the first of four that looks at updating, deleting, and inserting batches of data. Bu öğreticide, veritabanı işlemlerinin toplu iş değişikliklerinin bir atomik işlem olarak nasıl gerçekleştirilebildiğini öğrenir, bu da tüm adımların başarılı veya tüm adımların başarısız olmasını sağlar.In this tutorial we learn how database transactions allow batch modifications to be carried out as an atomic operation, which ensures that either all steps succeed or all steps fail.

GirişIntroduction

Veri öğreticisini ekleme, güncelleştirme ve silmeye Ilişkin genel bakışa Başlarken, GridView, satır düzeyinde Düzenle ve silme için yerleşik destek sağlar.As we saw starting with the An Overview of Inserting, Updating, and Deleting Data tutorial, the GridView provides built-in support for row-level editing and deleting. Fareyle birkaç tıklamayla, bir kod satırı yazmadan zengin veri değişikliği arabirimi oluşturmak mümkündür. bu nedenle, her satır için Düzenle ve siliniyor içeriklerde olduğu sürece.With a few clicks of the mouse it is possible to create a rich data modification interface without writing a line of code, so long as you are content with editing and deleting on a per-row basis. Ancak, bazı senaryolarda bu yeterli değildir ve kullanıcılara bir kayıt kümesini düzenleme veya silme olanağı sağlamamız gerekir.However, in certain scenarios this is insufficient and we need to provide users with the ability to edit or delete a batch of records.

Örneğin, çoğu Web tabanlı e-posta istemcisi, her satırın e-posta bilgilerini (konu, gönderen ve benzeri) içeren bir onay kutusu içerdiği her iletiyi listelemek için bir kılavuz kullanır.For example, most web-based email clients use a grid to list each message where each row includes a checkbox along with the email s information (subject, sender, and so forth). Bu arabirim, kullanıcının birden çok iletiyi denetleyerek ve sonra seçili Iletileri Sil düğmesine tıklayarak silmesine izin verir.This interface permits the user to delete multiple messages by checking them and then clicking a Delete Selected Messages button. Toplu düzenleme arabirimi, kullanıcıların birçok farklı kaydı yaygın olarak düzenleyebildiği durumlarda idealdir.A batch editing interface is ideal in situations where users commonly edit many different records. Kullanıcının Düzenle ' ye tıklaması, değişiklik yapması ve ardından değiştirilmesi gereken her kayıt için Güncelleştir ' e tıklaması yerine, bir Batch düzenleme arabirimi her bir satırı düzenleme arabirimiyle işler.Rather than forcing the user to click Edit, make their change, and then click Update for each record that needs to be modified, a batch editing interface renders each row with its editing interface. Kullanıcı değiştirilmesi gereken satır kümesini hızlıca değiştirebilir ve sonra Tümünü Güncelleştir düğmesine tıklayarak bu değişiklikleri kaydeder.The user can quickly modify the set of rows that need to be changed and then save these changes by clicking an Update All button. Bu öğretici kümesinde, verilerin toplu olarak eklenmesi, düzenlenmesine ve silinmesine yönelik arabirimlerin nasıl oluşturulacağını inceleyeceğiz.In this set of tutorials we'll examine how to create interfaces for inserting, editing, and deleting batches of data.

Toplu işlem gerçekleştirirken, toplu işteki bazı işlemlerden bazılarının başarılı olması durumunda başarısız olması gerekip gerekmediğini belirleme açısından önemlidir.When performing batch operations it s important to determine whether it should be possible for some of the operations in the batch to succeed while others fail. Toplu işi silme arabirimi-seçili olan ilk kayıt başarıyla silinirse ne olması gerekir, ancak ikinci biri başarısız olursa, yabancı anahtar kısıtlaması ihlali nedeniyle ne olur?Consider a batch deleting interface - what should happen if the first selected record is deleted successfully, but the second one fails, say, because of a foreign key constraint violation? İlk kaydın silinmesi geri alınır mi yoksa ilk kaydın silinme için kabul edilebilir mi?Should the first record s delete be rolled back or is it acceptable for the first record to remain deleted?

Toplu işlemin bir atomik işlemolarak değerlendirilmesini istiyorsanız, tüm adımların başarılı veya adımların tümü başarısız olursa, veri erişim katmanının veritabanı işlemlerineyönelik destek içerecek şekilde artırılması gerekir.If you want the batch operation to be treated as an atomic operation, one where either all of the steps succeed or all of the steps fail, then the Data Access Layer needs to be augmented to include support for database transactions. Veritabanı işlemleri, işlemin şemsiye altında yürütülen INSERT, UPDATEve DELETE deyimlerinin kararlılığını garanti eder ve tüm modern veritabanı sistemleri tarafından desteklenen bir özelliktir.Database transactions guarantee atomicity for the set of INSERT, UPDATE, and DELETE statements executed under the umbrella of the transaction and are a feature supported by most all modern database systems.

Bu öğreticide, veritabanı işlemlerini kullanmak için DAL genişletme bölümüne bakacağız.In this tutorial we'll look at how to extend the DAL to use database transactions. Sonraki öğreticiler, toplu iş ekleme, güncelleştirme ve silme arabirimleri için Web sayfalarını uygulamayı inceler.Subsequent tutorials will examine implementing web pages for batch inserting, updating, and deleting interfaces. Haydi başlayın!Let s get started!

Note

Toplu işlemdeki verileri değiştirirken, kararlılık her zaman gerekli değildir.When modifying data in a batch transaction, atomicity is not always needed. Bazı senaryolarda, bir Web tabanlı e-posta istemcisinden bir e-posta kümesini silerken, bazı veri değişikliklerinin başarılı olması ve aynı toplu işteki diğer kişilerin başarısız olması kabul edilebilir.In some scenarios, it may be acceptable to have some data modifications succeed and others in the same batch fail, such as when deleting a set of emails from a web-based email client. Silme işlemi boyunca bir veritabanı hatası algıladığında, bu, hata olmadan işlenen kayıtların silinmesini de kabul eder.If there s a database error midway through the deletion process, it s probably acceptable that those records processed without error remain deleted. Bu gibi durumlarda, DAL veritabanı işlemlerini destekleyecek şekilde değiştirilmemelidir.In such cases, the DAL does not need to be modified to support database transactions. Ancak, kararlılık 'in çok önemli olduğu diğer toplu işlem senaryoları vardır.There are other batch operation scenarios, however, where atomicity is vital. Bir müşteri fonlarını bir banka hesabından diğerine taşıdıkça iki işlem gerçekleştirilmelidir: fonlar ilk hesaptan düşülmeli ve sonra ikincisine eklenmelidir.When a customer moves her funds from one bank account to another, two operations must be performed: the funds must be deducted from the first account and then added to the second. Bankanın ilk adımı başarılı bir şekilde gerçekleştiremeyebilir, ancak ikinci adım başarısız olsa da, müşterileri daha iyi bir şekilde daha fazla olmaz.While the bank may not mind having the first step succeed but the second step fail, its customers would understandably be upset. Bu öğreticide ilerleyerek ve veritabanı işlemlerini desteklemek için DAL geliştirmeleri uygulayıp, bunları Batch ekleme, güncelleştirme ve silme toplu işlemlerinde kullanmayı planlamıyorsanız, aşağıdaki üç öğreticide oluşturacağız.I encourage you to work through this tutorial and implement the enhancements to the DAL to support database transactions even if you do not plan on using them in the batch inserting, updating, and deleting interfaces we'll be building in the following three tutorials.

Işlemlere genel bakışAn Overview of Transactions

Çoğu veritabanı, birden çok veritabanı komutunun tek bir mantıksal iş biriminde gruplandırılmasına olanak sağlayan işlemleriçin destek içerir.Most databases include support for transactions, which enable multiple database commands to be grouped into a single logical unit of work. Bir işlemi oluşturan veritabanı komutlarının atomik olduğu garanti edilir, yani tüm komutların başarısız olduğu veya tümünün başarılı olacağı anlamına gelir.The database commands that comprise a transaction are guaranteed to be atomic, meaning that either all commands will fail or all will succeed.

Genel olarak, işlemler SQL deyimleriyle aşağıdaki model kullanılarak uygulanır:In general, transactions are implemented through SQL statements using the following pattern:

  1. İşlemin başlangıcını belirtir.Indicate the start of a transaction.
  2. İşlemi oluşturan SQL deyimlerini yürütün.Execute the SQL statements that comprise the transaction.
  3. 2. adımdaki deyimlerden birinde bir hata varsa, işlemi geri alın.If there is an error in one of the statements from Step 2, rollback the transaction.
  4. 2. adımdaki tüm deyimler hata olmadan tamamlandıysanız, işlemi yürütün.If all of the statements from Step 2 complete without error, commit the transaction.

İşlemin oluşturulması, yürütülmesi ve geri dönmesi için kullanılan SQL deyimleri, SQL betikleri yazarken veya saklı yordamlar oluştururken el ile veya ADO.NET ya da System.Transactions ad alanındakisınıfların kullanılmasıyla programlama yoluyla el ile girilebilir.The SQL statements used to create, commit, and roll back the transaction can be entered manually when writing SQL scripts or creating stored procedures, or through programmatic means using either ADO.NET or the classes in the System.Transactions namespace. Bu öğreticide, yalnızca ADO.NET kullanarak işlem yönetimini inceleyeceğiz.In this tutorial we will only examine managing transactions using ADO.NET. Gelecekteki bir öğreticide, veri erişim katmanında saklı yordamların nasıl kullanılacağına göz atacağız. Bu durumda, işlemleri oluşturmak, geri almak ve yürütmek için SQL deyimlerini keşfedeceğiz.In a future tutorial we will look at how to use stored procedures in the Data Access Layer, at which time we'll explore the SQL statements for creating, rolling back, and committing transactions. Bu sırada daha fazla bilgi için SQL Server saklı yordamlarındaki Işlemleri yönetme konusuna bakın.In the meantime, consult Managing Transactions in SQL Server Stored Procedures for more information.

Note

System.Transactions ad alanındaki TransactionScope sınıfı , geliştiricilerin bir işlem kapsamındaki bir deyim serisini programlama yoluyla sarmasını ve bir Microsoft SQL Server veritabanı, Oracle veritabanı ve bir Web hizmeti gibi iki farklı veritabanı ya da heterojen veri deposu türleri gibi birden çok kaynağı içeren karmaşık işlemler için destek içerir.The TransactionScope class in the System.Transactions namespace enables developers to programmatically wrap a series of statements within the scope of a transaction and includes support for complex transactions that involve multiple sources, such as two different databases or even heterogeneous types of data stores, such as a Microsoft SQL Server database, an Oracle database, and a Web service. ADO.NET sınıfı TransactionScope yerine bu öğreticide ADO.NET işlemleri kullanmaya karar verdim ve çoğu durumda, çok daha az kaynak kullanımı.I ve decided to use ADO.NET transactions for this tutorial instead of the TransactionScope class because ADO.NET is more specific for database transactions and, in many cases, is far less resource intensive. Ayrıca, bazı senaryolarda TransactionScope sınıfı Microsoft Dağıtılmış İşlem Düzenleyicisi (MSDTC) kullanır.In addition, under certain scenarios the TransactionScope class uses the Microsoft Distributed Transaction Coordinator (MSDTC). MSDTC 'nin içindeki yapılandırma, uygulama ve performans sorunları, Bu öğreticilerin kapsamını özelleştirilmiş ve gelişmiş bir konuyla ve bunların ötesinde kolaylaştırır.The configuration, implementation, and performance issues surrounding MSDTC makes it a rather specialized and advanced topic and beyond the scope of these tutorials.

ADO.NET ' de SqlClient sağlayıcısıyla çalışırken işlemler, bir SqlTransaction nesnesidöndüren SqlConnection sınıf s BeginTransaction yöntemineyapılan bir çağrıyla başlatılır.When working with the SqlClient provider in ADO.NET, transactions are initiated through a call to the SqlConnection class s BeginTransaction method, which returns a SqlTransaction object. İşlemi oluşturan veri değiştirme deyimleri try...catch bir blok içine yerleştirilir.The data modification statements that makeup the transaction are placed within a try...catch block. try bloğundaki bir ifadede bir hata oluşursa, yürütme, işlemin SqlTransaction nesne s Rollback yöntemiaracılığıyla geri aktargetirilebileceği catch bloğuna aktarılır.If an error occurs in a statement in the try block, execution transfers to the catch block where the transaction can be rolled back via the SqlTransaction object s Rollback method. Tüm deyimler başarıyla tamamlandıysanız, try bloğunun sonundaki SqlTransaction nesne s Commit yöntemine yapılan bir çağrı işlemi kaydeder.If all of the statements complete successfully, a call to the SqlTransaction object s Commit method at the end of the try block commits the transaction. Aşağıdaki kod parçacığında bu desenler gösterilmektedir.The following code snippet illustrates this pattern. Ek sözdizimi ve ADO.NET ile işlem kullanma örnekleri için işlem Ile veritabanı tutarlılığını koruma konusuna bakın.See Maintaining Database Consistency with Transactions for additional syntax and examples of using transactions with ADO.NET.

' Create the SqlTransaction object
Dim myTransaction As SqlTransaction = SqlConnectionObject.BeginTransaction();
Try
    '
    ' ... Perform the database transaction�s data modification statements...
    '
    ' If we reach here, no errors, so commit the transaction
    myTransaction.Commit()
Catch
    ' If we reach here, there was an error, so rollback the transaction
    myTransaction.Rollback()
    Throw
End Try

Varsayılan olarak, bir türü belirtilmiş veri kümesindeki TableAdapters işlemleri kullanmaz.By default, the TableAdapters in a Typed DataSet do not use transactions. Bir işlemin kapsamı içinde bir dizi veri değişikliği deyimi gerçekleştirmek için yukarıdaki kalıbı kullanan ek yöntemler dahil olmak üzere TableAdapter sınıflarını geliştirmemiz gereken işlemler için destek sağlamak üzere.To provide support for transactions we need to augment the TableAdapter classes to include additional methods that use the above pattern to perform a series of data modification statements within the scope of a transaction. 2. adımda, bu yöntemleri eklemek için kısmi sınıfların nasıl kullanılacağını öğreneceğiz.In Step 2 we'll see how to use partial classes to add these methods.

1. Adım: toplu veri Web sayfalarıyla çalışmayı oluşturmaStep 1: Creating the Working with Batched Data Web Pages

Veritabanı işlemlerini desteklemek için DAL 'nin nasıl geliştirdiğine yönelik keşfetmeye başlamadan önce, bu öğretici için ihtiyaç duyduğumuz ASP.NET Web sayfalarını ve bu öğreticiyi izleyen üç işlem için ilk olarak bir süre sürme.Before we start exploring how to augment the DAL to support database transactions, let s first take a moment to create the ASP.NET web pages that we will need for this tutorial and the three that follow. BatchData adlı yeni bir klasör ekleyerek başlayın ve ardından her sayfayı Site.master ana sayfayla ilişkilendirerek aşağıdaki ASP.NET sayfalarını ekleyin.Start by adding a new folder named BatchData and then add the following ASP.NET pages, associating each page with the Site.master master page.

  • Default.aspx
  • Transactions.aspx
  • BatchUpdate.aspx
  • BatchDelete.aspx
  • BatchInsert.aspx

SqlDataSource ile Ilgili öğreticiler için ASP.NET sayfaları ekleyin

Şekil 1: SqlDataSource Ile ilgili öğreticiler Için ASP.NET sayfaları eklemeFigure 1: Add the ASP.NET Pages for the SqlDataSource-Related Tutorials

Diğer klasörlerde olduğu gibi, Default.aspx kendi bölümünde öğreticileri listelemek için SectionLevelTutorialListing.ascx Kullanıcı denetimini kullanacaktır.As with the other folders, Default.aspx will use the SectionLevelTutorialListing.ascx User Control to list the tutorials within its section. Bu nedenle, bu kullanıcı denetimini Çözüm Gezgini sayfa s Tasarım görünümü üzerine sürükleyerek Default.aspx ekleyin.Therefore, add this User Control to Default.aspx by dragging it from the Solution Explorer onto the page s Design view.

SectionLevelTutorialListing. ascx Kullanıcı denetimini default. aspx öğesine eklemek Add the SectionLevelTutorialListing.ascx User Control to Default.aspx

Şekil 2: SectionLevelTutorialListing.ascx kullanıcı denetimini Default.aspx ekleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: Add the SectionLevelTutorialListing.ascx User Control to Default.aspx (Click to view full-size image)

Son olarak, bu dört sayfayı Web.sitemap dosyasına girdi olarak ekleyin.Lastly, add these four pages as entries to the Web.sitemap file. Özellikle, site haritasını özelleştirdikten sonra aşağıdaki biçimlendirmeyi ekleyin <siteMapNode>:Specifically, add the following markup after the Customizing the Site Map <siteMapNode>:

<siteMapNode title="Working with Batched Data" 
    url="~/BatchData/Default.aspx" 
    description="Learn how to perform batch operations as opposed to 
                 per-row operations.">
    
    <siteMapNode title="Adding Support for Transactions" 
        url="~/BatchData/Transactions.aspx" 
        description="See how to extend the Data Access Layer to support 
                     database transactions." />
    <siteMapNode title="Batch Updating" 
        url="~/BatchData/BatchUpdate.aspx" 
        description="Build a batch updating interface, where each row in a 
                      GridView is editable." />
    <siteMapNode title="Batch Deleting" 
        url="~/BatchData/BatchDelete.aspx" 
        description="Explore how to create an interface for batch deleting 
                     by adding a CheckBox to each GridView row." />
    <siteMapNode title="Batch Inserting" 
        url="~/BatchData/BatchInsert.aspx" 
        description="Examine the steps needed to create a batch inserting 
                     interface, where multiple records can be created at the 
                     click of a button." />
</siteMapNode>

Web.sitemapgüncelleştirildikten sonra Öğreticiler Web sitesini bir tarayıcıdan görüntülemek için bir dakikanızı ayırın.After updating Web.sitemap, take a moment to view the tutorials website through a browser. Sol taraftaki menüde artık toplu veri öğreticileri ile çalışma için öğeler yer almaktadır.The menu on the left now includes items for the working with batched data tutorials.

Site Haritası artık toplu veri öğreticileri ile çalışmaya yönelik girişleri Içerir

Şekil 3: site haritasında artık toplu veri öğreticileri ile çalışmaya yönelik girişler yer almaktadırFigure 3: The Site Map Now Includes Entries for the Working with Batched Data Tutorials

2. Adım: veri erişim katmanını, veritabanı Işlemlerini destekleyecek şekilde güncelleştirmeStep 2: Updating the Data Access Layer to Support Database Transactions

İlk öğreticide geri değindiğimiz gibi, bir veri erişim katmanı oluştururken, Içindeki türü belirtilmiş veri kümesi DataTable ve TableAdapters ' den oluşur.As we discussed back in the first tutorial, Creating a Data Access Layer, the Typed DataSet in our DAL is composed of DataTables and TableAdapters. TableAdapters, veritabanından verileri veri okuma, DataTable üzerinde yapılan değişikliklerle veritabanını güncelleştirme, vb. gibi verileri bir veritabanına dönüştürür.The DataTables hold data while the TableAdapters provide the functionality to read data from the database into the DataTables, to update the database with changes made to the DataTables, and so forth. TableAdapters 'in, Batch Update ve DB-Direct olarak adlandırılan verileri güncelleştirmek için iki desen sunmaya yönelik olduğunu hatırlayın.Recall that the TableAdapters provide two patterns for updating data, which I referred to as Batch Update and DB-Direct. Batch Update düzeniyle, TableAdapter bir DataSet, DataTable veya DataRow koleksiyonu iletilir.With the Batch Update pattern, the TableAdapter is passed a DataSet, DataTable, or collection of DataRows. Bu veriler, her Inserted, Modified veya Deleted satırı için numaralandırılır, InsertCommand, UpdateCommandveya DeleteCommand yürütülür.This data is enumerated and for each inserted, modified, or deleted row, the InsertCommand, UpdateCommand, or DeleteCommand is executed. DB-Direct düzeniyle, TableAdapter, tek bir kaydı eklemek, güncelleştirmek veya silmek için gereken sütunların değerlerini geçti.With the DB-Direct pattern, the TableAdapter is instead passed the values of the columns necessary for inserting, updating, or deleting a single record. Daha sonra DB doğrudan model yöntemi, uygun InsertCommand, UpdateCommandveya DeleteCommand ifadesini yürütmek için bu geçirilen değerleri kullanır.The DB Direct pattern method then uses those passed-in values to execute the appropriate InsertCommand, UpdateCommand, or DeleteCommand statement.

Kullanılan güncelleştirme düzeniyle bağımsız olarak, TableAdapters otomatik oluşturulan Yöntemler işlemleri kullanmaz.Regardless of the update pattern used, the TableAdapters auto-generated methods do not use transactions. Varsayılan olarak, TableAdapter tarafından gerçekleştirilen her bir INSERT, Update veya delete tek bir ayrık işlem olarak değerlendirilir.By default each insert, update, or delete performed by the TableAdapter is treated as a single discrete operation. Örneğin, veritabanına on kayıt eklemek için BLL içindeki bazı kodlar tarafından DB-Direct deseninin kullanıldığını düşünün.For instance, imagine that the DB-Direct pattern is used by some code in the BLL to insert ten records into the database. Bu kod, TableAdapter s Insert yöntemini on kez çağırırdı.This code would call the TableAdapter s Insert method ten times. İlk beş ekleme başarılı, ancak altıncı bir özel durumla sonuçlanmış ise, ilk beş kayıt veritabanında kalır.If the first five inserts succeed, but the sixth one resulted in an exception, the first five inserted records would remain in the database. Benzer şekilde, bir DataTable içindeki eklenen, değiştirilen ve silinen satırlarda ekleme, güncelleştirme ve silme işlemleri gerçekleştirmek için toplu güncelleştirme düzeninde kullanılırsa, ilk birkaç değişiklik başarılı olduysa ancak daha sonra bir hatayla karşılaştıysa, bu, önceki değişiklikleri tamamlandı, veritabanında kalır.Similarly, if the Batch Update pattern is used to perform inserts, updates, and deletes to the inserted, modified, and deleted rows in a DataTable, if the first several modifications succeeded but a later one encountered an error, those earlier modifications that completed would remain in the database.

Belirli senaryolarda, bir dizi değişiklik genelinde kararlılık sağlamak istiyoruz.In certain scenarios we want to ensure atomicity across a series of modifications. Bunu gerçekleştirmek için, bir işlemin şemsiye altında InsertCommand, UpdateCommandve DeleteCommand çalıştıran yeni yöntemler ekleyerek TableAdapter 'ı el ile genişletmelidir.To accomplish this we must manually extend the TableAdapter by adding new methods that execute the InsertCommand, UpdateCommand, and DeleteCommand s under the umbrella of a transaction. Veri erişim katmanı oluşturma bölümünde, yazılan veri kümesi içindeki DataTable işlevlerinin işlevselliğini uzatmak için kısmi sınıflar kullanma konusunda baktık.In Creating a Data Access Layer we looked at using partial classes to extend the functionality of the DataTables within the Typed DataSet. Bu teknik, TableAdapters ile de kullanılabilir.This technique can also be used with TableAdapters.

Yazılan veri kümesi Northwind.xsd App_Code klasör s DAL alt klasöründe bulunur.The Typed DataSet Northwind.xsd is located in the App_Code folder s DAL subfolder. TransactionSupport adlı DAL klasörde bir alt klasör oluşturun ve ProductsTableAdapter.TransactionSupport.vb adlı yeni bir sınıf dosyası ekleyin (bkz. Şekil 4).Create a subfolder in the DAL folder named TransactionSupport and add a new class file named ProductsTableAdapter.TransactionSupport.vb (see Figure 4). Bu dosya, bir işlem kullanarak veri değişiklikleri gerçekleştirmeye yönelik yöntemleri içeren ProductsTableAdapter kısmi uygulamasını tutacaktır.This file will hold the partial implementation of the ProductsTableAdapter that includes methods for performing data modifications using a transaction.

TransactionSupport adlı bir klasör ve ProductsTableAdapter. TransactionSupport. vb adlı bir sınıf dosyası ekleyin

Şekil 4: TransactionSupport adlı bir klasör ve ProductsTableAdapter.TransactionSupport.vb adlı bir sınıf dosyası ekleyinFigure 4: Add a Folder Named TransactionSupport and a Class File Named ProductsTableAdapter.TransactionSupport.vb

ProductsTableAdapter.TransactionSupport.vb dosyasına aşağıdaki kodu girin:Enter the following code into the ProductsTableAdapter.TransactionSupport.vb file:

Imports System.Data
Imports System.Data.SqlClient
Namespace NorthwindTableAdapters
    Partial Public Class ProductsTableAdapter
        Private _transaction As SqlTransaction
        Private Property Transaction() As SqlTransaction
            Get
                Return Me._transaction
            End Get
            Set(ByVal Value As SqlTransaction)
                Me._transaction = Value
            End Set
        End Property
        Public Sub BeginTransaction()
            ' Open the connection, if needed
            If Me.Connection.State <> ConnectionState.Open Then
                Me.Connection.Open()
            End If
            ' Create the transaction and assign it to the Transaction property
            Me.Transaction = Me.Connection.BeginTransaction()
            ' Attach the transaction to the Adapters
            For Each command As SqlCommand In Me.CommandCollection
                command.Transaction = Me.Transaction
            Next
            Me.Adapter.InsertCommand.Transaction = Me.Transaction
            Me.Adapter.UpdateCommand.Transaction = Me.Transaction
            Me.Adapter.DeleteCommand.Transaction = Me.Transaction
        End Sub
        Public Sub CommitTransaction()
            ' Commit the transaction
            Me.Transaction.Commit()
            ' Close the connection
            Me.Connection.Close()
        End Sub
        Public Sub RollbackTransaction()
            ' Rollback the transaction
            Me.Transaction.Rollback()
            ' Close the connection
            Me.Connection.Close()
        End Sub
    End Class
End Namespace

Burada sınıf bildiriminde Partial anahtar sözcüğü, içinde eklenen üyelerin NorthwindTableAdapters ad alanındaki ProductsTableAdapter sınıfına ekleneceğini belirtir.The Partial keyword in the class declaration here indicates to the compiler that the members added within are to be added to the ProductsTableAdapter class in the NorthwindTableAdapters namespace. Dosyanın en üstündeki Imports System.Data.SqlClient bildirimine göz önünde edin.Note the Imports System.Data.SqlClient statement at the top of the file. TableAdapter, SqlClient sağlayıcısını kullanacak şekilde yapılandırıldığından, kendi komutlarını veritabanına vermek için bir SqlDataAdapter nesnesi kullanır.Since the TableAdapter was configured to use the SqlClient provider, internally it uses a SqlDataAdapter object to issue its commands to the database. Sonuç olarak, işlemi başlatmak ve sonra yürütmek ya da geri almak için SqlTransaction sınıfını kullandık.Consequently, we need to use the SqlTransaction class to begin the transaction and then to commit it or roll it back. Microsoft SQL Server dışında bir veri deposu kullanıyorsanız, uygun sağlayıcıyı kullanmanız gerekir.If you are using a data store other than Microsoft SQL Server, you'll need to use the appropriate provider.

Bu yöntemler, bir işlemi başlatmak, geri almak ve yürütmek için gereken yapı taşlarını sağlar.These methods provide the building blocks needed to start, rollback, and commit a transaction. Bunlar Publicişaretlenir, bu, DAL içindeki başka bir sınıftan veya BLL gibi mimarideki başka bir katmandan ProductsTableAdapterkullanılmasını sağlar.They are marked Public, enabling them to be used from within the ProductsTableAdapter, from another class in the DAL, or from another layer in the architecture, such as the BLL. BeginTransaction TableAdapter iç SqlConnection açar (gerekirse), işlemi başlatır ve Transaction özelliğine atar ve işlemi iç SqlDataAdapter s SqlCommand nesnelerine ekler.BeginTransaction opens the TableAdapter s internal SqlConnection (if needed), begins the transaction and assigns it to the Transaction property, and attaches the transaction to the internal SqlDataAdapter s SqlCommand objects. CommitTransaction ve RollbackTransactionRollback nesnesini kapatmadan önce, sırasıyla Transaction nesne s Commit ve Connection Yöntemleri çağırın.CommitTransaction and RollbackTransaction call the Transaction object s Commit and Rollback methods, respectively, before closing the internal Connection object.

3. Adım: bir Işlemin şemsiye altında verileri güncelleştirmek ve silmek için yöntemler eklemeStep 3: Adding Methods to Update and Delete Data Under the Umbrella of a Transaction

Bu yöntemler tamamlansa, bir işlemin şemsiye altında bir dizi komut gerçekleştiren ProductsDataTable veya BLL 'e Yöntemler eklemeye hazırız.With these methods complete, we re ready to add methods to ProductsDataTable or the BLL that perform a series of commands under the umbrella of a transaction. Aşağıdaki yöntem bir işlem kullanarak bir ProductsDataTable örneğini güncelleştirmek için Batch güncelleştirme modelini kullanır.The following method uses the Batch Update pattern to update a ProductsDataTable instance using a transaction. BeginTransaction yöntemini çağırarak bir işlem başlatır ve sonra veri değiştirme deyimlerini vermek için bir Try...Catch bloğu kullanır.It starts a transaction by calling the BeginTransaction method and then uses a Try...Catch block to issue the data modification statements. Adapter nesne Update yöntemine yapılan çağrı bir özel durumla sonuçlanırsa, yürütme hareketin geri alındığı ve özel durumun yeniden oluşturulduğu catch bloğuna aktarılır.If the call to the Adapter object s Update method results in an exception, execution will transfer to the catch block where the transaction will be rolled back and the exception re-thrown. Update yönteminin, sağlanan ProductsDataTable satırları numaralandırarak ve gerekli InsertCommand, UpdateCommandve DeleteCommand işlemlerini gerçekleştirerek Batch güncelleştirme modelini uyguladığını unutmayın.Recall that the Update method implements the Batch Update pattern by enumerating the rows of the supplied ProductsDataTable and performing the necessary InsertCommand, UpdateCommand, and DeleteCommand s. Bu komutlardan herhangi biri bir hata ile sonuçlanırsa işlem, işlem ömrü boyunca yapılan önceki değişiklikleri geri alarak geri alınır.If any one of these commands results in an error, the transaction is rolled back, undoing the previous modifications made during the transaction s lifetime. Update deyimin hatasız tamamlanabilmesi gerekir, işlem tamamen işlenir.Should the Update statement complete without error, the transaction is committed in its entirety.

Public Function UpdateWithTransaction _
    (ByVal dataTable As Northwind.ProductsDataTable) As Integer
    
    Me.BeginTransaction()
    Try
        ' Perform the update on the DataTable
        Dim returnValue As Integer = Me.Adapter.Update(dataTable)
        ' If we reach here, no errors, so commit the transaction
        Me.CommitTransaction()
        Return returnValue
    Catch
        ' If we reach here, there was an error, so rollback the transaction
        Me.RollbackTransaction()
        Throw
    End Try
End Function

UpdateWithTransaction yöntemini ProductsTableAdapter.TransactionSupport.vbparçalı sınıfı aracılığıyla ProductsTableAdapter sınıfına ekleyin.Add the UpdateWithTransaction method to the ProductsTableAdapter class through the partial class in ProductsTableAdapter.TransactionSupport.vb. Alternatif olarak, bu yöntem bazı küçük sözdizimsel değişikliklerle Iş mantığı katmanı s ProductsBLL sınıfına eklenebilir.Alternatively, this method could be added to the Business Logic Layer s ProductsBLL class with a few minor syntactical changes. Yani, Me.BeginTransaction(), Me.CommitTransaction()ve Me.RollbackTransaction() anahtar sözcüğünün Me Adapter ile değiştirilmeleri gerekir (Bu Adapter, ProductsBLL türündeki ProductsTableAdapterbir özelliğin adıdır).Namely, the keyword Me in Me.BeginTransaction(), Me.CommitTransaction(), and Me.RollbackTransaction() would need to be replaced with Adapter (recall that Adapter is the name of a property in ProductsBLL of type ProductsTableAdapter).

UpdateWithTransaction yöntemi Batch güncelleştirme modelini kullanır, ancak aşağıdaki yöntemin gösterdiği gibi bir dizi VERITABANı doğrudan çağrısı da bir işlemin kapsamı içinde kullanılabilir.The UpdateWithTransaction method uses the Batch Update pattern, but a series of DB-Direct calls can also be used within the scope of a transaction, as the following method shows. DeleteProductsWithTransaction yöntemi, silinecek ProductID s olan Integertüründe bir List(Of T) girdi olarak kabul eder.The DeleteProductsWithTransaction method accepts as input a List(Of T) of type Integer, which are the ProductID s to delete. Yöntemi, BeginTransaction çağrısı yoluyla işlemi başlatır ve sonra Try bloğunda, her ProductID değeri için DB-Direct model Delete yöntemini çağıran sağlanan liste boyunca yinelenir.The method initiates the transaction via a call to BeginTransaction and then, in the Try block, iterates through the supplied list calling the DB-Direct pattern Delete method for each ProductID value. Delete çağrılarından herhangi biri başarısız olursa, denetim işlemin geri alındığı ve özel durumun yeniden oluşturulduğu Catch bloğuna aktarılır.If any of the calls to Delete fails, control is transferred to the Catch block where the transaction is rolled back and the exception re-thrown. Delete yapılan tüm çağrılar başarılı olursa işlem gerçekleştirilir.If all calls to Delete succeed, then transaction is committed. Bu yöntemi ProductsBLL sınıfına ekleyin.Add this method to the ProductsBLL class.

Public Sub DeleteProductsWithTransaction _
    (ByVal productIDs As System.Collections.Generic.List(Of Integer))
    
    ' Start the transaction
    Adapter.BeginTransaction()
    Try
        ' Delete each product specified in the list
        For Each productID As Integer In productIDs
            Adapter.Delete(productID)
        Next
        ' Commit the transaction
        Adapter.CommitTransaction()
    Catch
        ' There was an error - rollback the transaction
        Adapter.RollbackTransaction()
        Throw
    End Try
End Sub

Birden çok TableAdapters arasında Işlem uygulamaApplying Transactions Across Multiple TableAdapters

Bu öğreticide incelenen işlemle ilgili kod, ProductsTableAdapter birden çok deyimin atomik bir işlem olarak işlenmesine izin verir.The transaction-related code examined in this tutorial allows for multiple statements against the ProductsTableAdapter to be treated as an atomic operation. Ancak, farklı veritabanı tablolarında birden fazla değişiklik otomatik olarak gerçekleştirilmesi gerekiyorsa ne olur?But what if multiple modifications to different database tables need to be performed atomically? Örneğin, bir kategoriyi silerken, önce geçerli ürünlerini başka bir kategoriye yeniden atamak isteyebilirsiniz.For instance, when deleting a category, we might first want to reassign its current products to some other category. Bu iki adım, ürünleri yeniden atayarak ve kategoriyi silmenin atomik bir işlem olarak yürütülmesi gerekir.These two steps reassigning the products and deleting the category should be executed as an atomic operation. Ancak ProductsTableAdapter yalnızca Products tablosunu değiştirme yöntemleri içerir ve CategoriesTableAdapter yalnızca Categories tablosunu değiştirme yöntemlerini içerir.But the ProductsTableAdapter includes only methods for modifying the Products table and the CategoriesTableAdapter includes only methods for modifying the Categories table. Bu nedenle bir işlem hem TableAdapters?So how can a transaction encompass both TableAdapters?

Bir seçenek, DeleteCategoryAndReassignProducts(categoryIDtoDelete, reassignToCategoryID) adlı CategoriesTableAdapter bir yöntem eklemektir ve bu yöntemin, her ikisi de ürünleri yeniden atar ve saklı yordamda tanımlanan bir işlemin kapsamındaki kategoriyi sildiği bir saklı yordam çağırmasıdır.One option is to add a method to the CategoriesTableAdapter named DeleteCategoryAndReassignProducts(categoryIDtoDelete, reassignToCategoryID) and have that method call a stored procedure that both reassigns the products and deletes the category within the scope of a transaction defined within the stored procedure. Daha sonraki bir öğreticide saklı yordamlarda işlem başlatma, işleme ve geri alma işlemlerine bakacağız.We'll look at how to begin, commit, and rollback transactions in stored procedures in a future tutorial.

Başka bir seçenek de DeleteCategoryAndReassignProducts(categoryIDtoDelete, reassignToCategoryID) yöntemini içeren DAL içinde yardımcı sınıf oluşturmaktır.Another option is to create a helper class in the DAL that contains the DeleteCategoryAndReassignProducts(categoryIDtoDelete, reassignToCategoryID) method. Bu yöntem CategoriesTableAdapter ve ProductsTableAdapter bir örneğini oluşturur ve sonra bu iki TableAdapters Connection özelliklerini aynı SqlConnection örneğine ayarlar.This method would create an instance of the CategoriesTableAdapter and the ProductsTableAdapter and then set these two TableAdapters Connection properties to the same SqlConnection instance. Bu noktada, iki TableAdapters birini BeginTransactionçağrısı olan işlemi başlatır.At that point, either one of the two TableAdapters would initiate the transaction with a call to BeginTransaction. Ürünleri yeniden atama ve kategoriyi silme TableAdapters yöntemleri, işlemin yürütüldüğü veya geri alındığı bir Try...Catch bloğunda çağrılır.The TableAdapters methods for reassigning the products and deleting the category would be invoked in a Try...Catch block with the transaction committed or rolled back as needed.

4. Adım:UpdateWithTransactionyöntemini Iş mantığı katmanına eklemeStep 4: Adding theUpdateWithTransactionMethod to the Business Logic Layer

3. adımda, DAL içindeki ProductsTableAdapter bir UpdateWithTransaction yöntemi ekledik.In Step 3 we added an UpdateWithTransaction method to the ProductsTableAdapter in the DAL. BLL 'ye karşılık gelen bir yöntem ekleyeceğiz.We should add a corresponding method to the BLL. Sunum katmanı UpdateWithTransaction yöntemi çağırmak için doğrudan DAL 'ye çağrı yapmış olsa da bu öğreticiler, sunum katmanından DAL oluşturan katmanlı bir mimari tanımlamaya çalışır.While the Presentation Layer could call directly down to the DAL to invoke the UpdateWithTransaction method, these tutorials have strived to define a layered architecture that insulates the DAL from the Presentation Layer. Bu nedenle, behooves bizimle bu yaklaşıma devam etmemizi sağlar.Therefore, it behooves us to continue this approach.

ProductsBLL sınıf dosyasını açın ve yalnızca karşılık gelen DAL yöntemine çağıran UpdateWithTransaction adlı bir yöntem ekleyin.Open the ProductsBLL class file and add a method named UpdateWithTransaction that simply calls down to the corresponding DAL method. ProductsBLLŞu anda, yeni eklediğiniz ve adım 3 ' te eklenen DeleteProductsWithTransactionolan UpdateWithTransactioniki yeni yöntem olmalıdır.There should now be two new methods in ProductsBLL: UpdateWithTransaction, which you just added, and DeleteProductsWithTransaction, which was added in Step 3.

Public Function UpdateWithTransaction _
    (ByVal products As Northwind.ProductsDataTable) As Integer
    
    Return Adapter.UpdateWithTransaction(products)
End Function
Public Sub DeleteProductsWithTransaction _
    (ByVal productIDs As System.Collections.Generic.List(Of Integer))
    
    ' Start the transaction
    Adapter.BeginTransaction()
    Try
        ' Delete each product specified in the list
        For Each productID As Integer In productIDs
            Adapter.Delete(productID)
        Next
        ' Commit the transaction
        Adapter.CommitTransaction()
    Catch
        ' There was an error - rollback the transaction
        Adapter.RollbackTransaction()
        Throw
    End Try
End Sub

Note

Bu yöntemler, doğrudan ASP.NET Pages arka plan kod sınıflarından bu yöntemleri çağırabiletireceğiz için ProductsBLL sınıfındaki diğer yöntemlere atanan DataObjectMethodAttribute özniteliğini içermez.These methods do not include the DataObjectMethodAttribute attribute assigned to most other methods in the ProductsBLL class because we'll be invoking these methods directly from the ASP.NET pages code-behind classes. Bu DataObjectMethodAttribute, ObjectDataSource 'un veri kaynağını Yapılandır sihirbazında ve hangi sekmenin (SELECT, UPDATE, INSERT veya DELETE) altında görünmesi gerektiğini işaretlemek için kullanıldığını unutmayın.Recall that DataObjectMethodAttribute is used to flag what methods should appear in the ObjectDataSource s Configure Data Source wizard and under what tab (SELECT, UPDATE, INSERT, or DELETE). GridView, toplu iş düzenlemesi veya silme için yerleşik bir destek olmadığından, kod içermeyen bildirim yaklaşımını kullanmak yerine bu yöntemleri programlı bir şekilde çağırmamız gerekir.Since the GridView lacks any built-in support for batch editing or deleting, we'll have to invoke these methods programmatically rather than use the code-free declarative approach.

5. Adım: veritabanı verilerini sunu katmanından otomatik olarak güncelleştirmeStep 5: Atomically Updating Database Data from the Presentation Layer

İşlemin toplu bir kayıt güncelleştirmesinde olduğu etkiyi göstermek için, bir GridView içindeki tüm ürünleri listeleyen bir kullanıcı arabirimi oluşturun ve tıklandığı zaman, ürün CategoryID değerleri yeniden atar.To illustrate the effect that the transaction has when updating a batch of records, let s create a user interface that lists all products in a GridView and includes a Button Web control that, when clicked, reassigns the products CategoryID values. Özellikle, bazı birkaç ürüne geçerli bir CategoryID değeri atanarak, diğer bir deyişle mevcut olmayan bir CategoryID değerine atanmadığından, kategori yeniden ataması devam edecektir.In particular, the category reassignment will progress so that the first several products are assigned a valid CategoryID value while others are purposefully assigned a non-existent CategoryID value. CategoryID var olan bir CategoryIDkategoriyle eşleşmeyen bir ürünle veritabanını güncelleştirmeye çalışarız, yabancı anahtar kısıtlaması ihlali oluşur ve bir özel durum oluşturulur.If we attempt to update the database with a product whose CategoryID does not match an existing category s CategoryID, a foreign key constraint violation will occur and an exception will be raised. Bu örnekte, bir işlem kullanılırken, yabancı anahtar kısıtlaması ihlalinden kaynaklanan özel durum, önceki geçerli CategoryID değişikliklerinin geri alınmasına neden olur.What we'll see in this example is that when using a transaction the exception raised from the foreign key constraint violation will cause the previous valid CategoryID changes to be rolled back. Ancak, bir işlem kullanmadığınız zaman, ilk kategorilerdeki değişiklikler kalır.When not using a transaction, however, the modifications to the initial categories will remain.

Transactions.aspx sayfasını BatchData klasöründen açarak başlatın ve araç kutusundan bir GridView 'ı tasarımcı üzerine sürükleyin.Start by opening the Transactions.aspx page in the BatchData folder and drag a GridView from the Toolbox onto the Designer. ID Products ve akıllı etiketinden ProductsDataSourceadlı yeni bir ObjectDataSource bağlayın.Set its ID to Products and, from its smart tag, bind it to a new ObjectDataSource named ProductsDataSource. ProductsBLL sınıf s GetProducts yönteminden verileri çekmek için ObjectDataSource 'ı yapılandırın.Configure the ObjectDataSource to pull its data from the ProductsBLL class s GetProducts method. Bu, salt okunurdur bir GridView olacaktır, bu nedenle GÜNCELLEŞTIRME, ekleme ve SILME sekmelerinden (yok) açılır listeleri ayarlayın ve son ' a tıklayın.This will be a read-only GridView, so set the drop-down lists in the UPDATE, INSERT, and DELETE tabs to (None) and click Finish.

, ObjectDataSource 'ı ProductsBLL sınıfı s GetProducts metodunu kullanacak şekilde yapılandırmaConfigure the ObjectDataSource to Use the ProductsBLL Class s GetProducts Method

Şekil 5: ProductsBLL sınıf s GetProducts metodunu (tam boyutlu görüntüyü görüntülemek Için tıklayın) kullanmak üzere ObjectDataSource 'ı yapılandırınFigure 5: Configure the ObjectDataSource to Use the ProductsBLL Class s GetProducts Method (Click to view full-size image)

GÜNCELLEŞTIRME, ekleme ve SILME sekmelerindeki açılan listeleri (hiçbiri) ayarlaSet the Drop-Down Lists in the UPDATE, INSERT, and DELETE Tabs to (None)

Şekil 6: GÜNCELLEŞTIRME, ekleme ve silme sekmelerinden açılan listeleri (yok) ayarlayın (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 6: Set the Drop-Down Lists in the UPDATE, INSERT, and DELETE Tabs to (None) (Click to view full-size image)

Veri kaynağı Yapılandırma Sihirbazı 'nı tamamladıktan sonra, Visual Studio, ürün verileri alanları için BoundFields ve bir CheckBoxField oluşturacaktır.After completing the Configure Data Source wizard, Visual Studio will create BoundFields and a CheckBoxField for the product data fields. ProductID, ProductName, CategoryIDve CategoryName hariç tüm bu alanları kaldırın ve ProductName ve CategoryName BoundFields HeaderText özellikleri sırasıyla ürün ve kategori olarak yeniden adlandırın.Remove all of these fields except for ProductID, ProductName, CategoryID, and CategoryName and rename the ProductName and CategoryName BoundFields HeaderText properties to Product and Category, respectively. Akıllı etikette, sayfalama etkinleştir seçeneğini işaretleyin.From the smart tag, check the Enable Paging option. Bu değişiklikleri yaptıktan sonra, GridView ve ObjectDataSource 'lar bildirim temelli biçimlendirme aşağıdaki gibi görünmelidir:After making these modifications, the GridView and ObjectDataSource s declarative markup should look like the following:

<asp:GridView ID="Products" runat="server" AllowPaging="True" 
    AutoGenerateColumns="False" DataKeyNames="ProductID" 
    DataSourceID="ProductsDataSource">
    <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID" 
            InsertVisible="False" ReadOnly="True" 
            SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="Product" 
            SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" 
            SortExpression="CategoryID" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category" 
            SortExpression="CategoryName" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>

Sonra, GridView 'un üstüne üç düğme web denetimi ekleyin.Next, add three Button Web controls above the GridView. İlk düğme s metin özelliğini kılavuz Yenile, kategorileri değiştirmek için ikinci s (Işlem Ile) ve üçüncü bir tane Kategoriler (Işlem olmadan) olacak şekilde ayarlayın.Set the first Button s Text property to Refresh Grid, the second s to Modify Categories (WITH TRANSACTION), and the third one s to Modify Categories (WITHOUT TRANSACTION) .

<p>
    <asp:Button ID="RefreshGrid" runat="server" Text="Refresh Grid" />
</p>
<p>
    <asp:Button ID="ModifyCategoriesWithTransaction" runat="server"
        Text="Modify Categories (WITH TRANSACTION)" />
</p>
<p>
    <asp:Button ID="ModifyCategoriesWithoutTransaction" runat="server"
        Text="Modify Categories (WITHOUT TRANSACTION)" />
</p>

Bu noktada, Visual Studio 'daki Tasarım görünümü Şekil 7 ' de gösterilen ekran görüntüsüne benzer şekilde görünmelidir.At this point the Design view in Visual Studio should look similar to the screen shot shown in Figure 7.

Sayfada bir GridView ve üç düğme web denetimi Içeren The Page Contains a GridView and Three Button Web Controls

Şekil 7: sayfa bir GridView ve üç düğme web denetimi içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 7: The Page Contains a GridView and Three Button Web Controls (Click to view full-size image)

Üç düğme Click olayının her biri için olay işleyicileri oluşturun ve aşağıdaki kodu kullanın:Create event handlers for each of the three Button s Click events and use the following code:

Protected Sub RefreshGrid_Click _
    (ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles RefreshGrid.Click
    
    Products.DataBind()
End Sub
Protected Sub ModifyCategoriesWithTransaction_Click _
    (ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles ModifyCategoriesWithTransaction.Click
    
    ' Get the set of products
    Dim productsAPI As New ProductsBLL()
    Dim productsData As Northwind.ProductsDataTable = productsAPI.GetProducts()
    ' Update each product's CategoryID
    For Each product As Northwind.ProductsRow In productsData
        product.CategoryID = product.ProductID
    Next
    ' Update the data using a transaction
    productsAPI.UpdateWithTransaction(productsData)
    ' Refresh the Grid
    Products.DataBind()
End Sub
Protected Sub ModifyCategoriesWithoutTransaction_Click _
    (ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles ModifyCategoriesWithoutTransaction.Click
    
    ' Get the set of products
    Dim productsAPI As New ProductsBLL()
    Dim productsData As Northwind.ProductsDataTable = productsAPI.GetProducts()
    ' Update each product's CategoryID
    For Each product As Northwind.ProductsRow In productsData
        product.CategoryID = product.ProductID
    Next
    ' Update the data WITHOUT using a transaction
    Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
    productsAdapter.Update(productsData)
    ' Refresh the Grid
    Products.DataBind()
End Sub

Yenileme düğmesi s Click olay işleyicisi, Products GridView s DataBind metodunu çağırarak verileri GridView 'a yeniden bağlar.The refresh Button s Click event handler simply rebinds the data to the GridView by calling the Products GridView s DataBind method.

İkinci olay işleyicisi, ürünleri CategoryID öğeleri yeniden atar ve bir işlemin şemsiye altında veritabanı güncelleştirmelerini gerçekleştirmek için BLL 'den yeni işlem yöntemini kullanır.The second event handler reassigns the products CategoryID s and uses the new transaction method from the BLL to perform the database updates under the umbrella of a transaction. Her ürünün CategoryID rastgele ProductIDaynı değere ayarlandığını unutmayın.Note that each product s CategoryID is arbitrarily set to the same value as its ProductID. Bu ürünler geçerli CategoryID s ile eşlenecek ProductID değerler içerdiğinden, ilk birkaç ürün için bu işlem sorunsuz çalışacaktır.This will work fine for the first few products, since those products have ProductID values that happen to map to valid CategoryID s. Ancak ProductID s çok büyük bir süre sonra başlatıldıktan sonra, ProductID s ve CategoryID s 'nin bu coarızalımesi artık geçerli değildir.But once the ProductID s start getting too large, this coincidental overlap of ProductID s and CategoryID s no longer applies.

Üçüncü Click olay işleyicisi, ürünleri CategoryID öğeleri aynı şekilde güncelleştirir, ancak ProductsTableAdapter s varsayılan Update yöntemini kullanarak güncelleştirmeyi veritabanına gönderir.The third Click event handler updates the products CategoryID s in the same manner, but sends the update to the database using the ProductsTableAdapter s default Update method. Bu Update yöntemi bir işlem içindeki komut serisini sarmaz, bu nedenle bu değişiklikler ilk karşılaşılan yabancı anahtar kısıtlaması ihlali hatası devam edecek.This Update method does not wrap the series of commands within a transaction, so those changes are made prior to the first encountered foreign key constraint violation error will persist.

Bu davranışı göstermek için bu sayfayı bir tarayıcı aracılığıyla ziyaret edin.To demonstrate this behavior, visit this page through a browser. Başlangıçta, Şekil 8 ' de gösterildiği gibi ilk veri sayfasını görmeniz gerekir.Initially you should see the first page of data as shown in Figure 8. Sonra, kategorileri Değiştir (Işlem Ile) düğmesine tıklayın.Next, click the Modify Categories (WITH TRANSACTION) button. Bu, geri göndermeye neden olur ve tüm ürünlerin CategoryID değerlerini güncelleştirmeye çalışır, ancak yabancı anahtar kısıtlaması ihlaline neden olur (bkz. Şekil 9).This will cause a postback and attempt to update all of the products CategoryID values, but will result in a foreign key constraint violation (see Figure 9).

ürünleri sayfalanabilir GridView 'da görüntülenirThe Products are Displayed in a Pageable GridView

Şekil 8: ürünler bir sayfalanabilir GridView 'da görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 8: The Products are Displayed in a Pageable GridView (Click to view full-size image)

Kategoriler bir yabancı anahtar kısıtlaması Ihlaline neden olurReassigning the Categories Results in a Foreign Key Constraint Violation

Şekil 9: kategorileri yeniden atama yabancı anahtar kısıtlaması ihlaline neden olur (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 9: Reassigning the Categories Results in a Foreign Key Constraint Violation (Click to view full-size image)

Şimdi tarayıcı geri düğmesine basın ve ardından kılavuza Yenile düğmesine tıklayın.Now hit your browser s Back button and then click the Refresh Grid button. Verileri yenilemeden sonra, Şekil 8 ' de gösterildiği gibi tam olarak aynı çıktıyı görmeniz gerekir.Upon refreshing the data you should see the exact same output as shown in Figure 8. Diğer bir deyişle, bazı CategoryID ürünlerden bazıları yasal değerler olarak değiştirilse ve veritabanında güncelleştirilene karşın, yabancı anahtar kısıtlaması ihlali oluştuğunda geri alınır.That is, even though some of the products CategoryID s were changed to legal values and updated in the database, they were rolled back when the foreign key constraint violation occurred.

Şimdi kategorileri Değiştir (Işlem olmadan) düğmesini tıklatmaya çalışın.Now try clicking the Modify Categories (WITHOUT TRANSACTION) button. Bu, aynı yabancı anahtar kısıtlaması ihlali hatasına neden olur (bkz. Şekil 9), ancak bu sefer CategoryID değerleri geçerli bir değer olarak değiştirilen ürünler geri alınmaz.This will result in the same foreign key constraint violation error (see Figure 9), but this time those products whose CategoryID values were changed to a legal value will not be rolled back. Tarayıcınızın geri düğmesine ve ardından Kılavuz Yenile düğmesine basın.Hit your browser s Back button and then the Refresh Grid button. Şekil 10 ' da gösterildiği gibi, ilk sekiz ürünün CategoryID s ' i yeniden atandı.As Figure 10 shows, the CategoryID s of the first eight products have been reassigned. Örneğin, Şekil 8 ' de, Chang 1 ' in CategoryID vardı, ancak Şekil 10 ' da 2 ' ye yeniden atandı.For example, in Figure 8, Chang had a CategoryID of 1, but in Figure 10 it s been reassigned to 2.

bazı ürünlerin CategoryID değerlerinin güncelleştirildiği sırada güncelleştirilmiş olmasıSome Products CategoryID Values were Updated While Others Were Not

Şekil 10: bazı ürün CategoryID değerleri, diğerleri oluşturulmazken güncelleştirildi (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 10: Some Products CategoryID Values were Updated While Others Were Not (Click to view full-size image)

ÖzetSummary

Varsayılan olarak, TableAdapter s yöntemleri yürütülen veritabanı deyimlerini bir işlemin kapsamı içinde sarmaz, ancak küçük bir çalışmalarla bir işlem oluşturacak, kaydedilecek ve geri alacak Yöntemler ekleyebiliriz.By default, the TableAdapter s methods do not wrap the executed database statements within the scope of a transaction, but with a little work we can add methods that will create, commit, and rollback a transaction. Bu öğreticide ProductsTableAdapter sınıfında üç tür yöntem oluşturduk: BeginTransaction, CommitTransactionve RollbackTransaction.In this tutorial we created three such methods in the ProductsTableAdapter class: BeginTransaction, CommitTransaction, and RollbackTransaction. Bu yöntemlerin bir dizi veri değiştirme deyimini atomik hale getirmek için bir Try...Catch bloğuyla birlikte nasıl kullanılacağını gördük.We saw how to use these methods along with a Try...Catch block to make a series of data modification statements atomic. Özellikle, sağlanan bir ProductsDataTablesatırlarda gerekli değişiklikleri gerçekleştirmek için Batch güncelleştirme modelini kullanan ProductsTableAdapter``UpdateWithTransaction yöntemi oluşturduk.In particular, we created the UpdateWithTransaction method in the ProductsTableAdapter, which uses the Batch Update pattern to perform the necessary modifications to the rows of a supplied ProductsDataTable. Ayrıca, DeleteProductsWithTransaction yöntemini, giriş olarak ProductID değerleri List kabul eden ve her Delete için DB-Direct model yöntemini çağıran BLL içindeki ProductsBLL sınıfına ekledik.ProductIDWe also added the DeleteProductsWithTransaction method to the ProductsBLL class in the BLL, which accepts a List of ProductID values as its input and calls the DB-Direct pattern method Delete for each ProductID. Her iki yöntem de bir işlem oluşturarak ve sonra veri değiştirme deyimlerini bir Try...Catch bloğu içinde yürütülerek başlar.Both methods start by creating a transaction and then executing the data modification statements within a Try...Catch block. Bir özel durum oluşursa, işlem geri alınır, aksi takdirde işlenir.If an exception occurs, the transaction is rolled back, otherwise it is committed.

5. adım, işlem toplu iş güncelleştirmelerinin bir işlem kullanmak için ihmal edilen toplu güncelleştirmeler ile ilgili etkisiniStep 5 illustrated the effect of transactional batch updates versus batch updates that neglected to use a transaction. Sonraki üç öğreticide, bu öğreticide bulunan temel üzerine oluşturacağız ve toplu güncelleştirme, silme ve ekleme işlemlerini gerçekleştirmek için Kullanıcı arabirimleri oluşturacağız.In the next three tutorials we will build upon the foundation laid in this tutorial and create user interfaces for performing batch updates, deletes, and inserts.

Programlamanın kutlu olsun!Happy Programming!

Daha Fazla BilgiFurther Reading

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:For more information on the topics discussed in this tutorial, refer to the following resources:

Yazar hakkındaAbout the Author

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.comadresinden erişilebilir .He can be reached at mitchell@4GuysFromRolla.com. ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.or via his blog, which can be found at http://ScottOnWriting.NET.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğreticide lider gözden geçirenler, Gardner, Tepton Giesenow ve Teresa Murphy.Lead reviewers for this tutorial were Dave Gardner, Hilton Giesenow, and Teresa Murphy. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .If so, drop me a line at mitchell@4GuysFromRolla.com.