Je bent nu offline; er wordt gewacht tot er weer een internetverbinding is

PROCEDURE: Uitvoeren van een gedistribueerde transactie met een.NETTO-Provider via ServicedComponent in Visual c#.NETTO

BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.

De Engelstalige versie van dit artikel is de volgende:316247
Voor een Microsoft Visual Basic.NETTO-versie van dit artikel, raadpleegt u316627.

Dit artikel verwijst naar de volgende Microsoft.Naam ruimten NET Framework Class Library:
  • System.data.SqlClient
  • System
  • System.Runtime.CompilerServices
  • System. Reflection

IN DEZE TAAK

Samenvatting
In dit artikel ziet u hoe een gedistribueerde transactie uitvoeren met behulp van een.NETTO-provider met hetServicedComponentklasse. Hoewel dit artikel maakt gebruik van de SqlClient.NETTO voorziening tegen een server met Microsoft SQL Server, ook kunt u de ODBC of OLE DB.NETTO managed provider.

back to the top

Vereisten

De volgende lijst bevat een overzicht van de aanbevolen hardware, software, net werk infrastructuur en service packs nodig:
  • Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server
  • Microsoft Visual Studio.NETTO
  • Microsoft SQL Server 7. 0 of Microsoft SQL Server 2000
back to the top

Overzicht

Exemplaren van een..NET Framework-klasse kan deel nemen aan een automatische transactie als u de klasse deze voorbereidt. Elke bron die een klasse-instantie of een object benadert stroomt in de transactie. Als bijvoorbeeld een object wordt ADO gebruikt.NETTO boeken geld op een rekening in een data base, de bronnen beheerder voor de data base bepaalt of het object in een transactie wordt uitgevoerd. Als het object moet worden uitgevoerd in een transactie, stroomt de bronnenbeheerder automatisch de data base in de transactie.

Volg de onderstaande procedure om een klasse te nemen in een automatische transactie voorbereiden:
  1. Gelden deTransactionAttributeklasse aan uw klasse het type automatische transactie waarin de component opgeven.

    Het transactie type moet lid zijn van deTransactionOptionopsomming.
  2. Afgeleid van de klasse van deServicedComponentklasse.ServicedComponentis de basis klasse van alle klassen die COM+-services gebruiken.
  3. De assembly met een sterke naam om ervoor te zorgen dat de assembly een uniek sleutel paar bevat ondertekenen.
  4. Registreer de assembly met de klasse met de COM+-catalogus.

    OPMERKING: Als de client die een exemplaar van de klasse belt wordt beheerd door de common language runtime, wordt de registratie uitgevoerd voor u. Deze stap is alleen vereist als een onbeheerde beller maakt en exemplaren van de klasse roept. Gebruik het.NET Services Installation Tool (regsvcs. exe) handmatig registreren de assembly.
Zie het volgende onderwerp in de Microsoft voor meer informatie over het ondertekenen van een assembly met een sterke naam..NET Framework Developer's Guide:
Ondertekening van een Assembly met een sterke naam
http://msdn.Microsoft.com/en-us/library/xc31ft41.aspx
Zie het volgende onderwerp in de Microsoft voor meer informatie over dit proces..NET Framework Developer's Guide:
Automatische transacties en..NET Framework-klassen
http://msdn.Microsoft.com/en-us/library/ms123400.aspx
back to the top

Het Project maken

  1. Ga als volgt te werk om het maken van een nieuw Console toepassings project in Visual c#.NET:
    1. Start Visual Studio.NET.
    2. Op deBestandhet menuNieuwe, en klik vervolgens opProject.
    3. In deNieuw Projecthet dialoog venster, klikt u opVisual c#-projectenonderProject typen, klik opConsole toepassingonderSjablonen, en klik vervolgens opOK.
    4. In de Solution Explorer, naam van het bestand Class1.cs als DistributedTransaction.cs.
  2. Verwijder alle code uit het bestand DistributedTransaction.cs.
  3. Op deProjectmenu, klikt u opVerwijzing toevoegen, en voeg de volgende verwijzingen:
    • System
    • System.data.dll

  4. Opmerking in het bestand AssemblyInfo.cs uit de volgende code regels:
    [assembly: AssemblyKeyFile("")][assembly: AssemblyKeyName("")]					
  5. Voeg de volgende code aan het DistributedTransaction.cs bestand:
    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. Op deBestandmenu, klikt u opAlles opslaan.
  7. Klik opStart, wijsProgramma's, wijsMicrosoft Visual Studio.NETTO, wijsVisual Studio.Net werk hulp programma's, en klik vervolgens opVisual Studio.NETTO-opdrachtprompt.
  8. Open de map met het project en voer de volgende opdracht om de assembly met een sterke naam ondertekenen:
    SN -k DistributedTransaction.snk
  9. Uw toepassing maken.
  10. Maak de volgende tabel in de eerste 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]GOCREATE TABLE [dbo].[TestTransaction] (	[Col1] [int] NULL ,	[Col2] [varchar] (100) NULL ) ON [PRIMARY]GO 					
  11. De toepassing wordt uitgevoerd. Er verschijnt het volgende foutbericht (dit is de verwachte werking):
    Transactie afgebroken: Fout geretourneerd: ongeldige object naam 'nonexistenttable'.
  12. Open SQL Server Query Analyzer, voeg de volgende code en druk op F5 als u de query wilt uitvoeren:
    USE NORTHWIND;SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'						
    Houd er rekening mee dat de query geen rijen retourneert omdat de transactie is afgebroken.
  13. Zoek de volgende code in Visual c#-project:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";						
    en vervangt u de SQL-instructie met een geldige query waardoor de transactie af te breken. Bijvoorbeeld:
    String exceptionCausingCmdSQL = "Select @@Identity from customers";					
  14. Druk op F5 om te compileren en de toepassing opnieuw uit te voeren.
  15. Voer de opdracht opnieuw uit stap 12 in Query Analyzer. U ziet dat de query resulteert in een rij omdat de transactie is voltooid.
NOTITIES:
  • In dit voorbeeld geen fout afhandeling uitgevoerd.
  • SQL Server en Microsoft Distributed Trans act ion Coordinator (MS DTC) moet worden uitgevoerd op alle clients en servers.
back to the top
Referenties
Voor meer informatie klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
306296PROCEDURE: Een service maken.NETTO Component die transacties in Visual c# gebruikt.NETTO

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 316247 - Laatst bijgewerkt: 02/28/2011 01:38:00 - Revisie: 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 KbMtnl
Feedback