博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
坑:关于 MySqlClientFactory 没实现 CreateDataAdapter() 方法
阅读量:6343 次
发布时间:2019-06-22

本文共 2222 字,大约阅读时间需要 7 分钟。

hot3.png

情景

在使用数据库通用类 DBHelper 操作 MySql 获取 DataTable 时,DataTable 恒为 null

过程

先看看 DBHelper 获取 DataTable 的代码。

public DataSet ExecuteDataSet(DbCommand cmd){    var dbfactory = DbProviderFactories.GetFactory(DbProviderName);    var dbDataAdapter = dbfactory.CreateDataAdapter();    if (dbDataAdapter == null) return null;    dbDataAdapter.SelectCommand = cmd;    var ds = new DataSet();    dbDataAdapter.Fill(ds);    return ds;}

源码中使用了 Factory.CreateDataAdapter() 获取 DbDataAdapter,再由 DbDataAdapter 将数据填充到 DataTable,并返回 DataTable。

跟踪 DbFactory 和 DbDataAdapter,发现 DbDataAdapter 为 null。

var factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");var da = factory.CreateDataAdapter();var f_mysql = MySqlClientFactory.Instance;var da_mysql = f_mysql.CreateDataAdapter();

额,DbDataAdapter 为 null ?骗人的吧,既然为 null,CreateDataAdapter() 还有啥用?

对比下 CreateDataAdapter() 分别在 Oracle 和 Sqlite 中的情况。

var factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");var da = factory.CreateDataAdapter();var f_mysql = MySqlClientFactory.Instance;var f_mssql = SqlClientFactory.Instance;var f_sqlite = SQLiteFactory.Instance;var f_oracle = OracleClientFactory.Instance;var da_mysql = f_mysql.CreateDataAdapter();var da_mssql = f_mssql.CreateDataAdapter();var da_sqlite = f_sqlite.CreateDataAdapter();var da_oracle = f_oracle.CreateDataAdapter();

输入图片说明

看看反编译代码,唯独MySQLClientFactory没实现 CreateDataAdapter() 方法

唯独MySQLClientFactory没实现

结论

<p style="text-decoration: underline;">MySqlDataAdapter>MySqlDataAdapter 不能由 MySqlClientFactory.CreateDataAdapter() 实例化。</p> 其实只是 config 文件没配置好……

其他

public DataSet ExecuteDataSet(DbCommand cmd){    var dbfactory = DbProviderFactories.GetFactory(DbProviderName);    var dbDataAdapter = dbfactory.CreateDataAdapter();    if (dbDataAdapter == null)    {        if ("MySql.Data.MySqlClient" == DbProviderName)        {            dbDataAdapter = (DbDataAdapter) Assembly.Load("MySql.Data")                .CreateInstance("MySql.Data.MySqlClient.MySqlDataAdapter");        }        else        {            return null;        }    }    if (dbDataAdapter == null)        return null;    dbDataAdapter.SelectCommand = cmd;    var ds = new DataSet();    dbDataAdapter.Fill(ds);    return ds;}

参考

转载于:https://my.oschina.net/u/868789/blog/1819037

你可能感兴趣的文章
about porting
查看>>
MySQL事务及ACID特性
查看>>
Hadoop_31_MapReduce参数优化
查看>>
linux运维常见英文报错中文翻译(菜鸟必知)
查看>>
ceph-pve英语
查看>>
docker英语
查看>>
Windows Server8下补丁分发配置与iSCSI配置
查看>>
二十年后的回眸(4)——离奇的邂逅
查看>>
组策略应用规则示例
查看>>
话里话外:渠道分销拥抱大数据时代来临
查看>>
ADSL的PPPOE拨号客户端上的ppp authentication pap “callin”的正确理解
查看>>
Nagios安装配置手册
查看>>
项目思考:需求讲解可以重复一次
查看>>
大数据思维
查看>>
[Python]模块、包
查看>>
Python3 url解码与参数解析
查看>>
apache配置文件“注解内容”全翻译
查看>>
Android Studio 第七十期 - Android下载图片安装apk 获取权限
查看>>
IIS支持其他类型下载
查看>>
bianma 水平 技巧
查看>>