Frage

Ich habe Code, der mit einem Provider ausgeführt werden kann, dass keine Transaktionen unterstützt oder nicht unterstützt verschachtelte Transaktionen.

Wie würde ich programmatisch eine solche Unterstützung bestimmen?

z. Der Code unten wirft einen System.InvalidOperationException am letzten begehen, wenn die MySQL .NET Connector verwenden, aber funktioniert gut für MSSQL.

Ich möchte in der Lage sein, den Code zu ändern, verschiedene Anbieter gerecht zu werden, ohne Tests nach Art des Anbieters basierten hart codieren (z Ich will nicht zu tun if(typeof(connection) == "some provider name") haben)

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();
}
War es hilfreich?

Lösung

Es gibt keine integrierte Möglichkeit für einen ADO.NET-Provider zu geben Details über das, was Fähigkeiten, die sie zur Verfügung stellen. SQLite verwendet keine verschachtelten Transaktionen entweder zu unterstützen, aber einige ADO.NET-Provider für SQLite würde fälschen es im Code (ohne geeignete Unterstützung für Sicherungspunkte). In diesem Fall würden Sie nie Fehler, aber man kann nicht das Verhalten erhalten Sie erwartet.

Ich habe auch viele verschiedene Implementierungen des IDataReader Indexer gesehen. Früher war es so, dass einige Anbieter würde eine Ausnahme auslösen, wenn Sie einen Feldnamen übergeben, die nicht existierten, und einige Anbieter würden null zurück. In ADO.NET 2.0 wurden die Hilfe docs, um anzuzeigen, aktualisiert, dass die Anbieter eine Ausnahme auslösen sollte, aber ohne geprüfte Ausnahmen gibt es keine Möglichkeit, um sicherzustellen, dass alle Anbieter ordnungsgemäß aktualisiert wurden.

kurz gesagt also, The System.Data.Common Namespace und verschiedene ADO.NET-Provider machen es viel einfacher mit verschiedenen Datenbanken zu arbeiten, aber Sie werden müssen wissen, was DB (n) Sie verwenden und die Unterschiede in den einzelnen Anbieter (von denen die meisten wahrscheinlich lästige Macken nicht dokumentiert werden, wie zu große Unterschiede gegenüber).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top