坑:关于 MySqlClientFactory 没实现 CreateDataAdapter() 方法
2018-05-26 11:03
399 查看
情景
在使用数据库通用类 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() 方法
结论
<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; }
参考
通用类 DBHelperC# CreateDataAdapter 创建 DbDataAdapter,以及用DataTable的Load方法获取数据-布布扣-bubuko.com
相关文章推荐
- 关于MYSQL group by 分组按时间取最大值的实现方法
- 关于MYSQL group by 分组按时间取最大值的实现方法!
- 关于MYSQL group by 分组按时间取最大值的实现方法!
- 【android】关于自己实现adapter后gridview中item无法被选中的解决方法
- 关于Page_ClientValidate方法,完美实现验证控件成功后confirm确认效果
- 关于MYSQL group by 分组按时间取最大值的实现方法!
- 关于MYSQL group by 分组按时间取最大值的实现方法
- 关于mysql配置主从同步,个人的见解与实现方法
- 关于在Spring下 使用HQL 语句模糊查询的实现方法
- 关于web中下拉列表的几种实现方法
- MYSQL(解决方法):Client does not support authentication
- MySQL导入导出大量数据的程序实现方法
- 关于MySql安装后出现error:0错误,我的解决方法
- MYSQL出现" Client does not support authentication "的解决方法
- 关于web2.0的Tag标签实现方法
- 关于行列转置的实现方法
- Mysql以utf8存储gbk输出的实现方法提供
- 关于利用Acronis Snap Deploy实现网刻的方法
- 关于远程方法调用(RMI)的实现
- 关于MySQL的1067错误解决方法