1. 程式人生 > >【asp.net之Web Form】編寫抽象工廠資料庫操作類

【asp.net之Web Form】編寫抽象工廠資料庫操作類

理解抽象工廠

在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即可。