Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Transazioni
venerdì 22 marzo 2013 - 17.37
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
VB.NET
|
.NET 3.5
|
Visual Studio 2008
|
MySQL 5.5
Mau67
Profilo
| Expert
917
messaggi | Data Invio:
ven 22 mar 2013 - 17:37
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
936
messaggi | Data Invio:
ven 22 mar 2013 - 17:41
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
917
messaggi | Data Invio:
ven 22 mar 2013 - 17:47
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
905
messaggi | Data Invio:
ven 22 mar 2013 - 17:53
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
936
messaggi | Data Invio:
ven 22 mar 2013 - 17:54
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
917
messaggi | Data Invio:
ven 22 mar 2013 - 17:58
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
936
messaggi | Data Invio:
ven 22 mar 2013 - 18:01
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
905
messaggi | Data Invio:
ven 22 mar 2013 - 18:02
>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
917
messaggi | Data Invio:
ven 22 mar 2013 - 18:05
lo messo dopo mytrans.Commit()
myTrans.Rollback() qui restituisce l'errore
Mau67
ridaria
Profilo
| Expert
905
messaggi | Data Invio:
ven 22 mar 2013 - 18:15
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
917
messaggi | Data Invio:
ven 22 mar 2013 - 18:24
Quindi devo inserirlo o no il roolback?
Mau67
ridaria
Profilo
| Expert
905
messaggi | Data Invio:
ven 22 mar 2013 - 18:32
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
917
messaggi | Data Invio:
sab 23 mar 2013 - 17:12
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
905
messaggi | Data Invio:
lun 25 mar 2013 - 09:21
>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
917
messaggi | Data Invio:
lun 25 mar 2013 - 14:01
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
936
messaggi | Data Invio:
lun 25 mar 2013 - 14:08
il commit lo devi tirare fuori dal Next altrimenti non serve a niente usare una transazione.
Cristian Barca
Mau67
Profilo
| Expert
917
messaggi | Data Invio:
lun 25 mar 2013 - 14:14
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
905
messaggi | Data Invio:
lun 25 mar 2013 - 16:32
..................
ok prego ...............................
Riccardo D'Aria
Torna su
Stanze Forum
Elenco Threads
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 !