Estou transferindo um conjunto de procedimentos armazenados T-SQL para C#/CLR. No T-SQL, usamos XACT_STATE() para determinar se um erro requer a reversão para um ponto de salvamento ou a reversão total da transação.
Não consigo encontrar uma verificação equivalente da transação usando os objetos System.Data.SqlClient.SqlTransaction
ou .System.Transactions.TransactionScope
Alguém sabe como verificar o estado da transação em C#/CLR?
XACT_STATE()
não é algo queSqlClient
tenha uma visão especial, muito parecido com o nível de transação . Então, basta consultá-lo comSqlCommand
.Sim você pode. No entanto, isso depende das partes internas do assembly System.Data.SqlClient e, portanto, eu não o recomendaria. Se for realmente necessário, eu reavaliaria se o CLR é realmente a maneira correta de fazer o que você está tentando fazer.
O SqlTransaction é, na verdade, apenas uma classe wrapper em torno da classe SqlInternalTransaction . A classe SqlInternalTransaction já rastreia o estado da transação para você (se não o fizesse, como o SqlClient saberia se deveria reverter ou não?)
Você precisará usar a reflexão para obter a instância do SqlInternalTransaction , o que, novamente, eu não recomendaria fazer em um procedimento CLR, pois isso pode ser muito caro em termos de desempenho - especialmente se for chamado várias vezes.
Dito isto, aqui está como você faz isso.