MySql——數據庫訪問幫助類

在這個類裏面寫一些常用的函數,還有很多的東西沒寫進去。(裏面涉及到另一個類:CSVExten

/***********************
Author: Tst
CSDN blog: Ricardo.M.Tan
************************/

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
using System.Configuration;
using System.Data;
using System.Threading;
using Chn.gzGISer.Utility;
using System.Diagnostics;
using System.Data.Common;

namespace Chn.gzGISer.DataBase.MySql
{
    /// <summary>
    /// MySql數據庫訪問幫助類
    /// </summary>
    public class MySqlDataBase : IDataBase<MySqlDataBase>
    {
        private MySqlConnection _connection;
        /// <summary>
        /// 構造函數
        /// </summary>
        public MySqlDataBase()
        {

        }
        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="connectionString">連接字符串</param>
        public MySqlDataBase(string connectionString)
        {
            _connection = new MySqlConnection(connectionString);
        }
        /// <summary>
        /// 從配置文件中初始化連接字段
        /// </summary>
        /// <param name="connectionStringName">數據庫連接配置文件(.config)中的數據庫連接字段的標籤名</param>
        public void InitMySqlConnectionFromConfig(string connectionStringName)
        {
            string connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
            _connection = new MySqlConnection(connectionString);
        }
        /// <summary>
        /// 打開Connection連接
        /// </summary>
        public void EnsureConnectionOpen()
        {
            var retries = 3;
            if (_connection.State == ConnectionState.Open)
            {
                return;
            }
            else
            {
                while (retries >= 0 && _connection.State != ConnectionState.Open)
                {
                    _connection.Open();
                    retries--;
                    Thread.Sleep(30);
                }
            }
        }
        /// <summary>
        /// 關閉Connection連接
        /// </summary>
        public void EnsureConnectionClose()
        {
            if (_connection.State == ConnectionState.Open)
            {
                _connection.Close();
            }
        }
        /// <summary>
        /// 釋放Connection連接
        /// </summary>
        public void Dispose()
        {
            if (_connection != null)
            {
                _connection.Dispose();
                _connection = null;
            }
        }
        /// <summary>
        /// 執行 MySQL 查詢語句並返回一個表的數據副本
        /// </summary>
        /// <param name="commadText">MySQL 語句</param>
        /// <param name="parameters">MySQL 語句參數列表</param>
        /// <returns>表的數據副本</returns>
        public DataTable ExecuteQuery(string commadText, Dictionary<string, object> parameters)
        {
            if (string.IsNullOrEmpty(commadText))
            {
                throw new Exception("查詢條件爲空");
            }

            DataTable result = null;
            try
            {
                EnsureConnectionOpen();
                MySqlCommand command = CreatCommand(commadText, parameters);
                using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter())
                {
                    dataAdapter.Fill(result);
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                EnsureConnectionClose();
            }
            return result;
        }
        /// <summary>
        /// 執行非查詢 MySQL 語句
        /// </summary>
        /// <param name="commadText">MySQL 語句</param>
        /// <param name="parameters">MySQL 語句參數列表</param>
        /// <returns>受 MySQL 語句影響的行數</returns>
        public int ExcuteNonQuery(string commadText, Dictionary<string, object> parameters)
        {
            if (string.IsNullOrEmpty(commadText))
            {
                throw new Exception("查詢條件爲空");
            }

            int result = 0;
            try
            {
                EnsureConnectionOpen();
                MySqlCommand command = CreatCommand(commadText, parameters);
                result = command.ExecuteNonQuery();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                EnsureConnectionClose();
            }
            return result;
        }
        /// <summary>
        /// 執行一個 MySQL 語句並返回一個標量
        /// </summary>
        /// <param name="commadText">MySQL 語句</param>
        /// <param name="parameters">MySQL 語句參數列表</param>
        /// <returns></returns>
        public object QueryValue(string commadText, Dictionary<string, object> parameters)
        {
            if (string.IsNullOrEmpty(commadText))
            {
                throw new Exception("查詢條件爲空");
            }

            object result = null;
            try
            {
                EnsureConnectionOpen();
                MySqlCommand command = CreatCommand(commadText, parameters);
                result = command.ExecuteScalar();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                EnsureConnectionClose();
            }
            return result;
        }
        private MySqlCommand CreatCommand(string commadText, Dictionary<string, object> parameters)
        {
            MySqlCommand command = _connection.CreateCommand();
            command.CommandText = commadText;
            AddParameters(command, parameters);
            return command;
        }
        private void AddParameters(MySqlCommand command, Dictionary<string, object> parameters)
        {
            if (parameters == null)
            {
                return;
            }

            foreach (KeyValuePair<string, object> param in parameters)
            {
                var parameter = command.CreateParameter();
                parameter.ParameterName = param.Key;
                parameter.Value = param.Value ?? DBNull.Value;
                command.Parameters.Add(parameter);
            }
        }

        /// <summary>
        /// 批量插入
        /// </summary>
        /// <param name="table">數據源</param>
        /// <returns>插入的行數</returns>
        public int BulkLoad(DataTable table)
        {
            int count = -1;
            if (string.IsNullOrEmpty(table.TableName))
            {
                throw new Exception("參數dataSource屬性TableName未設置");
            }
            string curentDic = System.IO.Directory.GetCurrentDirectory();
            string tempPath = string.Format("{0}\\{1}\\{2}.csv", curentDic, "BulkLoadTemp", table.TableName);
            if (System.IO.File.Exists(tempPath))
            {
                System.IO.File.Delete(tempPath);
            }
            CSVExten.DataTableWriteToCsvFile(table, tempPath, 500);

            EnsureConnectionOpen();
            using (MySqlTransaction transaction = _connection.BeginTransaction(IsolationLevel.ReadCommitted))
            {
                try
                {
                    Stopwatch stopwatch = new Stopwatch();
                    stopwatch.Start();
                    MySqlBulkLoader bulkLoader = new MySqlBulkLoader(_connection)
                    {
                        FieldTerminator = ",",
                        FieldQuotationCharacter = '"',
                        EscapeCharacter = '"',
                        LineTerminator = "\r\n",
                        FileName = tempPath,
                        TableName = table.TableName,
                        CharacterSet = "utf8",
                    };
                    count = bulkLoader.Load();
                    transaction.Commit();
                    stopwatch.Stop();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    EnsureConnectionClose();
                }
            }

            System.IO.File.Delete(tempPath);
            return count;
        }
        /// <summary>
        /// 批量插入
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="tempPath">數據源</param>
        /// <returns>插入的行數</returns>
        public int BulkLoad(string tableName, string tempPath)
        {
            int count = -1;
            if (string.IsNullOrEmpty(tableName))
            {
                throw new Exception("表名不能爲空");
            }
            if (string.IsNullOrEmpty(tempPath))
            {
                throw new Exception("路徑不能爲空");
            }
            if (System.IO.File.Exists(tempPath))
            {
                System.IO.File.Delete(tempPath);
            }

            EnsureConnectionOpen();
            using (MySqlTransaction transaction = _connection.BeginTransaction(IsolationLevel.ReadCommitted))
            {
                try
                {
                    Stopwatch stopwatch = new Stopwatch();
                    stopwatch.Start();
                    MySqlBulkLoader bulkLoader = new MySqlBulkLoader(_connection)
                    {
                        FieldTerminator = ",",
                        FieldQuotationCharacter = '"',
                        EscapeCharacter = '"',
                        LineTerminator = "\r\n",
                        FileName = tempPath,
                        TableName = tableName,
                        CharacterSet = "utf8",
                    };
                    count = bulkLoader.Load();
                    transaction.Commit();
                    stopwatch.Stop();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    EnsureConnectionClose();
                }
            }

            System.IO.File.Delete(tempPath);
            return count;
        }
        /// <summary>
        /// 批量 增刪改
        /// </summary>
        /// <param name="table">數據源</param>
        /// <returns>受影響的行數</returns>
        public int MulitUpdate(DataTable table)
        {
            if (string.IsNullOrEmpty(table.TableName))
            {
                throw new Exception("表名不能爲空");
            }
            if (table.Rows.Count == 0)
            {
                return -1;
            }
            string sqlStr = "select * from " + table.TableName + " where false";
            int count = -1;
            EnsureConnectionOpen();
            using (MySqlTransaction transaction = _connection.BeginTransaction(IsolationLevel.ReadCommitted))
            {
                try
                {
                    using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter())
                    {
                        dataAdapter.SelectCommand = new MySqlCommand(sqlStr, _connection);
                        MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(dataAdapter);
                        commandBuilder.ConflictOption = ConflictOption.OverwriteChanges;
                        commandBuilder.SetAllValues = true;
                        count = dataAdapter.Update(table);
                        transaction.Commit();
                        table.AcceptChanges();
                        commandBuilder.Dispose();
                    }
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    EnsureConnectionClose();
                }
                return count;
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章