【问题标题】:How to determine if IDbConnection supports transactions?如何确定 IDbConnection 是否支持事务?
【发布时间】:2013-10-09 00:41:35
【问题描述】:

我正在尝试使用IDbConnectionIDbCommandIDbDataParameter 类型的泛型使我的类库与尽可能多的数据库系统兼容,但在可能的情况下支持IDbTransaction 的事务绝对是更可取的.但是,IDbConnection 的某些实现不支持事务(想到 MySQL/MyISAM)。

如何确定IDbConnection 的具体实现是否支持事务?

明确一点,我想支持不支持事务的数据库后端,但如果可以使用则默认为事务。

【问题讨论】:

  • 如果你需要一个事务,你的方法签名难道不能简单地要求一个IDbTransaction而不是IDbConnection吗? IDbTransaction 仍然暴露原始的IDbConnection。为什么你需要知道这些信息?您可以提供类似 Execute 方法的重载:stackoverflow.com/a/14102615/251983 - 然后用户可以选择连接或事务。
  • 这是否适用于不支持事务的数据库的IDbConnection 实现?在这种情况下,我希望NotSupportedException
  • 这成为调用者的责任。如果您的 taansactionalized 方法只是一个重载,那么调用者不会在不支持事务的实现上使用它们。 IMO 你不能为你图书馆的消费者做出这个决定,因为你不知道他们将如何使用它。仅供参考,看起来 MySQL 有一个事务实现 devart.com/dotconnect/mysql/docs/… 但完全披露,我从未使用过它。

标签: c# .net database database-connection compatibility


【解决方案1】:

如果您只有IDbConnection,则不能。您应该假设实现支持事务并相应地编写您的库。

【讨论】:

  • 我为什么要假设什么?从一开始,这似乎就是糟糕的设计。
  • @JeremyHolovacs 您应该能够假设这一点,因为如果有人让您访问他们的具体实现,除非他们在笑,否则它将完成并测试供您使用。这允许您将 IDbConnection 用作变量类型,该变量类型可以在保持您的自定义连接类型或其他实现之间交换,从而允许您使用完全相同的代码使用不同的连接。
猜你喜欢
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多