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