打造自己的MySQL Utility

開發網站程式,資料庫存取是非常重要的,要能夠快速的完成程式開發,勢必要有方便的工具來輔助才行,
在這裡我們會介紹如何建立一個資料庫工具類別,讓你能夠快速的執行各種查詢.

我們以C#建立類別來並以MySQL為資料庫. 在C#.net要和MySQL連接必須要先安裝MySQL Connector 

首先我們需要引用類別,當你安裝了MySQL Connector後就可以在Visual Studio引用MySql.Data.MySqlClient,
另外我們還引用了System.Configuration類別,這類別可以讓我們抓取在Web.config裡的connectionStrings組態資料,

Web.config的連線字串
<connectionStrings>
   <add name="MyConnectionString" connectionString="Server=localhost;port=3306;DataBase=example;
    uid=example;pwd=example;CharSet=utf8;" />
</connectionStrings>


再來建立建構子,因為我們已經把連線字串建立在Web.config裡, 所以只要讀取
ConfigurationManager.ConnectionsStrings裡的屬性值就可以把連線字串抓出來.
public MySQLUtility(){
    ConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
}

另外我們也使用了多載建構子,有時候你可能多個資料庫有多個資料庫連線字串,使用多載我們就可以
選擇要帶入那一個連線字串.
public MySQLUtility(string ConnConfigName){
    ConnString = ConfigurationManager.ConnectionStrings[ConnConfigName].ConnectionString;
}
 
我們還建立了SQLExecType的列舉型別, ExecScalar是代表取得單個回傳值(如:Select Count(*) From table),
而ExecNonQuery則是用來執行不需要回傳資料列的作業, 如Update、Insert、Delete等.
public enum SQLExecType : int{
    ExecScalar, ExecNonQuery
};

接著建立叫做ExecuteSQL的函式,並帶入SQL查詢字串及選擇SQLExecType, 開始時先檢查資料庫連線是否有建立,若沒有則
呼叫 GetConnection()去建立連線. 在Visual Studio裡SQLExecType會自動跳出讓你選擇, SQLExecType.ExecScalar會
回傳資料, SQLExecType.ExecNonQuery則是執行Update或是Insert之用.
public string ExecuteSQL(string sql, SQLExecType execType){
    string result = null;

    if (conn == null) { conn = GetConnection(); }

    switch (execType)
    {
        case SQLExecType.ExecScalar: result = execScalar(sql, conn); break;
        case SQLExecType.ExecNonQuery: execNonQuery(sql, conn); break;
    }

    return result;
}
 
另外我們也建立一個函式 GetDataReader來擷取資料
public void GetDataReader(string sql, ref MySqlDataReader myReader)
{
    if (conn == null) { conn = GetConnection(); }

    MySqlCommand oCmd = new MySqlCommand(sql, conn);

    try
    {            
        myReader = oCmd.ExecuteReader();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
    finally
    {
        oCmd.Dispose();
    }
}


如何使用
抓單一資料
MySQLUtility mySQL;
string sql = "Select Count(*) From Example";

using(mySQL = new MySQLUtility()){
    int RecordCount = int.Parse(mySQL.ExecuteSQL(sql, MySQLUtility.SQLExecType.ExecScalar));
}

執行Update
MySQLUtility mySQL;
string sql = "Update table Set Count = Count + 1";

using(mySQL = new MySQLUtility()){
     mySQL.ExecuteSQL(sql, MySQLUtility.SQLExecType.ExecNonQuery);
}

使用DataReader取回資料列
using (MySQL = new MySQLUtility())
{
    MySqlDataReader myDR;
    string sql = "Select * From table";
    MySQL.GetDataReader(sql, ref myDR);

    while (myDR.Read())
    {
        //your code here 
    }
    myDR.Close();
}

完整MySQLUtility Class Expand
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web;
using MySql.Data.MySqlClient;
using System.Collections.Generic;

public class MySQLUtilitySample : IDisposable
{
    private MySqlConnection conn;    
    private string ConnString;
    private bool disposed = false;

    public MySQLUtilitySample()
    {
        ConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;    
    }


    public MySQLUtilitySample(string ConnConfigName)
    {
        ConnString = ConfigurationManager.ConnectionStrings[ConnConfigName].ConnectionString;
    }

    public enum SQLExecType : int
    {
        ExecScalar, ExecNonQuery
    };

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                if (conn.State == System.Data.ConnectionState.Open)
                {
                    conn.Close(); 
                    conn.Dispose();                 
                }                
            }

            disposed = true;
        }
    }

    public void Dispose()
    {        
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public MySqlConnection GetConnection()
    {
        MySqlConnection _conn = new MySqlConnection(ConnString);

        try
        {
            _conn.Open();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

        return _conn;
    }

    public string ExecuteSQL(string sql, SQLExecType execType)
    {
        string result = null;

        if (conn == null) { conn = GetConnection(); }

        switch (execType)
        {
            case SQLExecType.ExecScalar: result = execScalar(sql, conn); break;
            case SQLExecType.ExecNonQuery: execNonQuery(sql, conn); break;
        }

        return result;
    }

    protected string execScalar(string sql, MySqlConnection conn)
    {
        string result = null;
        MySqlCommand oCmd = new MySqlCommand();

        try
        {
            oCmd.CommandText = sql;
            oCmd.Connection = conn;
            object Result = oCmd.ExecuteScalar();
            if ((Result != DBNull.Value) && Result != null) result = Result.ToString();
        }
        catch (Exception ee)
        {
            throw new Exception(ee.Message);
        }
        finally
        {
            oCmd.Dispose();
        }

        return result;
    }


    protected string execNonQuery(string sql, MySqlConnection conn)
    {
        string result = null;
        MySqlCommand oCmd = new MySqlCommand();

        try
        {
            oCmd.Connection = conn;
            oCmd.CommandText = sql;
            oCmd.ExecuteNonQuery();
        }
        catch (Exception ee)
        {
            throw new Exception(ee.Message);
        }
        finally
        {
            oCmd.Dispose();
        }

        return result;
    }


    public void GetDataReader(string sql, ref MySqlDataReader myReader)
    {
        if (conn == null) { conn = GetConnection(); }

        MySqlCommand oCmd = new MySqlCommand(sql, conn);

        try
        {            
            myReader = oCmd.ExecuteReader();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            oCmd.Dispose();
        }
    }
}
comments powered by Disqus