ΔΙΑΔΙΚΑΣΙΕΣ: Εκτέλεση μιας κατανεμημένης συναλλαγής με μια υπηρεσία παροχής .NET χρησιμοποιώντας το ServicedComponent στη Visual C# .NET

Για την Microsoft Visual Basic .NET έκδοση αυτού του άρθρου, ανατρέξτε στην ενότητα 316627 .


Αυτό το άρθρο αναφέρεται από τα παρακάτω πεδία ονομάτων βιβλιοθήκη κλάσης του Microsoft .NET Framework:

  • System.Data.SqlClient
  • System.EnterpriseServices
  • System.Runtime.CompilerServices
  • System.Reflection

ΣΕ ΑΥΤΉΝ ΤΗΝ ΕΡΓΑΣΊΑ

Σύνοψη

Αυτό το άρθρο βήμα προς βήμα παρουσιάζει τον τρόπο για να εκτελέσετε μια κατανεμημένη συναλλαγή, χρησιμοποιώντας μια υπηρεσία παροχής .NET με το ServicedComponent κλάση. Αν και αυτό το άρθρο χρησιμοποιεί η υπηρεσία παροχής SqlClient .NET σε διακομιστή Microsoft SQL Server, μπορείτε επίσης να χρησιμοποιήσετε τη διαχειριζόμενη υπηρεσία παροχής ODBC ή OLE DB .NET.

Απαιτήσεις

Η ακόλουθη λίστα περιγράφει το υλικού που συνιστώνται, λογισμικό, υποδομή δικτύου και τα service pack που απαιτούνται:

  • Τα Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 ή του Microsoft SQL Server 2000

Επισκόπηση

Τις παρουσίες μιας κλάσης .NET Framework μπορούν να συμμετέχουν σε μια συναλλαγή που αυτόματα εάν προετοιμάζετε την κλάση για να γίνει αυτό. Κάθε πόρος που μια παρουσία κλάσης ή ενός αντικειμένου αποκτά πρόσβαση αποταθεί στη συναλλαγή. Για παράδειγμα, εάν ένα αντικείμενο χρησιμοποιεί ADO.NET για να καταχωρήσετε χρήματα σε ένα λογαριασμό σε μια βάση δεδομένων, η διαχείριση πόρων για τη βάση δεδομένων καθορίζει αν το αντικείμενο εκτελείται στη συναλλαγή. Εάν το αντικείμενο πρέπει να εκτελείται σε μια συναλλαγή, η διαχείριση πόρων αποταθεί αυτόματα τη βάση δεδομένων στη συναλλαγή.

Χρησιμοποιήστε την ακόλουθη διαδικασία για να προετοιμάσετε μια κλάση να συμμετέχουν σε μια συναλλαγή που αυτόματα:

  1. Εφαρμογή της κλάσης TransactionAttribute στην κλάση σας, για να καθορίσετε τον τύπο αυτόματης συναλλαγής που απαιτεί το στοιχείο.

    Ο τύπος κίνησης πρέπει να είστε μέλος της απαρίθμησης TransactionOption .
  2. Παράγει την κλάση σας από το ServicedComponent κλάση. ServicedComponent είναι η βασική κλάση του όλες τις κλάσεις που χρησιμοποιούν υπηρεσίες COM +.
  3. Υπογραφή της συγκρότησης με ισχυρό όνομα για να βεβαιωθείτε ότι η συγκρότηση περιέχει ένα μοναδικό ζεύγος κλειδιών.
  4. Η καταχώρηση της συγκρότησης που περιέχει την κλάση με τον κατάλογο COM +.

    ΣΗΜΕΊΩΣΗ: Εάν το πρόγραμμα-πελάτη που καλεί μια παρουσία της κλάσης σας γίνεται από το χρόνο εκτέλεσης κοινής γλώσσας, η καταχώρηση πραγματοποιείται για εσάς. Αυτό το βήμα απαιτείται μόνο αν μια μη διαχειριζόμενη καλών δημιουργεί και καλεί τις παρουσίες της κλάσης σας. Χρησιμοποιήστε το εργαλείο εγκατάστασης υπηρεσίες .NET (Regsvcs.exe) για να κάνετε μη αυτόματη καταχώρηση της συγκρότησης.
Για περισσότερες πληροφορίες σχετικά με το πώς να υπογράφουν μια συγκρότηση με ισχυρό όνομα, ανατρέξτε στο ακόλουθο θέμα στο Εγχειρίδιο προγραμματιστή του Microsoft .NET Framework:

Υπογραφή συγκρότηση με ισχυρό όνομα
http://msdn.microsoft.com/en-us/library/xc31ft41.aspx
Για περισσότερες πληροφορίες σχετικά με αυτήν τη διαδικασία, ανατρέξτε στο ακόλουθο θέμα στο Εγχειρίδιο προγραμματιστή του Microsoft .NET Framework:

Αυτόματες συναλλαγές και .NET Framework κλάσεις
http://msdn.microsoft.com/en-us/library/ms123400.aspx

Δημιουργία έργου

  1. Ακολουθήστε τα παρακάτω βήματα για να δημιουργήσετε ένα νέο έργο εφαρμογής κονσόλας στο Visual C# .NET:
    1. Ξεκινήστε το Visual Studio .NET.
    2. Στο μενού αρχείο , επιλέξτε Δημιουργίακαι, στη συνέχεια, κάντε κλικ στο έργο.
    3. Στο πλαίσιο διαλόγου " Νέο έργο ", κάντε κλικ στο κουμπί Visual C# έργα στην περιοχή Τύποι έργου, κάντε κλικ στο κουμπί Εφαρμογή κονσόλας στην περιοχή πρότυπακαι, στη συνέχεια, κάντε κλικ στο κουμπί OK.
    4. Στην Εξερεύνηση λύσεων, μετονομάστε το αρχείο Class1.cs ως DistributedTransaction.cs.
  2. Διαγράψτε όλο τον κώδικα από το αρχείο DistributedTransaction.cs.
  3. Στο μενού ' έργο ', κάντε κλικ στο κουμπί Προσθήκη αναφοράςκαι, στη συνέχεια, προσθέστε τις παρακάτω αναφορές:
    • System.EnterpriseServices
    • System.Data.dll

  4. Στο αρχείο AssemblyInfo.cs, σχολιάστε τις παρακάτω γραμμές κώδικα:
    [assembly: AssemblyKeyFile("")][assembly: AssemblyKeyName("")]

  5. Προσθέστε τον ακόλουθο κώδικα στο αρχείο DistributedTransaction.cs:
    using System;using System.Data.SqlClient;
    using System.EnterpriseServices;
    using System.Runtime.CompilerServices;
    using System.Reflection;

    [assembly: ApplicationName("DistributedTransaction")]
    [assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")]


    namespace DistributedTransaction
    {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    try
    {
    DistributedTran myDistributedTran = new DistributedTran();
    myDistributedTran.TestDistributedTransaction();
    }
    catch (System.Data.SqlClient.SqlException e)
    {
    System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message);
    }
    }
    }
    /// <summary>
    /// Summary description for TestApp.
    /// </summary>
    [Transaction(TransactionOption.Required)]
    public class DistributedTran: ServicedComponent
    {
    public DistributedTran()
    {
    }
    [AutoComplete]
    public string TestDistributedTransaction()
    {
    // The following Insert statement goes to the first server.
    // This Insert statement does not produce any errors.
    String insertCmdSql = "Insert Into TestTransaction (Col1, Col2) Values (1,'Sql Test')";

    // The following Delete statement goes to the second server.
    // Because the table does not exist, this code throws an exception.
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";

    // The following connection strings create instances of two SqlConnection objects
    // to connect to two different SQL Server servers in your environment.
    // Modify the connection strings as necessary for your environment.
    SqlConnection SqlConn1 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
    SqlConnection SqlConn2 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");

    try
    {
    SqlCommand insertCmd = new SqlCommand(insertCmdSql,SqlConn1);
    SqlCommand exceptionCausingCmd = new SqlCommand(exceptionCausingCmdSQL,SqlConn2);

    // This command runs properly.
    insertCmd.Connection.Open();
    insertCmd.ExecuteNonQuery();


    // This command results in an exception, which automatically rolls back
    // the first command (the insertCmd command).
    exceptionCausingCmd.Connection.Open();
    int cmdResult = exceptionCausingCmd.ExecuteNonQuery();

    SqlConn1.Close();
    SqlConn2.Close();

    Console.WriteLine("Hello");

    }
    catch (System.Data.SqlClient.SqlException ex)
    {
    // After you catch the exception in this function, throw it.
    // The service component receives this exception and
    // aborts the transaction. The service component then
    // throws the same exception, and the calling function
    // receives the error message.
    Console.WriteLine (ex.Message);
    throw (ex);
    }
    finally
    {
    // Close the connection.
    if (SqlConn1.State.ToString() == "Open")
    SqlConn1.Close();

    if (SqlConn2.State.ToString() == "Open")
    SqlConn2.Close();
    }

    return "Success";

    }

    }
    }

  6. Στο μενού αρχείο , κάντε κλικ στο κουμπί " Αποθήκευση όλων".
  7. Κάντε κλικ στο κουμπί Έναρξη, επιλέξτε την εντολή προγράμματα, στην Microsoft Visual Studio.NET, επιλέξτε Εργαλεία του Visual Studio .NETκαι, στη συνέχεια, κάντε κλικ στο κουμπί Visual Studio .NET γραμμή εντολών.
  8. Ανοίξτε το φάκελο που περιέχει το έργο σας και, στη συνέχεια, εκτελέστε την ακόλουθη εντολή για την υπογραφή της συγκρότησης με ισχυρό όνομα:
    Σειρ. Αρ. -k DistributedTransaction.snk
  9. Δημιουργήστε την εφαρμογή σας.
  10. Δημιουργήστε τον ακόλουθο πίνακα, στον πρώτο διακομιστή SQL Server:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTransaction]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[TestTransaction]
    GO

    CREATE TABLE [dbo].[TestTransaction] (
    [Col1] [int] NULL ,
    [Col2] [varchar] (100) NULL
    ) ON [PRIMARY]
    GO

  11. Εκτελέστε την εφαρμογή σας. Παρατηρήστε ότι λαμβάνετε το ακόλουθο μήνυμα λάθους (που είναι η αναμενόμενη συμπεριφορά):
    Συναλλαγής ματαιώθηκε: Επιστράφηκε σφάλμα: μη έγκυρο όνομα αντικειμένου 'NonExistentTable'.
  12. Ανοίξτε το διακομιστή SQL Query Analyzer, προσθέστε τον ακόλουθο κώδικα και, στη συνέχεια, πιέστε το πλήκτρο F5 για να εκτελέσετε το ερώτημα:
    USE NORTHWIND;SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'

    Σημειώστε ότι το ερώτημα επιστρέφει τις γραμμές επειδή η συναλλαγή ματαιώθηκε.
  13. Εντοπίστε τον ακόλουθο κώδικα στο έργο Visual C#:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";
    και αντικαταστήστε την πρόταση SQL με ένα έγκυρο ερώτημα που δεν προκαλεί τη συναλλαγή να ματαιωθεί. Για παράδειγμα:
    String exceptionCausingCmdSQL = "Select @@Identity from customers";
  14. Πατήστε F5 για να μεταγλωττίσετε και να εκτελέσετε ξανά την εφαρμογή.
  15. Εκτελέστε ξανά την εντολή από το βήμα 12 με την ανάλυση του ερωτήματος. Σημειώστε ότι το ερώτημα επιστρέφει μια γραμμή, επειδή η συναλλαγή ήταν σε θέση να ολοκληρωθεί με επιτυχία.
ΣΗΜΕΙΏΣΕΙΣ:

  • Αυτό το παράδειγμα εκτελεί χειρισμού σφαλμάτων.
  • SQL Server και Microsoft Distributed Transaction Coordinator (MS DTC) πρέπει να εκτελείται σε όλα τα προγράμματα-πελάτες και διακομιστές.

Αναφορές

Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

306296 ΔΙΑΔΙΚΑΣΙΕΣ: Δημιουργήστε ένα στοιχείο συντηρηθεί .NET που χρησιμοποιεί συναλλαγές σε Visual C# .NET
Ιδιότητες

Αναγνωριστικό άρθρου: 316247 - Τελευταία αναθεώρηση: 21 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια