using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
namespace WX.CRM.DAL
{
public class MySqlDbHelper
{
///
/// MySql连接枚举
///
public enum MySqlConnectionString
{
CRMRESMYSQLConn,
}
#region 私有变量
private const string defaultConfigKeyName = "DbHelper";//连接字符串 默认Key
private string connectionString;
private string providerName;
#endregion
#region 构造函数
///
/// 默认构造函数(DbHelper)
///
public MySqlDbHelper()
{
this.connectionString = ConfigurationManager.ConnectionStrings["DbHelper"].ConnectionString;
this.providerName = ConfigurationManager.ConnectionStrings["DbHelper"].ProviderName;
}
///
/// DbHelper构造函数
///
/// 连接字符串名
public MySqlDbHelper(string keyName)
{
this.connectionString = ConfigurationManager.ConnectionStrings[keyName].ConnectionString;
this.providerName = ConfigurationManager.ConnectionStrings[keyName].ProviderName;
}
public MySqlDbHelper(MySqlConnectionString conn)
{
switch (conn)
{
case MySqlConnectionString.CRMRESMYSQLConn:
this.connectionString = WX.CRM.Model.ConStringHelper.CRMRESMYSQLConn;
this.providerName = ConfigurationManager.ConnectionStrings[conn.ToString()].ProviderName;
break;
default: this.connectionString = WX.CRM.Model.ConStringHelper.CRMRESMYSQLConn; break;
}
}
#endregion
public int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
{
MySqlConnection con = new MySqlConnection(connectionString);
int res = 0;
try
{
con.Open();
MySqlCommand cmd = new MySqlCommand(sql, con);
foreach (MySqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
try
{
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Dispose();
}
}
catch (Exception e)
{
throw;
}
finally
{
con.Close();
}
return res;
}
public int ExecuteNonQuery(string sql, int timeOut = 30, params MySqlParameter[] parameters)
{
MySqlConnection con = new MySqlConnection(connectionString);
int res = 0;
try
{
con.Open();
MySqlCommand cmd = new MySqlCommand(sql, con);
foreach (MySqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
try
{
cmd.CommandTimeout = timeOut * 1000;//自定义超时时间
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd.Dispose();
}
}
catch (Exception e)
{
throw;
}
finally
{
con.Close();
}
return res;
}
public object ExecuteScalar(string sql, params MySqlParameter[] parameters)
{
MySqlConnection con = new MySqlConnection(connectionString);
con.Open();
MySqlCommand cmd = new MySqlCommand(sql, con);
if (parameters != null)
foreach (MySqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
object res = cmd.ExecuteScalar();
cmd.Dispose();
con.Close();
return res;
}
public DataSet ExecuteDataTable(string sql, params MySqlParameter[] parameters)
{
DataSet dataset = new DataSet();
MySqlConnection con = new MySqlConnection(connectionString);
MySqlCommand cmd = null;
try
{
con.Open();
cmd = new MySqlCommand(sql, con);
foreach (MySqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
//dataset放执行后的数据集合
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
adapter.Fill(dataset);
}
catch (Exception)
{
throw;
}
finally
{
if (con != null)
con.Close();
if (cmd != null)
cmd.Dispose();
}
return dataset;
}
public IList> ExecuteDataDictionary(string sql, params MySqlParameter[] parameters)
{
IList> result = new List>();
MySqlConnection con = new MySqlConnection(connectionString);
MySqlCommand cmd = null;
try
{
DataSet ds = new DataSet();
con.Open();
cmd = new MySqlCommand(sql, con);
foreach (MySqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
adapter.Fill(ds);
//格式转换
if (ds.Tables.Count > 0)
{
var table = ds.Tables[0];
var columns = table.Columns;
foreach (DataRow row in table.Rows)
{
IDictionary r = new Dictionary();
foreach (var col in columns)
{
var colName = col.ToString();
if (!r.ContainsKey(colName))
{
r.Add(col.ToString(), row[col.ToString()]);
}
}
result.Add(r);
}
}
}
catch (Exception)
{
throw;
}
finally
{
if (con != null)
con.Close();
if (cmd != null)
cmd.Dispose();
}
return result;
}
public IList> ExecuteDataDictionary(string sql, int timeout = 15, params MySqlParameter[] parameters)
{
IList> result = new List>();
MySqlConnection con = new MySqlConnection(connectionString);
MySqlCommand cmd = null;
try
{
DataSet ds = new DataSet();
con.Open();
cmd = new MySqlCommand(sql, con);
foreach (MySqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cmd.CommandTimeout = timeout * 1000;
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
adapter.Fill(ds);
//格式转换
if (ds.Tables.Count > 0)
{
var table = ds.Tables[0];
var columns = table.Columns;
foreach (DataRow row in table.Rows)
{
IDictionary r = new Dictionary();
foreach (var col in columns)
{
var colName = col.ToString();
if (!r.ContainsKey(colName))
{
r.Add(col.ToString(), row[col.ToString()]);
}
}
result.Add(r);
}
}
}
catch (Exception)
{
throw;
}
finally
{
if (con != null)
con.Close();
if (cmd != null)
cmd.Dispose();
}
return result;
}
private static void CreateCSVfile(DataTable dtable, string csvrpath)
{
StreamWriter sw = new StreamWriter(csvrpath, false);
int icolcount = dtable.Columns.Count;
foreach (DataRow drow in dtable.Rows)
{
for (int i = 0; i < icolcount; i++)
{
if (!Convert.IsDBNull(drow[i]))
{
sw.Write(drow[i].ToString());
}
if (i < icolcount - 1)
{
sw.Write(",");
}
}
sw.Write(sw.NewLine);
}
sw.Close();
sw.Dispose();
}
public void BulkInsert(DataTable dt, string tblName)
{
string csvrpath = "c:/tmp.csvr";
CreateCSVfile(dt, csvrpath);
using (MySqlConnection cn1 = new MySqlConnection(connectionString))
{
cn1.Open();
MySqlBulkLoader bcp1 = new MySqlBulkLoader(cn1);
bcp1.TableName = tblName; //Create ProductOrder table into MYSQL database...
bcp1.FieldTerminator = ",";
bcp1.LineTerminator = "\r\n";
bcp1.FileName = csvrpath;
bcp1.NumberOfLinesToSkip = 0;
bcp1.Load(); //Once data write into db then delete file..
}
}
public int InsertBigList(IList> data, string tabName)
{
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
if (!Directory.Exists(Path.Combine(baseDir, "App_Data")))
{
Directory.CreateDirectory(Path.Combine(baseDir, "App_Data"));
}
var filePath = Path.Combine(Path.Combine(baseDir, "App_Data"), Path.GetRandomFileName() + ".csv");
File.Create(filePath).Close();
using (var sw = new StreamWriter(filePath))
{
//将数据写入文件
foreach (var item in data)
{
List colVal = new List();
foreach (var key in item.Keys)
{
colVal.Add($"\"{item[key]?.Replace("\"", "'").Replace("\r\n", "")}\"");//可行
}
sw.WriteLine(string.Join(",", colVal));
}
}
//批量插入
//创建一个MySqlCommand对象
MySqlCommand cmd = new MySqlCommand();
var res = 0;
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
var bulk = new MySqlBulkLoader(conn)
{
FieldTerminator = ",",//这个地方字段间的间隔方式,为逗号
FieldQuotationCharacter = '"',
EscapeCharacter = '"',
LineTerminator = "\r\n",//每行
FileName = filePath,//文件地址
NumberOfLinesToSkip = 0,
TableName = tabName
};
ExecuteScalar("set global local_infile = 'ON';", null);//打开批量插入限制
res = bulk.Load();
}
//写入完成删除文件
File.Delete(filePath);
return res;//返回插入成功条数
}
public IList QueryEntitys(string sql, params MySqlParameter[] parameters) where T : new()
{
IList result = new List();
MySqlConnection con = new MySqlConnection(connectionString);
MySqlCommand cmd = null;
try
{
DataSet ds = new DataSet();
con.Open();
cmd = new MySqlCommand(sql, con);
foreach (MySqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
adapter.Fill(ds);
//格式转换
if (ds.Tables.Count > 0)
{
var table = ds.Tables[0];
var columns = table.Columns;
var type = typeof(T);
var attrs = type.GetProperties();
foreach (DataRow row in table.Rows)
{
T r = new T();
foreach (var col in columns)
{
var key = col.ToString();
var a = attrs.FirstOrDefault(m => m.Name.Equals(key, StringComparison.InvariantCultureIgnoreCase));
a?.SetValue(r, row[key]);
}
result.Add(r);
}
}
}
catch (Exception)
{
throw;
}
finally
{
if (con != null)
con.Close();
if (cmd != null)
cmd.Dispose();
}
return result;
}
}
}