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 ModuleTransaçã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.










