Pergunta

Eu tenho o código que pode ser executado usando um provedor que não suporta transações, ou não suporta transações aninhadas.

Como eu programaticamente determinar esse apoio?

por exemplo. O código a seguir lança uma System.InvalidOperationException em cometer o final quando utiliza o .NET Connector MySQL, mas funciona bem para MSSQL.

Eu gostaria de ser capaz de alterar o código para acomodar vários fornecedores, sem a necessidade de testes de codificar com base no tipo de fornecedor (por exemplo, eu não quero ter que fazer if(typeof(connection) == "some provider name"))

using (IDbConnection connection = Use.Connection(ConnectionStringName))
using (IDbTransaction transaction = connection.BeginTransaction())
{
  using (currentCommand = connection.CreateCommand())
  {
    using (IDbCommand cmd = connection.CreateCommand())
    {
      currentCommand = cmd;
      currentCommand.Transaction = transaction;
      currentCommand.ExecuteNonQuery();
    }

    if (PipelineExecuter.HasErrors)
    {
      transaction.Rollback();
    }
    else
    {
      transaction.Commit();
    }
  }

  transaction.Commit();
}
Foi útil?

Solução

Não há built-in maneira para um provedor ADO.NET a dar detalhes sobre o que as capacidades que eles fornecem. SQLite usado para não suporta transações aninhadas também, mas alguns provedores de ADO.NET para SQLite Would falso-lo no código (sem suporte adequado para pontos de salvamento). Nesse caso, você nunca obter erros, mas você não pode ter o comportamento que você espera.

Eu também tenho visto muitas implementações diferentes do indexador IDataReader. Ela costumava ser que alguns provedores iria lançar uma exceção quando passado um nome de campo que não existia, e alguns provedores retornaria nulo. Em ADO.NET 2.0 a documentação de ajuda foram atualizados para indicar que os prestadores deve lançar uma exceção, mas sem exceções verificadas não há nenhuma maneira de garantir que todos os fornecedores foram devidamente atualizado.

Então, em suma, o namespace System.Data.Common e vários provedores de ADO.NET torná-lo muito mais fácil trabalhar com bancos de dados diferentes, mas você tem que estar ciente do que DB (s) que você está usando e as diferenças de cada provedor (a maioria dos quais provavelmente será indocumentados peculiaridades irritantes em oposição a grandes diferenças).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top