为何从OleDb连接调用DbProviderFactories.GetFactory返回null,如何获取OleDbDataAdapter?
解决OleDb连接获取DbDataAdapter的问题
你遇到的问题是DbProviderFactories.GetFactory(conn)针对OleDb连接返回null,但直接实例化OleDbDataAdapter或通过提供程序名称获取工厂正常,这是因为OleDb连接对象与工厂的关联逻辑存在特殊情况,无法通过连接实例自动匹配到对应的工厂。
可以通过以下两种方式修改你的方法,兼容OleDb连接:
方式一:通过提供程序名称获取OleDb工厂
在方法中增加对OleDb连接的判断,手动指定提供程序名称获取工厂:
Private Function GetDataAdapter(conn As DbConnection) As DbDataAdapter Dim factory As DbProviderFactory If TypeOf conn Is OleDb.OleDbConnection Then factory = DbProviderFactories.GetFactory("System.Data.OleDb") Else factory = DbProviderFactories.GetFactory(conn) If factory Is Nothing Then Throw New Exception("Unable to identify connection type") End If Return factory.CreateDataAdapter() End Function
方式二:直接实例化OleDbDataAdapter
如果不需要统一通过工厂创建,也可以直接判断连接类型后返回对应的DataAdapter:
Private Function GetDataAdapter(conn As DbConnection) As DbDataAdapter Select Case conn.GetType() Case GetType(OleDb.OleDbConnection) Return New OleDb.OleDbDataAdapter() Case Else Dim factory As DbProviderFactory = DbProviderFactories.GetFactory(conn) If factory Is Nothing Then Throw New Exception("Unable to identify connection type") Return factory.CreateDataAdapter() End Select End Function
这两种方式都能解决OleDb连接的问题,同时保留对Sql、Db2等其他连接类型的原有支持。如果想从根源排查配置问题,可以检查系统machine.config或应用程序配置文件中是否存在System.Data.OleDb的提供程序注册项,但上述代码修改的方式更直接高效。
内容的提问来源于stack exchange,提问作者kumquatwhat
相关产品推荐
相关产品推荐

