Поставщики данных .NET - Как определить, что они могут сделать? - PullRequest
1 голос
/ 07 января 2010

У меня есть код, который может быть выполнен с использованием поставщика, который не поддерживает транзакции или не поддерживает вложенные транзакции.

Как бы я программно определил такую ​​поддержку?

например. Приведенный ниже код генерирует исключение System.InvalidOperationException при окончательной фиксации при использовании MySQL .NET Connector, но отлично работает для MSSQL.

Я бы хотел иметь возможность изменять код для соответствия различным поставщикам без необходимости жесткого тестирования на основе типа поставщика (например, я не хочу делать 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();
}

1 Ответ

1 голос
/ 28 января 2010

Для поставщика ADO.NET нет встроенного способа сообщить подробности о своих возможностях. Ранее SQLite также не поддерживал вложенные транзакции, но некоторые поставщики ADO.NET для SQLite подделывали его в коде (без надлежащей поддержки точек сохранения). В этом случае вы никогда не получите ошибок, но вы можете не получить ожидаемое поведение.

Я также видел много разных реализаций индексатора IDataReader. Раньше некоторые провайдеры генерировали исключение, когда передавали несуществующее имя поля, а некоторые провайдеры возвращали ноль. В ADO.NET 2.0 справочные документы были обновлены, чтобы указать, что поставщики должны выдавать исключение, но без проверенных исключений нет способа гарантировать, что все поставщики были должным образом обновлены.

Итак, вкратце, пространство имен System.Data.Common и различные поставщики ADO.NET значительно упрощают работу с различными базами данных, но вы должны знать, какие БД вы используете, и различия в каждом поставщике (большинство из которых, вероятно, будут недокументированными раздражающими причудами в отличие от больших различий).

...