Come utilizzare le transazioni COM + in un componente di Visual C#

Traduzione articoli Traduzione articoli
Identificativo articolo: 816141 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene descritto come utilizzare COM + le transazioni di (Servizi componenti) in una classe C#. Un insieme di operazioni di database viene considerato un'unitÓ. Tutte le operazioni di esito positivo oppure, se un'operazione non riesce, l'intera transazione avrÓ esito negativo. In quest'ultimo caso, le operazioni di database effettuate non vengono registrate nel database sottostante.

Requisiti

Di seguito vengono indicati hardware, software, infrastruttura di rete, competenze e conoscenze e service pack Ŕ necessario disporre di:
  • Microsoft Windows 2000 Server SP1
  • Microsoft Internet Information Services (IIS) versione 4.0 o successiva
  • Microsoft Internet Explorer versioni 5.0, 5.5 o 6.0
In questo articolo si presume la familiaritÓ con le seguenti operazioni:
  • Concetti transazionali e di elaborazione
  • COM + (Servizi componenti)

Servizi di transazione COM +

╚ possibile implementare l'elaborazione con lo spazio dei nomi System.EnterpriseServices in Microsoft .NET Framework di transazioni. Per l'accesso COM + servizi transazionali, creare una classe. Per effettuare questa operazione, attenersi alla seguente procedura:
  1. Avviare Visual Studio .NET o Visual Studio 2005.
  2. Scegliere Nuovo dal menu file , quindi progetto .
  3. Fare clic su Progetti di Visual C# in Tipi progetto e quindi fare clic su Libreria di classi in modelli . Nome del progetto prjEnterprise .

    Nota In Visual Studio 2005, fare clic su Visual C# in Tipi progetto e quindi fare clic su Libreria di classi in modelli . Nome del progetto prjEnterprise .
  4. Per impostazione predefinita, viene creato Class1.
  5. In Esplora soluzioni, fare clic con il pulsante destro del mouse su riferimenti e quindi fare clic su Aggiungi riferimento .
  6. VerrÓ visualizzata la finestra di dialogo Aggiungi riferimento . In Nome componente nella scheda .NET fare doppio clic su System.EnterpriseServices .
  7. Assicurarsi che sia System.EnterpriseServices visualizzato nella casella Componenti selezionati . Fare clic su OK .
  8. Aggiungere il codice riportato di seguito prima di eventuali altre istruzioni nel file Class1.cs:
    using System.EnterpriseServices;
    using System.Data.SqlClient;
  9. Aggiungere una nuova classe denominata clsES al file Class1.cs.
  10. Per utilizzare servizi transazionali di COM +, la classe ( clsES ) deve ereditare funzionalitÓ dalla ServicedComponent come segue:
    public class clsES : ServicedComponent
  11. Un attributo Transaction consente di specificare il livello di supporto transazionale per la classe come segue:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. Creare un metodo nella classe clsES e denominarla dbAccess riceve quattro parametri di input numero intero. I primi due parametri forniscono un numero di serie e le unitÓ in ordine per quel prodotto. I secondo di due parametri forniscono un numero di serie e le unitÓ in scorta per quel prodotto. Questo metodo esegue una serie di operazioni di database a fronte di questi ID di prodotto specificato devono essere considerati come una transazione:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. Con il metodo dbAccess creato un oggetto di connessione SQL per Northwind database e quindi aprire la connessione. Le operazioni di database verificano utilizzando il seguente database:

    Nota Ricordarsi di modificare i seguenti parametri di stringa di connessione per riflettere i valori corretti per il server di SQL Server.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
    				Conn.Open();
    
  14. Consente di impostare un blocco try per acquisire tutte le eccezioni che potrebbero verificarsi durante l'elaborazione del database. ╚ necessario intercettare le eccezioni per interrompere la transazione. Il blocco try include due operazioni di database. Ogni operazione aggiorna un campo diverso in un record del tabella prodotti specificati.
     try { 
    
  15. Eseguire il primo aggiornamento per la tabella prodotti. Consente di aggiornare il campo UnitsonOrder con il valore onOrder per prodotto con ID, come specificato nei primi due parametri di input. Utilizzare il seguente comando SQL per eseguire l'aggiornamento SQL:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
    				sqlCommand.ExecuteNonQuery();
  16. Eseguire un altro aggiornamento per la tabella products. Aggiornare il campo scorte con l'inStock valore per il prodotto con ID, come specificato nel terzo e il quarto parametro input. Utilizzare il seguente comando SQL per eseguire l'aggiornamento SQL:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
    				sqlCommand.ExecuteNonQuery();
    
  17. PoichÚ questi aggiornamenti fanno parte di una transazione, sono salvate come una singola unitÓ. Il metodo setComplete della classe contextUtil da dello spazio dei nomi System.EnterpriseServices viene utilizzato per il commit della transazione (in questo caso i due Aggiorna) se non sono stati generati errori:
    ContextUtil.SetComplete();
  18. La connessione al database Northwind viene chiusa:
    Conn.Close();
    }
  19. ╚ necessario intercettare eventuali eccezioni generate durante l'esecuzione di comandi SQL in modo da poter annullare l'intera transazione:
    catch(Exception e){ 
  20. Il metodo setAbort della classe contextUtil da dello spazio dei nomi System.EnterpriseServices viene utilizzato per interrompere l'intera transazione. Se il primo aggiornamento ha esito positivo e il secondo aggiornamento non riesce, non aggiornamento viene registrato nella tabella prodotti. Viene generata l'eccezione intercettata al chiamante, che indica che la transazione non riuscita:
    ContextUtil.SetAbort();
    				throw e;
    }
  21. Per questo componente per il corretto funzionamento, Ŕ necessario che il componente necessario un nome sicuro. Consente di generare un nome sicuro e quindi di firmare l'assembly con un nome sicuro. Per effettuare questa operazione, attenersi alla seguente procedura:
    1. Al prompt di comando di Visual Studio. NET, digitare snEnterprise.snk -k sn.exe per creare un file chiave. Per ulteriori informazioni sulla firma degli assembly con nomi sicuri, vedere la documentazione di .NET Framework SDK.
    2. Copiare snEnterprise.snk la cartella di progetto.
    3. In AssemblyInfo.vc, aggiungere la riga di codice riportata di seguito prima o dopo le istruzioni di altri attributi dell'assembly:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]		
    4. Salvare e quindi generare il progetto.

Elenco completo del codice

Nota Remember to change the following connection string parameters to reflect the correct values for your SQL Server server.
using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.Common;
using System.EnterpriseServices;
using System.Data.SqlClient;

namespace prjEnterprise
{
	
	[Transaction(TransactionOption.Required)]public class clsES:ServicedComponent
	{
		public SqlConnection Conn;

		public void dbAccess(int pID1, int onOrder, int pID2, int inStock)
		{
			try
			{			
				SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
				Conn.Open();
				
SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
				sqlCommand.ExecuteNonQuery();
				
				sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
				sqlCommand.ExecuteNonQuery();

				ContextUtil.SetComplete();
				Conn.Close();
			}
			catch(Exception e)
			{
				ContextUtil.SetAbort();
			
				throw e;
			}
			finally
			{

			}
		}
	}	
}

Verifica del funzionamento

Per testare questo codice, Ŕ necessario creare un'applicazione console che utilizza il progetto clsES. In un caso, una transazione ha esito positivo e il onorder e instock vengono aggiornati i campi per il prodotto specificato. Nel secondo caso, l'aggiornamento per il campo onOrder un prodotto specificato ha esito positivo, ma l'aggiornamento per l'inStock campo per un prodotto non riesce perchÚ il numero di prodotto specificato non esiste nella tabella prodotti. In questo modo un errore di transazione, e la transazione viene ignorata.
  1. In Visual Studio .NET o Visual Studio 2005, scegliere Nuovo dal menu file , quindi progetto .
  2. Fare clic su Progetti di Visual C# in Tipi progetto e quindi fare clic su Applicazione Console in modelli .

    Nota In Visual Studio 2005, fare clic su Visual C# in Tipi progetto e quindi fare clic su Applicazione Console in modelli .
  3. Nella casella di testo nome digitare testES . Assicurarsi che Ŕ selezionata l'opzione Aggiungi a soluzione .
  4. Fare clic su OK per aggiungere il progetto alla soluzione.
  5. Per testES eseguire il test clsES , Ŕ necessario aggiungere un riferimento. In Esplora soluzioni, fare clic con il pulsante destro del riferimenti sotto testES (che Ŕ stato appena aggiunto) e quindi fare clic su Aggiungi riferimento .
  6. VerrÓ visualizzata la finestra di dialogo Aggiungi riferimento . Nella scheda progetti , fare doppio clic su prjEnterprise .
  7. Un riferimento verrÓ visualizzato in selezionati componenti . Fare clic su OK per aggiungere questo riferimento al progetto.
  8. Aggiungere un riferimento al progetto alla libreria di System.EnterpriseServices. In Esplora soluzioni, fare clic con il pulsante destro del mouse su riferimenti e quindi fare clic su Aggiungi riferimento .
  9. VerrÓ visualizzata la finestra di dialogo Aggiungi riferimento . In Nome componente nella scheda .NET fare doppio clic su System.EnterpriseServices .
  10. Assicurarsi che sia System.EnterpriseServices visualizzato nella casella Componenti selezionati . Fare clic su OK .
  11. Fare clic con il pulsante destro del mouse l'applicazione console ( testES ), quindi scegliere Imposta come progetto di avvio
  12. Incollare il seguente codice di origine nella funzione Main della classe Class1 :
    	prjEnterprise.clsES myTest = new prjEnterprise.clsES();
    
    				try 
    				{
    					myTest.dbAccess(1, 777, 2, 888);
    					Console.WriteLine("TRANSACTION ONE -- SUCCESS");
    
    					myTest.dbAccess(1, 5, 2, -20);
    					Console.WriteLine("TRANSACTION TWO -- SUCCESS");
    				}
    				catch (Exception e)
    				{
    					Console.WriteLine("TRANSACTION FAILURE");
    				}
  13. Premere F5 per eseguire il codice di test.

    Nel codice nel passaggio 7, la prima chiamata a dbAccess ha esito positivo. Prodotto 1 e 2 di prodotti sono nella tabella prodotti. Il campo di onOrder per prodotto 1 viene aggiornato a 777 e inStock campo per il prodotto 2 viene aggiornato 888. PoichÚ Ŕ stata completata l'operazione viene visualizzato il seguente messaggio nella finestra di output
    ESITO UNA - POSITIVO TRANSAZIONE


    La seconda chiamata a dbAccess non riuscirÓ. Di conseguenza, nessuna istruzione update in dbAccess alla tabella prodotti viene registrato il database. Sebbene prodotto 1 potrebbe avere il campo onOrder aggiornato per 5 , non pu˛ disporre di prodotto 2 relativo inStock campo impostato su -20 . A causa di un vincolo definito nella definizione della tabella prodotti inStock non Ŕ possono avere i numeri negativi.

    Pertanto, questa chiamata a dbAccess ha esito negativo e l'intera transazione avrÓ esito negativo. La tabella prodotti mantenuta come era prima della chiamata a dbAccess . L'istruzione catch gestisce la notifica dell'errore di transazione da dbAccess , e viene visualizzato il seguente messaggio di errore nella finestra di output:
    ERRORE DI TRANSAZIONE
  14. Esaminare il contenuto della tabella prodotti di Northwind utilizzando SQL Server Enterprise Manager. Quando si visualizza il prodotto 1, il campo onOrder Ŕ uguale a 777. Quando si visualizza prodotto 2, il instock campo Ŕ 888. Di conseguenza, la seconda chiamata a dbAccess (che avrebbe comportato valori diversi per questi campi) avrÓ esito negativo.

Risoluzione dei problemi

  • Assicurarsi che qualsiasi progetto che utilizza i servizi COM + sia un nome sicuro.
  • Qualsiasi classe che utilizza i servizi COM + deve ereditare dal componente servito. Il componente servito si trova dello spazio dei nomi System.EnterpriseServices .
  • Durante il debug, una transazione pu˛ timeout prima che venga eseguito il commit o interrotta. Per evitare un timeout, utilizzare una proprietÓ di timeout dell'attributo di transazione. In questo esempio, il metodo associato dispone di 1.200 secondi per completare qualsiasi transazione prima del timeout:
    [Transaction(TransactionOption.Required,timeout=1200)]

Riferimenti

Per ulteriori informazioni, visitare il seguente sito Web Microsoft Developer Network (MSDN):
COM + Integration: How .NET Enterprise Services ╚ consentono generazione di applicazioni distribuite
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
Componenti serviti
http://msdn2.microsoft.com/en-us/library/Aa289839(VS.71).aspx

ProprietÓ

Identificativo articolo: 816141 - Ultima modifica: giovedý 22 novembre 2007 - Revisione: 4.3
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Chiavi:á
kbmt kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster KB816141 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 816141
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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