.NET数据提供程序-如何确定它们可以做什么?
我有一些代码可以使用不支持事务或不支持嵌套事务的提供程序执行 如何以编程方式确定此类支持 例如,当使用MySQL.NET连接器时,下面的代码在最终提交时抛出System.InvalidoOperationException,但对于MSSQL来说效果很好 我希望能够修改代码以适应不同的提供者,而不必根据提供者的类型进行硬编码测试(例如,如果(typeof(connection)=“某个提供者名称”),我不想做.NET数据提供程序-如何确定它们可以做什么?,.net,transactions,dataprovider,nested-transactions,.net,Transactions,Dataprovider,Nested Transactions,我有一些代码可以使用不支持事务或不支持嵌套事务的提供程序执行 如何以编程方式确定此类支持 例如,当使用MySQL.NET连接器时,下面的代码在最终提交时抛出System.InvalidoOperationException,但对于MSSQL来说效果很好 我希望能够修改代码以适应不同的提供者,而不必根据提供者的类型进行硬编码测试(例如,如果(typeof(connection)=“某个提供者名称”),我不想做) ADO.NET提供程序没有内置的方式来详细说明它们提供的功能。SQLite过去也不支持
)
ADO.NET提供程序没有内置的方式来详细说明它们提供的功能。SQLite过去也不支持嵌套事务,但SQLite的一些ADO.NET提供程序会在代码中伪造它(没有适当的保存点支持)。在这种情况下,您永远不会出现错误,但您可能不会获得预期的行为
我还看到了IDataReader索引器的许多不同实现。过去,一些提供程序在传递不存在的字段名时会抛出异常,而一些提供程序会返回null。在ADO.NET 2.0中,帮助文档已更新,以指示提供程序应引发异常,但如果没有已检查的异常,则无法确保所有提供程序都已正确更新
因此,简言之,System.Data.Common命名空间和各种ADO.NET提供程序使使用不同的数据库变得更加容易,但您必须了解您使用的数据库以及每个提供程序中的差异(其中大多数可能是未记录的恼人的怪癖,而不是很大的差异).ADO.NET提供程序没有内置的方法来详细说明它们提供的功能。SQLite过去也不支持嵌套事务,但SQLite的一些ADO.NET提供程序会在代码中伪造它(没有适当的保存点支持)。在这种情况下,您永远不会出现错误,但您可能不会获得预期的行为
我还看到了IDataReader索引器的许多不同实现。过去,一些提供程序在传递不存在的字段名时会抛出异常,而一些提供程序会返回null。在ADO.NET 2.0中,帮助文档已更新,以指示提供程序应引发异常,但如果没有已检查的异常,则无法确保所有提供程序都已正确更新
因此,简言之,System.Data.Common命名空间和各种ADO.NET提供程序使使用不同的数据库变得更加容易,但您必须了解您使用的数据库以及每个提供程序中的差异(其中大多数可能是未记录的恼人的怪癖,而不是很大的差异).我想这就是为什么像NHibernate这样的应用程序需要输入使用哪个数据提供者的原因。我想这就是为什么像NHibernate这样的应用程序需要输入使用哪个数据提供者的原因。
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();
}