Domanda

Ho codice che potrebbe essere eseguito utilizzando un provider che non supporta transazioni, o non supporta le transazioni nidificate.

Come faccio a livello di programmazione determinare tale sostegno?

es. Il codice sotto getta uno System.InvalidOperationException sul finale commettere quando si utilizza il connettore di MySQL .NET, ma funziona bene per MSSQL.

Mi piacerebbe essere in grado di modificare il codice per ospitare i vari fornitori, senza dover codificare i test in base al tipo di fornitore (ad esempio, io non voglio avere a che fare 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();
}
È stato utile?

Soluzione

Non c'è modo integrato per un provider ADO.NET per dare dettagli su ciò che essi forniscono funzionalità. SQLite utilizzato per non supportare le transazioni nidificate sia, ma alcuni provider ADO.NET per SQLite sarebbe falso nel codice (senza un adeguato supporto per i punti di salvataggio). In quel caso, si sarebbe mai ottenere gli errori, ma si potrebbe non ottenere il comportamento che vi aspettavate.

Ho anche visto molte implementazioni diverse del indicizzatore IDataReader. Ha usato essere che alcuni fornitori sarebbero un'eccezione quando viene passato un nome di campo che non esisteva, e alcuni provider sarebbe restituire null. In ADO.NET 2.0 della Guida documenti sono stati aggiornati per indicare che i fornitori dovrebbero un'eccezione, ma senza eccezioni controllate non c'è modo per garantire che tutti i fornitori sono stati aggiornati correttamente.

Così, in breve, Lo spazio dei nomi System.Data.Common e vari provider ADO.NET rendere molto più facile lavorare con i database diversi, ma bisogna essere consapevoli di ciò DB (s) che si sta utilizzando e le differenze di ogni fornitore (la maggior parte dei quali saranno probabilmente privi di documenti stranezze fastidiosi al contrario di grandi differenze).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top