非Azure

时间:2017-07-30 06:05:20

标签: c# sql-server enterprise-library

我有使用ADO.NET与SQL Server数据库交互的软件。我想使用DbProviderFactories让工厂获得连接,而不是与数据库耦合。

ConnectionStringSettings connectionStringEntry = ConfigurationManager.ConnectionStrings["Default"];
string providerName = connectionStringEntry.ProviderName;
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = connectionStringEntry.ConnectionString;

依旧......

我的SQL Server是远程的,与数据中心的VPN连接不稳定。它不是Azure服务器。我确实遇到了短暂的故障。我想使用EnterpriseLibrary.TransientFaultHandling来帮助管理瞬态故障。我没有成功找到一个DbProviderFactory,我可以把它放在我的.config中的system.data/DbProviderFactories中。

我尝试了ReliableDbProvider NuGet。安装软件包之后,我按照示例在工厂中添加ReliableDbProvider.SqlAzure提供程序,然后更改我的连接字符串以使用它。

<system.data>
  <DbProviderFactories>
    <add name="Reliable Provider"
         invariant="ReliableDbProvider.SqlAzure"
         description="Reliable DB Provider for SQL Server"
         type="ReliableDbProvider.SqlAzure.SqlAzureProvider, ReliableDbProvider"/>
    <add name="Sql Azure Reliable Provider With Timeout Retries"
         invariant="ReliableDbProvider.SqlAzureWithTimeoutRetries"
         description="Reliable Db Provider for SQL Azure with Timeout Retries"
         type="ReliableDbProvider.SqlAzureWithTimeoutRetries.SqlAzureProvider, ReliableDbProvider" />
  </DbProviderFactories>
</system.data>

我希望我可以假设“&#34; Azure&#34;在驱动程序名称中并不意味着它特定于Azure,但适用于任何SQL Server连接。我不相信我能做出这样的假设。当我使用providerName =&#39; ReliableDbProvider.SqlAzure&#39;在连接字符串中,我得到一个立即信号量超时异常。当我恢复到providerName =&#39; System.Data.SqlClient&#39;系统按预期运行,直到我得到一个瞬态传输异常。我是否遗漏了一些简单的东西,允许我使用ReliableDbProvider,或者我是否必须实现更复杂的东西以处理瞬态故障并仍然使用DbProviderFactories?

1 个答案:

答案 0 :(得分:0)

我让这太复杂了。我阅读了Entlib6手册。该库提供了ReliableSqlConnection类。我可以在任何需要IDbConnection的地方使用Connection成员。我可以将ReliableSqlConnection.Connection绑定到我的依赖注入容器中的IDbConnection。我真的不需要ReliableDbProvider来帮助。