在這個類裏面寫一些常用的函數,還有很多的東西沒寫進去。(裏面涉及到另一個類: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;
}
}
}
}