Transazioni

venerdì 22 marzo 2013 - 17.37
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Visual Studio 2008  |  MySQL 5.5

Mau67 Profilo | Expert

Ciao forum ho parlato troppo presto e ho accettato la risposta, il codice che ho scritto mi da errore di connessione aperta e non riesco a capire perchè vi posto il codice

Public Sub RunSqlTransaction()
Connection.Open()
Dim myCommand As MySqlCommand = Connection.CreateCommand()
Dim myTrans As MySqlTransaction

' Start a local transaction
myTrans = Connection.BeginTransaction()
' Must assign both transaction object and connection
' to Command object for a pending local transaction
myCommand.Connection = Connection
myCommand.Transaction = myTrans
Dim id As ListViewItem
Dim idCollection As ListView.CheckedListViewItemCollection = Me.ListView2.CheckedItems
Me.ProgressBar1.Minimum = 0
Me.ProgressBar1.Maximum = idCollection.Count
Me.ProgressBar1.Step = 1
Me.ProgressBar1.Value = Me.ProgressBar1.Minimum

For Each id In idCollection
If id.Checked = True Then
Try
myCommand.CommandText = "INSERT INTO cartella_sanitaria (CodiceFiscale, PartitaIva, Visita, Data_Visita)" & _
"SELECT CodiceFiscale, PartitaIva, Visita, '" & ConvertData.GetDataForMySql(DateTimePicker1.Value) & "' FROM cartella_sanitaria WHERE ID = " & id.Text & ""
myCommand.ExecuteNonQuery()
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"
myCommand.ExecuteNonQuery()
myTrans.Commit()
Console.WriteLine("Tutti le cartelle sono state preparate correttamente.")
Catch e As Exception
Try
myTrans.Rollback()
Catch ex As MySqlException
If Not myTrans.Connection Is Nothing Then
Console.WriteLine("Un'eccezione di tipo " & ex.GetType().ToString() & _
" È stato rilevato durante il tentativo di eseguire il rollback della transazione.")
End If
End Try

Console.WriteLine("Un'eccezione di tipo " & e.GetType().ToString() & _
"È stato rilevato durante l'inserimento dei dati.")
Console.WriteLine("Nessun record è stato scritto nel database.")
Finally

Connection.Close()
End Try
End If

Me.ProgressBar1.PerformStep()
Next
Me.ProgressBar1.Value = Me.ProgressBar1.Minimum
End Sub 'RunSqlTransaction

spero in un aiuto grazie
Mau67

AntCiar Profilo | Expert

il Connection.Close() lo hai messo all'interno del ciclo. Ciò fa si che alla prima iterazione va bene ma alla seconda la connessione risulta chiusa.

Sposta il Connection.Close() al di fuori del ciclo e vedi che funziona.
Cristian Barca

Mau67 Profilo | Expert


lo spostato prima qui
Finally
End If
Connection.Close()
Me.ProgressBar1.PerformStep()
poi qui

Finally
End If
Next
Me.ProgressBar1.Value = Me.ProgressBar1.Minimum
Connection.Close()

mi da sempre questo errore " myTrans.Rollback() Connection must be valid and open to rollback transaction"
non capisco
Mau67

ridaria Profilo | Expert

non è che c'è tento da dire ......

quando fa il rollBack non trova la connessione.

Per cui fai un attento controllo e verifica quando e perché si chiude.

CIAO
Riccardo D'Aria

AntCiar Profilo | Expert

prima di chiudere la connessione devi fare il commit dei dati

fai mytrans.Commit()

PS il metodo l'ho scritto senza utilizzare l'editor quindi può darsi che non abbia la stessa sinstassi.
Cristian Barca

Mau67 Profilo | Expert

mytrans.Commit()

in quale posizione devo inserirla?

e la connection.close anche questa dove devo inserirla in quale posizione del codice?

Mau67

AntCiar Profilo | Expert

La transazione lascia "temporaneamete" appesi tutti i comandi che hai lanciato su DB dall'avvio della transazione.

Quando fai "Commit" te li rende effettivi nel db, se invece fai RollBack li annulli tutti.

Nel tuo caso prima di chiudere la connessione.
Cristian Barca

ridaria Profilo | Expert

>mytrans.Commit()
>
>in quale posizione devo inserirla?

al termine delle operazioni di scrittura.
Questo serve per dire al DB di rendere definitive le operazioni di scrittura.

conn.close dopo il mytrans.commit
questo serve a chiudere la connessione al DB


Riccardo D'Aria

Mau67 Profilo | Expert

lo messo dopo mytrans.Commit()

myTrans.Rollback() qui restituisce l'errore
Mau67

ridaria Profilo | Expert

ma il rollback sai a cosa serve?

Serve ad annullare le operazioni di scrittura.

e si usa se qualcosa è andata male.

ciao
Riccardo D'Aria

Mau67 Profilo | Expert

Quindi devo inserirlo o no il roolback?
Mau67

ridaria Profilo | Expert

si ma solo se qualcosa è andata male, e cioè, tecnicamente nel catch.

dove la routine cad3e s3e c'è stato un errore.
Da quello che vedevo hai due try catch annidati, non so perché, mettine uno solo e metti il rollback dopo il msgbox dell'errore.
faqmmi sapere

Riccardo D'Aria

Mau67 Profilo | Expert

Allora ho modificato la transazione e funziona però perchè alla fine della transazione non mi rastituisce l'avviso di conclusione della transazione?
posto il codice grazie
Private Sub copia()
Connection.Open()
Dim myCommand As MySqlCommand = Connection.CreateCommand()
Dim myTrans As MySqlTransaction

' Start a local transaction
myTrans = Connection.BeginTransaction()
' Must assign both transaction object and connection
' to Command object for a pending local transaction
myCommand.Connection = Connection
myCommand.Transaction = myTrans
Dim id As ListViewItem
Dim idCollection As ListView.CheckedListViewItemCollection = Me.ListView2.CheckedItems
For Each id In idCollection
If id.Checked = True Then
Try
myCommand.CommandText = "INSERT INTO cartella_sanitaria (CodiceFiscale, PartitaIva, Visita, Data_Visita)" & _
"SELECT CodiceFiscale, PartitaIva, Visita, '" & ConvertData.GetDataForMySql(DateTimePicker1.Value) & "' FROM cartella_sanitaria WHERE ID = " & id.SubItems(4).Text & ""
myCommand.ExecuteNonQuery()

Dim cmd As New MySql.Data.MySqlClient.MySqlCommand("SELECT LAST_INSERT_ID()", Connection)
'aggiornamento della tabella locale
Dim lastId As Integer = CType(cmd.ExecuteScalar, Integer)
_IDP = (lastId)

myCommand.CommandText = "INSERT INTO fattori_rischio_cartella_sanitaria (ID_Cartella, Rumore, Rumore_Valori)" & _
"SELECT " & _IDP & ", Rumore, Rumore_Valori FROM fattori_rischio_cartella_sanitaria WHERE ID_Cartella = " & id.SubItems(4).Text & ""
myCommand.ExecuteNonQuery()
myTrans.Commit()
Console.WriteLine("Tutti le cartelle sono state preparate correttamente.")
myTrans.Rollback()
Catch ex As Exception

Console.WriteLine("Un'eccezione di tipo " & ex.GetType().ToString() & _
"È stato rilevato durante l'inserimento dei dati.")
End Try
End If
Next
End Sub
Mau67

ridaria Profilo | Expert

>Allora ho modificato la transazione e funziona però perchè alla
>fine della transazione non mi rastituisce l'avviso di conclusione
>della transazione?
>posto il codice grazie
> Private Sub copia()
> Connection.Open()
>Dim myCommand As MySqlCommand = Connection.CreateCommand()
> Dim myTrans As MySqlTransaction
>
> ' Start a local transaction
> myTrans = Connection.BeginTransaction()
> ' Must assign both transaction object and connection
> ' to Command object for a pending local transaction
> myCommand.Connection = Connection
> myCommand.Transaction = myTrans
> Dim id As ListViewItem
>Dim idCollection As ListView.CheckedListViewItemCollection =
>Me.ListView2.CheckedItems
> For Each id In idCollection
> If id.Checked = True Then
> Try
>myCommand.CommandText = "INSERT INTO cartella_sanitaria (CodiceFiscale,
>PartitaIva, Visita, Data_Visita)" & _
>"SELECT CodiceFiscale, PartitaIva, Visita, '" & ConvertData.GetDataForMySql(DateTimePicker1.Value)
>& "' FROM cartella_sanitaria WHERE ID = " & id.SubItems(4).Text
>& ""
> myCommand.ExecuteNonQuery()
>
>Dim cmd As New MySql.Data.MySqlClient.MySqlCommand("SELECT LAST_INSERT_ID()",
>Connection)
> 'aggiornamento della tabella locale
>Dim lastId As Integer = CType(cmd.ExecuteScalar, Integer)
> _IDP = (lastId)
>
>myCommand.CommandText = "INSERT INTO fattori_rischio_cartella_sanitaria
>(ID_Cartella, Rumore, Rumore_Valori)" & _
>"SELECT " & _IDP & ", Rumore, Rumore_Valori FROM fattori_rischio_cartella_sanitaria
>WHERE ID_Cartella = " & id.SubItems(4).Text & ""
> myCommand.ExecuteNonQuery()
> myTrans.Commit()
>Console.WriteLine("Tutti le cartelle sono state preparate correttamente.")
> myTrans.Rollback()
> Catch ex As Exception
>
>Console.WriteLine("Un'eccezione di tipo " & ex.GetType().ToString()
>& _
>"È stato rilevato durante l'inserimento dei dati.")
> End Try
> End If
> Next
> End Sub
>Mau67
ma tu stai scrivendo in console, metti un msgbox con il testo che desideri e vedrai.

PS, il rollBAck trans non ha senso dopo il comit.

Lo devi mettere, nel catch dell'errore, se proprio vuoi.

CIAO

Riccardo D'Aria

Mau67 Profilo | Expert

ho fatto come mi hai detto adesso si è presentato questo problema nel commit "Transaction has already been committed or is not pending"

myTrans.Commit()<<<<<<<<"Transaction has already been committed or is not pending"

MsgBox("Tutti le cartelle sono state preparate correttamente.")

Catch ex As MySqlException
myTrans.Rollback()
MsgBox("Un'eccezione di tipo " & ex.GetType().ToString() & _
"È stato rilevato durante l'inserimento dei dati.")

End Try

anche perchè seleziona più record nella listview
non capisco perchè solleva l'eccezzione
Mau67

AntCiar Profilo | Expert

il commit lo devi tirare fuori dal Next altrimenti non serve a niente usare una transazione.
Cristian Barca

Mau67 Profilo | Expert

cristian grazie è perfetto grazie.
Ti chiedo un altro favore, puoi darmi una mano anche qui http://www.dotnethell.it/forum/messages.aspx?ThreadID=42791
grazie
Mau67

ridaria Profilo | Expert

..................

ok prego ...............................
Riccardo D'Aria
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5