Esta classe, SqlTransaction(), não é uma novidade das últimas versões da plataforma .NET, mas mesmo assim, não é usada por muitos programadores, sendo ela tão útil para comandos T-SQL dependentes.
Numa perspectiva geral, é criado um objecto SqlTransaction() chamando o método BeginTransaction() da classe SqlConnection(). A partir daqui, todas as operações são efectuadas na SqlTransaction() e, chamando o método Commit(), irá tentar executar todas as operações na base de dados SQL. Caso não consiga, pode-se então chamar o método Rollback() que irá tentar anular todas as alterações planeadas.
Imaginemos que queremos inserir os dados de um formulário em tabelas diferentes, ou seja, alguns dados vão para uma tabela e outros dados para outra(s) tabela(s). Estes dados têm de estar relacionados(ID) caso contrário não existe correspondência entre eles. O facto de não se conseguir escrever em qualquer uma das tabelas, pode assim comprometer a integridade dos dados.
Fica aqui um pequeno exemplo de como podemos evitar este problema:
Dim connString As String = "connection string de ligação ao SQL"
Dim transaction As SqlClient.SqlTransaction = Nothing
' Ligação à base de dados
Using conn As New SqlClient.SqlConnection(connString)
conn.Open()
Try
' Define o comando e a transacção
Using command As SqlClient.SqlCommand = conn.CreateCommand()
transaction = conn.BeginTransaction
' Faz diversas operações em diferentes tabelas, usando
' comandos T-SQL(UPDATE e INSERT), StoredProcedures, etc
With command
' Define a ligação e transacção para o SqlCommand
.Connection = conn
.Transaction = transaction
' ---------------------------------------------------------
' Actualiza a 1ª tabela (Tabela 1)
' ---------------------------------------------------------
.CommandType = CommandType.Text
.CommandText = "UPDATE tabela1 SET anulado=1 WHERE id=@id;"
.Parameters.Add("@id", SqlDbType.Int).Value = 123
.ExecuteNonQuery()
.Parameters.Clear()
' ---------------------------------------------------------
' Insere a 2ª tabela (Tabela 2) neste caso através
' de um StoredProcedure e o método ExecuteScalar()
' ---------------------------------------------------------
.CommandType = CommandType.StoredProcedure
.CommandText = "sp_tabela2"
.Parameters.Add("@a", SqlDbType.VarChar).Value = "abc"
.Parameters.Add("@b", SqlDbType.VarChar).Value = "def"
Dim lastID As Integer = Integer.Parse(.ExecuteScalar())
.Parameters.Clear()
' ---------------------------------------------------------
' Insere na 3ª tabela (Tabela 3) usando o resultado anterior
' ---------------------------------------------------------
.CommandType = CommandType.Text
.CommandText = "INSERT INTO tabela3 (ID) VALUES (@ID)"
.Parameters.Add("@ID", SqlDbType.Int).Value = lastID
.ExecuteNonQuery()
End With
' Tenta gravar as actualizações na base de dados
transaction.Commit()
MessageBox.Show("Actualização efectuada com sucesso!")
End Using
Catch ex As Exception
Try
' Caso ocorra um erro tenta fazer o Rollback() ou
' seja, cancelar as modificações que estão pendentes
transaction.Rollback()
Exit Try
Catch ex2 As Exception
MessageBox.Show(ex2.Message)
End Try
' Informação geral do erro, mas com as modificações já canceladas
MessageBox.Show(ex.Message)
End Try
End Using
transaction.Dispose()
Simples de utilizar, e muito útil, garantido desta forma que todas as transacções são efectuadas, e caso contrário, serão canceladas, não ficando assim, dados sem correspondência.
0 comentários:
Enviar um comentário