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

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 316247 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

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

Απαιτήσεις

Η ακόλουθη λίστα περιγράφει το υλικού που συνιστώνται, λογισμικό, υποδομή δικτύου και τα 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. Ανοίξτε το φάκελο που περιέχει το έργο σας και, στη συνέχεια, εκτελέστε την ακόλουθη εντολή για να εισέλθετε στη συγκρότηση με ισχυρό όνομα:
    DistributedTransaction.snk SN -k
  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. Εκτελέστε ξανά την εντολή από το Query Analyzer βήμα 12. Σημειώστε ότι το ερώτημα επιστρέφει μια γραμμή, επειδή η συναλλαγή μπόρεσε να ολοκληρωθεί με επιτυχία.
ΣΗΜΕΙΏΣΕΙΣ:
  • Αυτό το παράδειγμα εκτελεί χειρισμού σφαλμάτων.
  • SQL Server και Microsoft Distributed Transaction Coordinator (MS DTC) πρέπει να εκτελείται σε όλα τα προγράμματα-πελάτες και διακομιστές.

Αναφορές

Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
306296ΔΙΑΔΙΚΑΣΙΕΣ: Δημιουργία ενός επιδέχεται.Στοιχείο Δικτύου που χρησιμοποιεί συναλλαγές σε Visual C#.NET

Ιδιότητες

Αναγν. άρθρου: 316247 - Τελευταία αναθεώρηση: Πέμπτη, 27 Ιανουαρίου 2011 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Λέξεις-κλειδιά: 
kbcompiler kbhowtomaster kbsqlclient kbsystemdata kbmt KB316247 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:316247

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com