【asp.net之Web Form】编写抽象工厂数据库操作类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhulinzhulinlin/article/details/79596149
理解抽象工厂

在ADO.NET对SqlServer,Mysql等的操作步骤类似,不同的是:
SqlServer的操作使用的是SqlConnection、SqlCommand,SqlDataAdapter;
MySql使用的是MySqlConnection、MySqlCommand、MySqlDataAdapter;而这些对不同数据库的操作类连接类都是继承自DbConnection、DbCommand、DbDataAdapter。则引入了抽象工厂的设计模式.
其目的在于只需修改配置文件中的字符串,就可以实现对不同DBMS中数据库操作。

MyDbHelper类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.Common;
using System.Configuration;

namespace 连接数据库
{
    public class MyDbHelper
    {

        /// <summary>
        /// 获取配置文件中连接字符串以及连接的是那类数据库信息
        /// </summary>
        private static string dbProviderName = ConfigurationManager.AppSettings["DbHelperProvider"].ToString();
        private static string dbConnectionString = ConfigurationManager.AppSettings["DbHelperConnectionString"].ToString();

        private DbConnection connection;
        /// <summary>
        /// 无参初始化函数
        /// </summary>
        public MyDbHelper()
        {
            connection = CreateConnection();
        }

        public static DbConnection CreateConnection()
        {
            DbProviderFactory dbFactory = DbProviderFactories.GetFactory(dbProviderName);
            DbConnection dbcon = dbFactory.CreateConnection();
            dbcon.ConnectionString = dbConnectionString;
            return dbcon;
        }
        /// <summary>
        /// 有参初始化函数
        /// </summary>
        /// <param name="constr"></param>
        public MyDbHelper(string constr)
        {
            connection = CreateConnection(dbConnectionString);
        }

        public static DbConnection CreateConnection(string conStr)
        {
            DbProviderFactory dbFactory = DbProviderFactories.GetFactory(dbProviderName);
            DbConnection dbcon = dbFactory.CreateConnection();
            dbcon.ConnectionString = conStr;
            return dbcon;
        }

        public DbCommand GetCommand(string sql)
        {
            DbCommand dbCommand = connection.CreateCommand();
            dbCommand.CommandText = sql;
            dbCommand.CommandType = CommandType.Text;

            return dbCommand;
        }

        /// <summary>
        /// 执行非查询语句
        /// </summary>
        /// <param name="command">返回受影响的行数</param>
        /// <returns></returns>
        public int ExecuteNonQuery(DbCommand command)
        {
            command.Connection.Open();
            int ret = command.ExecuteNonQuery();
            command.Connection.Close();
            return ret;
        }
        /// <summary>
        /// 执行查询命令返回datatable
        /// </summary>
        /// <param name="command"></param>
        /// <returns></returns>
        public DataTable ExecuteDataTable(DbCommand command)
        {
            DbProviderFactory dbFactory = DbProviderFactories.GetFactory(dbProviderName);

            DbDataAdapter dbDataAdapter = dbFactory.CreateDataAdapter();


            dbDataAdapter.SelectCommand = command;

            DataTable dt = new DataTable();
            dbDataAdapter.Fill(dt);

            return dt;
        }
    }
}

该类许多操作并没有写,在以后学习ADO.net的阶段会慢慢完善,到时候会上传一份完整的数据库操作类。

配置参数
  <appSettings>
    <add key="DbHelperProvider" value="MySql.Data.MySqlClient" />
    <add key="DbHelperConnectionString" value="server =localhost;port=3306;user id=root;password=123456;database=student" />
  </appSettings>
前端

前端部分只是简单设置了一个GridView显示从数据库的查询结果。

后台
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace 连接数据库
{
    public partial class Login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MyDbHelper db = new MyDbHelper();
            string s = "select *from login";
           // string s = "delete from login where idLogin=2";
            DbCommand cmd = db.GetCommand(s);
            //db.ExecuteNonQuery(cmd);
            DataTable dt = db.ExecuteDataTable(cmd);
            GridView1.DataSource = dt;
            GridView1.DataBind();

        }
    }
}
问题

经过新建项目,添加编写MyDbHelper类,配置参数等,然后添加引用MySql.data.dll,(在mySql的安装目录下:xxxx\MySQL\ConnectorNET6.10\Assemblies\v4.5.2可找到),添加后报错:
这里写图片描述
(上面是我为了方便检查错误而把数据库帮助类测试在C#控制台项目中。)


经调试发现问题在于某对象为空,所以导致后面引用对象出错,为空的原因怀疑是底层createDataAdapter方法并未实现.即引用MySQL.data.dll出错,但是对于createCommand和createConnection没有出错。
1.我将该项目的.net框架修改为4.5.2来匹配该引用项(我MYSQL安装的是5.7是6.10版本MySQl.data.dll对应的.net框架是4.5.2),依旧出现该错误。
2.下载并引用了6.8版本的MySQl.data.dll依旧出现错误
3.在NuGet包管理器中添加6.9.11MySQl.data.dll版本之后错误消失
这里写图片描述
注意不要安装最新稳定版本依旧报上述引用错误。

效果图

这里写图片描述

总结

对于出现的问题花了很长时间,不过虽然问题解决了,但是问题的原因所代表的具体含义不清晰,大体来说,对于.net 4.0通过Nuget选择6.9.11版本的MySQl.data.dll即可。

展开阅读全文

没有更多推荐了,返回首页