Question

J'ai le code qui pourrait être exécuté à l'aide d'un fournisseur qui ne supporte pas les transactions, ou ne prend pas en charge les transactions imbriquées.

Comment puis-je déterminer par un programme tel soutien?

par exemple. Le code ci-dessous jette un System.InvalidOperationException sur la validation finale lors de l'utilisation du connecteur .NET MySQL, mais fonctionne très bien pour MSSQL.

Je voudrais être en mesure de modifier le code pour accueillir divers fournisseurs, sans avoir à coder des tests basés sur le type de fournisseur (par exemple, je ne veux pas avoir à faire 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();
}
Était-ce utile?

La solution

Il n'y a pas moyen intégré pour un fournisseur ADO.NET pour donner des détails sur ce que les capacités qu'ils fournissent. SQLite utilisé pour ne pas soutenir les transactions imbriquées non plus, mais certains fournisseurs ADO.NET pour SQLite serait faux dans le code (sans le soutien approprié pour savepoints). Dans ce cas, vous n'obtenez des erreurs, mais vous ne pouvez pas obtenir le comportement que vous attendiez.

Je l'ai aussi vu beaucoup de différentes implémentations de l'indexeur de IDataReader. Auparavant, que certains fournisseurs jetteraient une exception lorsqu'il est passé un nom de champ qui n'existait pas, et certains fournisseurs retournerait nulle. Dans ADO.NET 2.0 les documents d'aide ont été mis à jour pour indiquer que les fournisseurs devraient jeter une exception, mais sans exceptions vérifiées il n'y a aucun moyen de faire en sorte que tous les fournisseurs ont été correctement mis à jour.

Donc, en bref, l'espace de noms System.Data.Common et divers fournisseurs ADO.NET rendre beaucoup plus facile de travailler avec différentes bases de données, mais vous ne devez être au courant de ce que DB (s) que vous utilisez et les différences de chaque fournisseur (dont la plupart seront probablement non documentés bizarreries ennuyeux par opposition à de grandes différences).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top