using MySql.Data.MySqlClient;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Text;
namespace DbAccess
{
public class MySqlHelper : ISysSqlHelper
{
private string connectionString = "";
public MySqlHelper()
{
connectionString = Encrypt.DecryptDES_DB(DbInfo.GetDataBaseInfo("Main"));
}
public MySqlHelper(string rdsType)
{
try
{
connectionString = DbInfo.GetDataBaseInfo(rdsType);
connectionString = Encrypt.DecryptDES_DB(connectionString);
}
catch (Exception ex)
{
}
}
///
/// 执行查询语句,返回DataSet
///
///
///
public DataSet ExecuteDataSet(string SQLString)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = connection;
cmd.CommandText = SQLString;
cmd.CommandTimeout = 10000;
DataSet ds = new DataSet();
try
{
DateTime time = DateTime.Now;
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
da.Fill(ds);
}
catch (MySqlException ex)
{
throw new Exception(ex.Message);
}
finally
{
cmd.Clone();
connection.Close();
}
return ds;
}
}
}
///
/// 执行查询语句,返回DataTable
///
///
///
public DataTable ExecuteDataTable(string SQLString)
{
DateTime time = DateTime.Now;
DataSet ds = ExecuteDataSet(SQLString);
if (ds.Tables.Count > 0)
{
return ds.Tables[0];
}
else
{
return null;
}
}
///
/// 返回数据表(分页)
///
///
///
///
///
///
public DataTable ExecuteDataTable(int page, int pageSize, ref int recordCount, string strSql)
{
DateTime time = DateTime.Now;
DataTable dt = new DataTable();
//获取总记录数
recordCount = Convert.ToInt32(this.ExecuteScalar("select count(1) from (" + strSql + ") as t"));
StringBuilder sb = new StringBuilder();
int beg = (page - 1) * pageSize;
sb.Append(strSql + " limit " + beg.ToString() + "," + pageSize);
dt = this.ExecuteDataTable(sb.ToString());
return dt;
}
///
/// 返回数据表(分页) add zhangjun 2014-12-19 优化大数据分页,计算总记录数的sql
///
///
///
///
///
///
///
///
public DataTable ExecuteDataTable(int page, int pageSize, ref int recordCount, string strSql, string tableName, string strWhere)
{
DateTime time = DateTime.Now;
DataTable dt = new DataTable();
//获取总记录数
recordCount = Convert.ToInt32(this.ExecuteScalar("select count(*) from " + tableName + " " + strWhere));
StringBuilder sb = new StringBuilder();
int beg = (page - 1) * pageSize;
sb.Append(strSql + " limit " + beg.ToString() + "," + pageSize);
dt = this.ExecuteDataTable(sb.ToString());
return dt;
}
///
/// 返回查询的所有结果,突破rds的1万条的限制
///
///
///
public DataTable ExecuteDataTableAll(string strSql)
{
DateTime time = DateTime.Now;
int recordCount = Convert.ToInt32(this.ExecuteScalar("select count(1) from (" + strSql + ") as t"));
//如果记录总数
if (recordCount < 10001)
{
return this.ExecuteDataTable(strSql);
}
//如果超过1万条记录,分次从rds提取
DataTable dt = new DataTable();
int mi = recordCount % 10000;
int pi = recordCount / 10000;
if (mi > 0)
{
pi = pi + 1;
}
for (int i = 1; i < pi + 1; i++)
{
DataTable cdt = this.ExecuteDataTable(i, 10000, ref recordCount, strSql);
if (dt.Rows.Count == 0)
{
dt = cdt.Clone();
}
dt.Merge(cdt);
dt.AcceptChanges();
}
return dt;
}
///
/// 执行SQL语句,返回影响的记录数
///
///
///
public int ExecuteNonQuery(string SQLString)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
using (MySqlCommand cmd = new MySqlCommand(SQLString, connection))
{
try
{
DateTime time = DateTime.Now;
connection.Open();
cmd.CommandTimeout = 10000;
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (MySqlException E)
{
if (E.ToString().Contains("Deadlock"))
{
//WriteLine("物流签收锁定日志跟踪", E.ToString() + "_____" + SQLString);
}
throw new Exception(E.Message);
}
finally
{
connection.Close();
}
}
}
}
///
/// 执行一条计算查询结果语句,返回查询结果(object)。
///
///
///
public object ExecuteScalar(string SQLString)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
using (MySqlCommand cmd = new MySqlCommand(SQLString, connection))
{
try
{
DateTime time = DateTime.Now;
connection.Open();
cmd.CommandTimeout = 10000;
object obj = cmd.ExecuteScalar();
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
return null;
}
else
{
return obj;
}
}
catch (MySqlException e)
{
throw new Exception(e.Message);
}
finally
{
cmd.Clone();
connection.Close();
}
}
}
}
///
/// 执行多条SQL语句,实现数据库事务。
///
///
public void ExecuteSqlTran(ArrayList SQLStringList)
{
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
MySqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n].ToString();
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
cmd.CommandTimeout = 10000;
cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch (MySqlException E)
{
tx.Rollback();
throw new Exception(E.Message);
}
finally
{
conn.Close();
cmd.Dispose();
}
}
}
public string GetConnectString()
{
return connectionString;
}
}
}