Come utilizzare le transazioni COM + in un componente di Visual Basic .NET

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

In questa pagina

Sommario

In questo articolo viene illustrato come utilizzare COM + (Component Services) le transazioni in una classe di Visual Basic. NET. Un insieme di operazioni di database viene considerato come una singola unitÓ. Le operazioni tutti oppure, se un'operazione non riesce, il dell'intera transazione avrÓ esito negativo. In quest'ultimo caso, le operazioni di database che sono stati ha cercate non vengono registrate nel database sottostante.

Requisiti

Di seguito vengono indicati l'hardware, software, infrastruttura di rete, competenze e conoscenze e service pack:
  • Microsoft Windows 2000 Server in esecuzione il Service Pack 1
  • Microsoft Internet Information Services (IIS) versione 4.0 o successiva
  • Microsoft Internet Explorer versione 5.0, 5.5 o 6.0
In questo articolo si presuppone la conoscenza dei seguenti argomenti:
  • Conoscenza di concetti transazionali e di elaborazione
  • FamiliaritÓ con COM + (Servizi componenti)

Servizi transazionali di COM +

Lo spazio dei nomi System.EnterpriseServices all'interno di Microsoft .NET framework fornisce la funzionalitÓ per implementare l'elaborazione delle transazioni. Per accedere a COM + servizi transazionali, creare una classe attenendosi alla seguente procedura:
  1. Aprire Visual Studio NET..
  2. Consente di creare un nuovo progetto di libreria di classe denominato prjEnterprise in Visual Basic .NET. Visual Basic .NET crea una classe pubblica che viene denominata Class1.
  3. Aggiungere un riferimento al progetto alla libreria di System.EnterpriseServices. Nella finestra Esplora soluzioni, fare clic con il pulsante destro del mouse sulla cartella riferimenti e quindi scegliere Aggiungi riferimento dal menu di scelta rapida. Nella scheda .NET , scorrere fino a individuare System.EnterpriseServices . Fare doppio clic su System.EnterpriseServices , assicurarsi che System.EnterpriseServices visualizzato nella finestra componenti selezionati e quindi fare clic su OK .
  4. Utilizzare l'istruzione Imports per lo spazio dei nomi System.EntpriseServices e lo spazio dei nomi System.Data.SqlClient , in modo che non avranno qualificare completamente tutti i riferimenti a questi spazi dei nomi pi¨ avanti nel codice. Queste istruzioni devono comparire prima per eventuali altre istruzioni nel file di classe:
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. Per utilizzare servizi transazionali di COM +, Ŕ necessario la classe, denominata clsES, erediti funzionalitÓ da ServicedComponent:
    	Public Class clsES
    Inherits ServicedComponent
  6. Un attributo di transazione viene utilizzato per specificare il livello di supporto transazionale per la classe:
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. Creare un metodo all'interno di clsES chiamato 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:
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. Con il metodo dbAccess creato un oggetto di connessione SQL per Northwind database e quindi aprire la connessione. Eseguire le operazioni di database utilizzando il database:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. Consente di impostare un blocco try per acquisire qualsiasi elaborazione dei database che potrebbe verificarsi. ╚ necessario intercettare tali errori per essere in grado di interrompere la transazione. Il blocco try includerÓ due operazioni di database, ognuno l'aggiornamento di un altro campo di un record della tabella prodotti specificati.
    		Try
  10. Eseguire il primo aggiornamento per la tabella prodotti. Aggiornare il campo UnitsonOrder con il valore di onOrder per prodotto con ID, come specificato nei primi due parametri di input. Un SQLcommand consente di eseguire l'aggiornamento SQL:
    	   Dim Cmd As SqlCommand
          Dim sqlString As String = _
               "update products set UnitsonOrder = " & onOrder _
               & " where productId = " & pid1         
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()
  11. Eseguire un altro aggiornamento per la tabella products. Aggiornare il campo scorte con il valore di inStock per prodotto con ID, come specificato nel terzo e il quarto parametro input. Per eseguire questo aggiornamento SQL viene utilizzato un SQLCommand:
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. PoichÚ questi aggiornamenti fanno parte di una transazione, sono salvate come una singola unitÓ. Il metodo di setComplete della classe contextUtil da dello spazio dei nomi System.EnterpriseServices viene utilizzato per il commit della transazione, in questo caso due aggiornamenti--se non sono stati generati errori:
          ContextUtil.SetComplete()
  13. La connessione al database Northwind viene chiusa:
          Conn.Close()
  14. ╚ necessario intercettare eventuali errori verificatisi durante l'esecuzione di comandi SQL, in modo che l'intera transazione pu˛ essere interrotta:
    	   Catch e As Exception
  15. 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
    		End Try
  16. AffinchÚ questo componente per il corretto funzionamento, il componente necessario un nome sicuro. Attenersi alla seguente procedura per generare un nome sicuro e per firmare l'assembly con un nome sicuro:

    1. Per aprire un prompt dei comandi di Visual Studio. NET, fare clic su Start , scegliere programmi , fare clic su Microsoft Visual Studio .NET e quindi fare clic su Strumenti di .NET di Visual Studio .
    2. Al prompt di comando, digitare snEnterprise.snk -k sn.exe per assegnare un nome sicuro all'assembly.

      Per ulteriori informazioni sulla firma degli assembly con nomi sicuri, vedere la documentazione di .NET Framework SDK.
    3. Copiare snEnterprise.snk nella cartella di progetto.
    4. In AssemblyInfo.vb, aggiungere la riga di codice riportata di seguito prima o dopo le istruzioni di altri attributi assembly:
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. Salvare e generare il progetto.

Elenco completo del codice

Imports System.Data.SqlClient
Imports System.EnterpriseServices

<Transaction(TransactionOption.Required)> Public Class ClsES
    Inherits ServicedComponent

Public Sub dbAccess(ByVal pid1 As Integer, ByVal onOrder As Integer, _
      ByVal pid2 As Integer, ByVal inStock As Integer)

        Dim Conn As New _
          SqlConnection("uid=sa;database=northwind;server=localhost")
          Conn.Open()
        Try
          Dim Cmd As SqlCommand
          Dim sqlString As String = _
             "update products set UnitsonOrder = " & _
              onOrder & " where productId = " & pid1
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()

          sqlString = _

         " update products set UnitsinStock = " & inStock & _
                " where productId = " & pid2
           Cmd.CommandText = sqlString
           Cmd.ExecuteNonQuery()

           ContextUtil.SetComplete()
           Conn.Close()
        
         Catch e As Exception
            ContextUtil.SetAbort()
		  Throw e
        End Try
    End Sub 
End Class

Verifica del funzionamento

Per testare questo codice, Ŕ necessario creare un'applicazione console che utilizza 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 ha esito negativo, perchÚ il numero del prodotto specificato non esiste nella tabella prodotti. In questo modo un errore di transazione, con la transazione ignorata.
  1. Aggiungere una nuova applicazione console denominata testES alla soluzione, affinchÚ la soluzione contiene sia il progetto testES e il progetto prjEnterprise. Per aggiungere il nuovo progetto, scegliere Nuovo dal menu file , quindi progetto .
  2. VerrÓ visualizzata una la della finestra di dialogo Nuovo progetto . Selezionare la cartella di Visual Basic nel progetto tipi riquadro e quindi selezionare Applicazione Console dai modelli. Nella casella nome nel riquadro Modelli, digitare testES , che Ŕ il nome del progetto. Assicurarsi che il pulsante Aggiungi a soluzione , che appare nella parte inferiore della finestra di dialogo Ŕ selezionato. Fare clic su OK per aggiungere il progetto alla soluzione.
  3. AffinchÚ testES eseguire il test clsES, Ŕ necessario aggiungere un riferimento. Nella finestra di soluzioni, fare clic con il pulsante destro del mouse sulla riferimenti cartella sotto il testES di progetto, Ŕ stato appena aggiunto. Selezionare Aggiungi riferimento . VerrÓ visualizzata una la della finestra di dialogo Aggiungi riferimento .
  4. Selezionare la scheda progetti e quindi fare doppio clic su prjEnterprise . In Componenti selezionati , che si trova nella parte inferiore della finestra di dialogo deve essere visualizzato un riferimento. Fare clic su OK per aggiungere questo riferimento al progetto.
  5. Fare clic con il pulsante destro del mouse sull'applicazione console, testES e quindi scegliere Imposta come avvio progetto .
  6. Nel menu debug , selezionare Windows . Scegliere il sottomenu immediata . Questo garantisce che la finestra immediata sia visibile.
  7. Copiare il codice test riportato di seguito nel modulo Module1, sostituire le istruzioni Sub Main ed End Sub. Il modulo deve essere visualizzato come segue:
        Sub Main()
            Dim myTest As New prjEnterprise.clsES()
    
            Try
                myTest.dbAccess(1, 777, 2, 888)
                Debug.WriteLine("TRANSACTION ONE -- SUCCESS")
               
                myTest.dbAccess(1, 5, 2, -20)
                Debug.WriteLine("TRANSACTION TWO -- SUCCESS")
            
            Catch
                Debug.WriteLine("TRANSACTION FAILURE")
            End Try
        End Sub
  8. Premere F5 per eseguire il codice di test.
  9. Nel codice nel passaggio 7, la prima chiamata a dbAccess ha esito positivo. Nella tabella prodotti sono un prodotto 1 e un prodotto di 2. Il campo di onOrder per prodotto 1 viene aggiornato a 777 e inStock campo per il prodotto 2 viene aggiornato 888. PoichÚ Ŕ stata completata la transazione deve visualizzare il messaggio "TRANSACTION operazione riuscita - ONE" solo nella finestra controllo immediato.

    La seconda chiamata a dbAccess non riuscirÓ. Di conseguenza, non una delle istruzioni di aggiornamento all'interno dbAccess per i prodotti tabella vengono registrate nel database. Anche se il campo onOrder aggiornato per 5 Impossibile dispongono di prodotto 1, prodotto 2 non pu˛ avere l'inStock campo impostato su-20. A causa di un vincolo definito nella definizione della tabella prodotti, inStock non Ŕ consentito i numeri negativi.

    Di conseguenza, la chiamata a dbAccess ha esito negativo, causando il problema dell'intera transazione. La Tabella prodotti rimane era prima della chiamata a dbAccess. L'istruzione Catch gestisce la notifica dell'errore di transazione da dbAccess, causando il messaggio "TRANSACTION FAILURE" viene visualizzato nella finestra immediata.
Esaminare il contenuto della tabella prodotti di Northwind utilizzando la SQL Server Enterprise Manager. Quando si visualizza il prodotto 1, il campo di onOrder Ŕ uguale a 777; per prodotto 2, il instock campo Ŕ 888. Di conseguenza, la chiamata seconda per dbAccess che avrebbe comportato valori diversi per questi campi non riuscita.

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, presente nello 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. Nell'esempio che segue il metodo di associato ottiene 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 genera applicazioni distribuite
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/

Componenti serviti
http://msdn.microsoft.com/en-us/library/aa289839.aspx

ProprietÓ

Identificativo articolo: 315707 - Ultima modifica: martedý 8 novembre 2005 - Revisione: 3.2
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi:á
kbmt kbhowtomaster KB315707 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: 315707
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