Por Patton Tony, Builder.com
Patton Tony começou sua carreira profissional como um colaborador de aplicação que ganha Java, VB, Lotus, e certificações de XML para bolster seu conhecimento.
ADO.NET fornece tudo que você necessita trabalhar com dados back-end, que podem ser tão simples quanto ler dados de uma tabela. Uma transação permite que você agrupe operações da base de dados para assegurar-se de que todas as operações sejam executadas porque, se uma operação falhar, a transação inteira falha. Vamos utilizar transações dentro da estrutura de .NET.
Vista geral da transação
Uma transação é um grupo de operações combinadas em uma unidade lógica do trabalho. Desenvolvedore utilizam as transações para manter o controle e a consistência obtendo a integridade de cada ação em uma transação, apesar dos erros que podem ocorrer no sistema.
Todas as operações na transação são executadas, ou nenhuma.
A operação bancária é o exemplo padrão. Uma transação abrangeria transferência do dinheiro de um cliente a outro. Transferência é uma transação porque o débito do dinheiro de uns cliente e crédito a outro deve ser executado como uma unidade--uma porção não pode falhar.
Transações do SQL
O SQL permite que um colaborador trabalhe com transações usando duas indicações simples:
Begin Transaction
Commit Transaction
Tudo que está entre estas duas indicações compõe a transação. O comando de começo transação [Begin Transaction], assim cada comando que segue não executa até emitir o comando de dim de transação [Commit Transaction]. No ADO.NET é igualmente simples.
Transações de ADO.NET
Uma transação requer uma conexão da base de dados e um objeto de transação. Utilizar transações do SQL e ADO.NET é com a classe de SqlTransaction. Este nome da classe varia depender em cima da plataforma da base de dados utilizada. Por exemplo, a classe da transação para bases de dados de OLEDB é OleDbTransaction.
O namespace de System.Data.SqlClient contem a classe de SqlTransaction. Há duas propriedades na classe:
Connection: Indica o objeto de SqlConnection associado com a transação.
IsolationLevel: Especifica IsolationLevel da transação.
A propriedade de IsolationLevel é um objeto da enumeração com os seguintes membros:
Caos: As mudanças pendentes das transações altamente isoladas não podem sobrescrever.
ReadCommitted: Apenas dados com transação finalizada são lidos para evitar uma "leitura suja", mas os dados podem ser mudados antes do fim da transação.
ReadUncommitted: Um "dado sujo" [é possível ler], significando que nenhum fechamento compartilhado está emitido e nenhum fechamento exclusivo está honrado.
RepeatableRead: Os fechamentos são colocados em todos os dados que são usados em uma pergunta, impedindo que outros usuários atualizem os dados. Isto impede nonrepeatable, embora as fileiras phantom ainda são possíveis.
Serialisable: Um fechamento da escala está colocado na série de dados, impedindo que outros usuários atualizem ou introduzam fileiras na série de dados até que a transação esteja completa.
O IsolationLevel permite um nível de travar registro, mas este conceito é além do espaço deste artigo. O objeto de SqlTransaction fornece métodos também. Você pode usar os seguintes métodos trabalhar com a transação:
Commit: A transação do banco é finalizada.
Rollback: Retorna a transação.
Save: Cria um savepoint e a transação pode retornar até esse local especificando esse nome.
The following C# example puts all the pieces together:
using System; using System.Data; using System.Data.SqlClient; namespace BuilderExamples { class BuilderTransactionExample { static void Main(string[] args) { SqlTransaction trans = null; SqlConnection conn = null; SqlCommand comm = null; try { conn = new SqlConnection("server=(local);Initial Catalog=Northwind;UID=ctester;PWD=password"); conn.Open(); comm = conn.CreateCommand(); trans = conn.BeginTransaction ("BuilderTransaction"); comm.Connection = conn; comm.Transaction = trans; comm.CommandText = "Insert into Territories (TerritoryID, TerritoryDescription, RegionID) VALUES (99001, 'Louisville', 4)"; comm.ExecuteNonQuery(); comm.CommandText = "Insert into Territories (TerritoryID, TerritoryDescription, RegionID) VALUES (99002, 'Lexington', 4)"; comm.ExecuteNonQuery(); trans.Commit(); } catch(Exception e) { try { if (trans != null) { trans.Rollback("BuilderTransaction"); } } catch (SqlException ex) { if (trans.Connection != null) { Console.WriteLine("Exception" + ex.GetType() + " encountered while rolling back transaction."); } } Console.WriteLine("Exception " + e.GetType() + " encountered while inserting data."); } finally { if (conn != null) { conn.Close(); } } } } }
sta aplicação simples e tenta incluir dois registros em uma tabela na base de dados de Northwind seguindo estas etapas:
1. Chamar o método de BeginTransaction do objeto da conexão para marcar o começo da transação. O método de BeginTransaction retorna uma referência à transação. Esta referência é atribuída aos objetos do comando que são alistados na transação.
2. Atribuir o objeto da transação à propriedade da transação do comando ser executado. Se um comando estiver executado em uma conexão com uma transação ativa, e o objeto da transação não estiver atribuído à propriedade da transação do comando, uma exceção está jogada.
3. Executar os comandos requeridos.
4. Chamar o método cometer do objeto da transação para terminar a transação, ou chamar o método do Rollback para cancelar a transação.
VB.NET
Imports System.Data Imports System.Data.SqlClient Module Module1 Sub Main() Dim trans As SqlTransaction Dim conn As SqlConnection Dim comm As SqlCommand Try conn = New SqlConnection("server=(local);Initial Catalog=Northwind;UID=ctester;PWD=password") conn.Open() comm = conn.CreateCommand() trans = conn.BeginTransaction ("BuilderTransaction") comm.Connection = conn comm.Transaction = trans comm.CommandText = "Insert into Territories (TerritoryID, TerritoryDescription, RegionID) VALUES (99003, 'Louisville', 4)" comm.ExecuteNonQuery() comm.CommandText = "Insert into Territories (TerritoryID, TerritoryDescription, RegionID) VALUES (99004, 'Lexington', 4)" comm.ExecuteNonQuery() trans.Commit() Catch e As Exception Try If Not (trans Is Nothing) Then trans.Rollback("BuilderTransaction") End If Catch ex As SqlException Console.WriteLine("Exception" + ex.GetType ().ToString() + " encountered while rolling back transaction.") End Try Console.WriteLine("Exception " + e.GetType ().ToString() + " encountered while inserting data.") Finally If Not (conn Is Nothing) Then conn.Close() End If End Try End Sub End Module
Transação completa
Embora este é um exemplo simples, demonstra como fácil é utilizar transações em sua aplicação de .NET. Utilizar, transações é necessário quando os comandos agrupados são relacionados
Original em :
http://www.builderau...39130225,00.htm
Informações adcionais
Esse erro ocorre quando o comandoExecute requires the command to have a transaction object when the
connection assigned to the command is in a pending local transaction
the transaction property of the command has not been initialilzed
comm.Transaction = transestá faltando.