資料庫連線應用

一些簡單的資料庫應用..有想到在慢慢新增吧 !!

基本的連線字串
string MsSqlConn = @"Server=;Database=;User Id=;Password=;";
string MySqlConn = @"server=;uid=;pwd=;database=;";

 

MySQL 需要額外下載 MySQL.Data.dll,然後把相關 Class 改成 MySql 用的就好了,內容基本上不用再改。

SqlConnection → MySqlConnection
SqlTransaction → MySqlTransaction
SqlCommand → MySqlCommand
SqlDataAdapter → MySqlDataAdapter

基本的一些應用操作

因為工作需要有完整交易 ,一定要整套流程毫無問題才把資料異動一口氣執行完成,所以有用到 Transaction,會額外下 Commit。

// Oracle, MSSQL
using System.Data.SqlClient;
// MySQL
using MySql.Data.MySqlClient;

public class DataBaseConnector
{
    // 資料庫相關常數
    private SqlConnection MsSqlConn = null;
    private SqlTransaction MsSqlTran = null;
    public string ConnectString {  get; private set; }


    public DataBaseConnector(string ConnectString)
    {
        this.ConnectString = Encoding.UTF8.GetString(Convert.FromBase64String(ConnectString));
        MsSqlConn = new SqlConnection(this.ConnectString);
    }

    /// <summary>
    /// 建立連線
    /// </summary>
    /// <returns></returns>
    public void OpenConn()
    {
        try
        {
            if (MsSqlConn != null)
            {
                MsSqlConn.Open();
                MsSqlTran = MsSqlConn.BeginTransaction();
            }
        }
        catch
        {
            throw;
        }
    }
    /// <summary>
    /// 關閉連線
    /// </summary>
    public void CloseConn()
    {
        try
        {
            if (MsSqlConn != null)
            {
                MsSqlConn.Close();
                MsSqlConn.Dispose();
                MsSqlConn = null;
            }

            if (MsSqlTran != null)
            {
                MsSqlTran.Dispose();
                MsSqlTran = null;
            }
        }
        catch
        {
            throw;
        }
    }
    /// <summary>
    /// 確認執行語法
    /// </summary>
    /// <returns></returns>
    public void Commit()
    {
        try
        {
            if (MsSqlTran.Connection != null)
                MsSqlTran.Commit();
        }
        catch
        {
            throw;
        }
    }

    /// <summary>
    /// 取得查詢結果
    /// </summary>
    /// <param name="Query">查詢語法</param>
    /// <returns>查詢結果</returns>
    public DataTable GetResult(string Query, out string ErrMsg)
    {
        ErrMsg = string.Empty;
        DataTable ld_Result = new DataTable("Result");

        try
        {
            using (SqlCommand cmd = new SqlCommand(Query, MsSqlConn, MsSqlTran))
            {
                using (SqlDataAdapter aptr = new SqlDataAdapter(cmd))
                {
                    aptr.Fill(ld_Result);
                    aptr.Dispose();
                }
                cmd.Dispose();
            }
        }
        catch (Exception ex)
        {
            ErrMsg = ex.Message;
        }

        return ld_Result;
    }

    /// <summary>
    /// 取得查詢結果(只有第一行第一列)
    /// </summary>
    /// <param name="Query">查詢語法</param>
    /// <returns>查詢結果</returns>
    public string GetScalar(string Query, out string ErrMsg)
    {
        ErrMsg = string.Empty;
        string ld_Result = string.Empty;

        if (Query.Trim().Substring(0, 6).ToUpper() != "SELECT")
        {
            ErrMsg = "此函式用來取得數據,不能執行非SELECT的語法。";
            return ld_Result;
        }
        
        try
        {
            using (SqlCommand cmd = new SqlCommand(Query, MsSqlConn, MsSqlTran))
            {
                ld_Result = cmd.ExecuteScalar().ToString();
                cmd.Dispose();
            }
        }
        catch (Exception e)
        {
            try
            {
                if (MsSqlTran != null) MsSqlTran.Rollback();
            }
            catch (Exception e2)
            {
                ErrMsg = string.Format("SQL_ERR={0};ROLLBACK_FAIL={1}", e.Message, e2.Message);
            }

            ErrMsg = string.Format("SQL_ERR={0}", e.Message);
        }

        return ld_Result;
    }

    /// <summary>
    /// 執行SQL語法
    /// </summary>
    /// <param name="Query">SQL語法</param>
    /// <returns>受影響的資料筆數</returns>
    public string ExecuteCmd(string Query, out string ErrMsg)
    {
        ErrMsg = string.Empty;
        int li_EffectCount = 0;
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Reset();
        sw.Start();

        try
        {
            using (SqlCommand cmd = new SqlCommand(Query, MsSqlConn, MsSqlTran))
            {
                li_EffectCount = cmd.ExecuteNonQuery();
                cmd.Dispose();
            }
        }
        catch (Exception e)
        {
            try
            {
                if (MsSqlTran != null) MsSqlTran.Rollback();
            }
            catch (Exception e2)
            {
                ErrMsg = string.Format("SQL_ERR={0};ROLLBACK_FAIL={1}", e.Message, e2.Message);
            }

            ErrMsg = string.Format("SQL_ERR={0}", e.Message);
        }
        finally
        {
            sw.Stop();
        }

        return string.Format("EFFECT_DATA={0};EXE_TIME={1}s", li_EffectCount, sw.Elapsed.TotalSeconds.ToString("#0.0#"));
    }
}
2018 / 09 / 04 新增 DataCopy Function

如果需要利用C#定時將A DB的TABLE內部份資料複製到B DB,可以先在B DB建立跟A一樣的空資料表,然後就能引用這個Function,再搭配設定排程,定時做資料轉移~

/// <summary>
/// 資料移轉
/// </summary>
/// <param name="TableName"></param>
/// <param name="WhereSql"></param>
public static void DataCopy(string TableName, string WhereSql)
{
    DataTable dataTable = new DataTable();

    using (SqlConnection conn = new SqlConnection(sourConnStr))
    {
        conn.Open();
        using (SqlDataAdapter aptr = new SqlDataAdapter(string.Format("select * from {0}{1}", TableName, WhereSql), conn))
        {
            aptr.Fill(dataTable);
        }
    }

    if (dataTable.Rows.Count > 0)
    {

        string ls_insert = string.Format("insert into {0} ", TableName);
        string ls_cols = string.Empty;
        string ls_row = string.Empty;
        string ls_vals = string.Empty;

        foreach (DataColumn dc in dataTable.Columns)
        {
            ls_cols += dc.ColumnName + ",";
        }
        ls_cols = ls_cols.Substring(0, ls_cols.Length - 1);
        ls_insert = ls_insert + "(" + ls_cols + ") values ";



        using (SqlConnection conn = new SqlConnection(descConnStr))
        {
            conn.Open();

            // 先清空表單資料
            using (SqlCommand cmd = new SqlCommand(string.Format("delete from {0}", TableName), conn))
            {
                cmd.ExecuteNonQuery();
            }

            try
            {
                // 組字串
                int li_row = 0;
                foreach (DataRow dr in dataTable.Rows)
                {
                    if (li_row % 100 == 0 && li_row > 0)
                    {
                        ls_vals = ls_vals.Substring(0, ls_vals.Length - 1);
                        ls_vals = ls_insert + ls_vals;

                        // 重塞
                        using (SqlCommand cmd = new SqlCommand(ls_vals, conn))
                        {
                            cmd.ExecuteNonQuery();
                        }

                        ls_vals = string.Empty;
                    }

                    ls_row = string.Empty;
                    foreach (DataColumn dc in dataTable.Columns)
                    {
                        ls_row += (dr[dc.ColumnName] == null || dr[dc.ColumnName].ToString().Length == 0) ? "NULL," :
                                  (dr[dc.ColumnName].GetType() == typeof(DateTime)) ? "'" + DateTime.Parse(dr[dc.ColumnName].ToString()).ToString("yyyy-MM-dd HH:mm:ss.fff") + "'," :
                                                                                       "'" + dr[dc.ColumnName].ToString().Trim().Replace("'", "''") + "',";
                    }
                    ls_vals += "(" + ls_row.Substring(0, ls_row.Length - 1) + "),";

                    li_row++;
                }

                ls_vals = ls_vals.Substring(0, ls_vals.Length - 1);
                ls_vals = ls_insert + ls_vals;


                // 重塞
                using (SqlCommand cmd = new SqlCommand(ls_vals, conn))
                {
                    cmd.ExecuteNonQuery();
                }
            }
            catch (Exception e)
            {
                //sw.WriteLine(DateTime.Today.ToString("yyyy-MM-dd") + " [" + TableName + "] → " + ls_vals);
            }
        }
    }
}
用法範例
DataCopy("table_name", "");
DataCopy("table_name", " where sn = '1'");