我的代码可以使用不支持事务的Provider执行,或者不支持嵌套事务。
我如何以编程方式确定此类支持?
E.g。使用MySQL .NET Connector时,下面的代码在最终提交时抛出System.InvalidOperationException,但对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();
}
答案 0 :(得分:1)
ADO.NET提供程序没有内置的方法来提供有关它们提供的功能的详细信息。 SQLite过去也不支持嵌套事务,但SQLite的一些ADO.NET提供程序会在代码中伪造它(没有对保存点的适当支持)。在这种情况下,你永远不会得到错误,但你可能得不到你期望的行为。
我也看到了IDataReader索引器的许多不同实现。过去,某些提供程序在传递不存在的字段名时会抛出异常,而某些提供程序将返回null。在ADO.NET 2.0中,帮助文档已更新,以指示提供程序应抛出异常,但如果没有经过检查的异常,则无法确保所有提供程序都已正确更新。
因此,简而言之,System.Data.Common命名空间和各种ADO.NET提供程序使得使用不同的数据库变得更加容易,但您必须了解您正在使用的数据库和每个提供者的差异(大多数可能是无证的烦人怪癖而不是大的差异)。