Pregunta

Tengo un código que podría ejecutarse utilizando un proveedor que no admite transacciones o no admite transacciones anidadas.

¿Cómo determinaría programáticamente dicho soporte?

P.ej.El siguiente código genera una excepción System.InvalidOperationException en la confirmación final cuando se utiliza MySQL .NET Connector, pero funciona bien para MSSQL.

Me gustaría poder modificar el código para adaptarlo a varios proveedores, sin tener que codificar pruebas según el tipo de proveedor (por ejemplo,no quiero tener que hacer 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();
}
¿Fue útil?

Solución

No existe una forma integrada para que un proveedor de ADO.NET brinde detalles sobre las capacidades que ofrece.SQLite tampoco admitía transacciones anidadas, pero algunos proveedores de ADO.NET para SQLite lo falsificarían en el código (sin el soporte adecuado para puntos de guardado).En ese caso, nunca obtendría errores, pero es posible que no obtenga el comportamiento que esperaba.

También he visto muchas implementaciones diferentes del indexador IDataReader.Solía ​​ser que algunos proveedores lanzaban una excepción cuando se les pasaba un nombre de campo que no existía, y algunos proveedores devolvían un valor nulo.En ADO.NET 2.0, los documentos de ayuda se actualizaron para indicar que los proveedores deben generar una excepción, pero sin excepciones marcadas no hay forma de garantizar que todos los proveedores se hayan actualizado correctamente.

En resumen, el espacio de nombres System.Data.Common y varios proveedores ADO.NET hacen que sea mucho más fácil trabajar con diferentes bases de datos, pero debe tener en cuenta qué bases de datos está utilizando y las diferencias en cada proveedor (la mayoría de las cuales probablemente serán peculiaridades molestas no documentadas en lugar de grandes diferencias).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top