Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Classe SqlTransaction

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:

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico