C# SCADA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

780 lines
29 KiB

using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.IO;
namespace DatabaseLib
{
public class MysqlFactory : IDataFactory
{
public void CallException(string message)
{
DataHelper.AddErrorLog(new Exception(message));
}
public bool ConnectionTest()
{
//创建连接对象
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
//myMySqlConnection.ConnectionTimeout = 1;//设置连接超时的时间
try
{
//Open DataBase
//打开数据库
m_Conn.Open();
if (m_Conn.State == ConnectionState.Open)
{
return true;
}
}
catch (Exception e)
{
CallException(e.Message);
}
}
//myMySqlConnection is a MySqlConnection object
return false;
}
public MySqlDbType ConvertType(SqlDbType dbType)
{
switch (dbType)
{
case SqlDbType.BigInt:
return MySqlDbType.Int64;
case SqlDbType.Binary:
return MySqlDbType.Binary;
case SqlDbType.Bit:
return MySqlDbType.Bit;
case SqlDbType.Date:
return MySqlDbType.Date;
case SqlDbType.SmallDateTime:
case SqlDbType.DateTime2:
case SqlDbType.DateTime:
return MySqlDbType.DateTime;
case SqlDbType.DateTimeOffset:
return MySqlDbType.Time;
case SqlDbType.Decimal:
return MySqlDbType.Decimal;
case SqlDbType.Float:
return MySqlDbType.Double;
case SqlDbType.Image:
return MySqlDbType.Binary;
case SqlDbType.Int:
return MySqlDbType.Int32;
case SqlDbType.Money:
return MySqlDbType.Float;
case SqlDbType.NText:
case SqlDbType.Text:
return MySqlDbType.Text;
case SqlDbType.Real:
return MySqlDbType.Float;
case SqlDbType.SmallInt:
return MySqlDbType.Int16;
case SqlDbType.Structured:
return MySqlDbType.Set;
case SqlDbType.Time:
return MySqlDbType.Time;
case SqlDbType.Timestamp:
return MySqlDbType.Timestamp;
case SqlDbType.TinyInt:
return MySqlDbType.Byte;
case SqlDbType.VarBinary:
return MySqlDbType.VarBinary;
case SqlDbType.Char:
case SqlDbType.NVarChar:
case SqlDbType.VarChar:
return MySqlDbType.VarChar;
default:
return MySqlDbType.VarChar;
}
}
public DbParameter CreateParam(string paramName, SqlDbType dbType, object objValue, int size = 0, ParameterDirection direction = ParameterDirection.Input)
{
if (string.IsNullOrEmpty(paramName)) return null;
if (paramName[0] == '@') paramName = 'p' + paramName.TrimStart('@');
MySqlParameter parameter = new MySqlParameter(paramName, ConvertType(dbType));
if (size > 0) parameter.Size = size;
if (objValue == null)
{
if (direction == ParameterDirection.Output)
{
parameter.Direction = direction;
return parameter;
}
parameter.IsNullable = true;
parameter.Value = DBNull.Value;
return parameter;
}
parameter.Value = objValue;
return parameter;
}
#region ExecuteDataset //执行查询语句,返回一个记录集
/// <summary>
/// 返回记录集
/// </summary>
/// <param name="SQL">用于返回记录集的SQL语句</param>
/// <returns>记录集</returns>
public DataSet ExecuteDataset(string SQL)
{
DataSet ds = new DataSet();
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
try
{
var da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand(SQL, m_Conn);
da.SelectCommand = cmd;
da.Fill(ds);
}
catch (Exception e)
{
CallException(SQL + " " + e.Message);
}
}
return ds;
}
/// <summary>
/// 返回记录集
/// </summary>
/// <param name="SQL">用于返回记录集的SQL语句</param>
/// <param name="TableName">映射表名</param>
/// <returns>记录集</returns>
public DataSet ExecuteDataset(string SQL, string TableName)
{
DataSet ds = new DataSet();
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
try
{
var da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand(SQL, m_Conn);
da.SelectCommand = cmd;
da.Fill(ds, TableName);
}
catch (Exception e)
{
CallException(SQL + " " + e.Message);
}
}
return ds;
}
/// <summary>
/// 返回包含多个表的记录集
/// </summary>
/// <param name="SQLs">用于返回记录集的SQL语句</param>
/// <param name="TableNames">映射表名</param>
/// <returns>记录集</returns>
public DataSet ExecuteDataset(string[] SQLs, string[] TableNames)
{
DataSet ds = new DataSet();
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
try
{
for (int i = 0; i < SQLs.Length; i++)
{
var da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand(SQLs[i], m_Conn);
da.SelectCommand = cmd;
da.Fill(ds, TableNames[i]);
}
}
catch (Exception e)
{
CallException(SQLs + " " + e.Message);
}
}
return ds;
}
#endregion ExecuteDataset
/// <summary>
/// 返回表
/// </summary>
/// <param name="SQL">用于返回记录集的SQL语句</param>
/// <returns>记录集</returns>
public DataTable ExecuteDataTable(string SQL)
{
DataTable dt = new DataTable();
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
try
{
var da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand(SQL, m_Conn);
da.SelectCommand = cmd;
da.Fill(dt);
}
catch (Exception e)
{
CallException(SQL + " " + e.Message);
}
}
return dt;
}
#region ExecuteNonQuery //执行非查询语句
/// <summary>
/// 执行一条INSERT、UPDATE、DELETE语句
/// </summary>
/// <param name="SQL">T-SQL语句</param>
/// <returns>返回影响的行数</returns>
public int ExecuteNonQuery(string SQL)
{
int res = -1;
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
MySqlTransaction sqlT = null; MySqlBulkLoader loader = new MySqlBulkLoader(m_Conn);
//loader.Columns
try
{
using (MySqlCommand cmd = new MySqlCommand(SQL, m_Conn))
{
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
cmd.Connection = m_Conn;
sqlT = m_Conn.BeginTransaction();
cmd.Transaction = sqlT;
res = cmd.ExecuteNonQuery();
sqlT.Commit();
}
}
catch (Exception e)
{
if (sqlT != null)
sqlT.Rollback();
CallException(SQL + " " + e.Message);
return -1;
}
return res;
}
}
/// <summary>
/// 执行一组INSERT、UPDATE、DELETE语句
/// </summary>
/// <param name="SQLs">T-SQL语句</param>
/// <returns>返回影响的行数</returns>
public int ExecuteNonQuery(string[] SQLs)
{
int res = -1;
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
MySqlTransaction sqlT = null;
MySqlCommand cmd = new MySqlCommand();
try
{
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
cmd.Connection = m_Conn;
sqlT = m_Conn.BeginTransaction();
cmd.Transaction = sqlT;
for (int i = 0; i < SQLs.Length; i++)
{
cmd.CommandText = SQLs[i];
res = cmd.ExecuteNonQuery();
}
sqlT.Commit();
}
catch (Exception e)
{
if (sqlT != null)
sqlT.Rollback();
CallException(SQLs + " " + e.Message);
res = -1;
}
return res;
}
}
/// <summary>
/// 执行一组INSERT、UPDATE、DELETE语句
/// </summary>
/// <param name="SQLs">T-SQL语句</param>
/// <param name="Pars">执行参数</param>
/// <returns>返回影响的行数</returns>
public int ExecuteNonQuery(string[] SQLs, object[][] Pars)
{
int res = -1;
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
MySqlTransaction sqlT = null;
MySqlCommand cmd = new MySqlCommand();
try
{
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
cmd.Connection = m_Conn;
sqlT = m_Conn.BeginTransaction();
cmd.Transaction = sqlT;
for (int i = 0; i < SQLs.Length; i++)
{
cmd.CommandText = SQLs[i];
cmd.Parameters.Clear();
for (int j = 0; j < Pars[i].Length; j++)
{
cmd.Parameters.AddWithValue("@p" + j.ToString(), Pars[i][j]);
}
res = cmd.ExecuteNonQuery();
}
sqlT.Commit();
}
catch (Exception e)
{
if (sqlT != null)
sqlT.Rollback();
CallException(SQLs + " " + e.Message);
res = -1;
}
return res;
}
}
#endregion ExecuteNonQuery
#region FillDataSet //填充一个记录集
/// <summary>
/// 用指定的SQL语句来填充一个记录集
/// </summary>
/// <param name="ds">记录集</param>
/// <param name="SQL">SELECT语句</param>
/// <param name="TableName">映射表名</param>
public void FillDataSet(ref DataSet ds, string SQL, string TableName)
{
try
{
MySqlConnection m_Conn;
m_Conn = new MySqlConnection(DataHelper.ConnectString);
var da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand(SQL, m_Conn);
da.SelectCommand = cmd;
da.Fill(ds, TableName);
}
catch (Exception e)
{
CallException(SQL + " " + e.Message);
}
}
#endregion FillDataSet
#region
// <summary>
/// 返回一个MySqlDataReader
/// </summary>
public DbDataReader ExecuteReader(string sSQL)
{
MySqlConnection connection = new MySqlConnection(DataHelper.ConnectString);
MySqlCommand command = new MySqlCommand(sSQL, connection);
if (connection.State == ConnectionState.Closed)
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
public DbDataReader ExecuteProcedureReader(string sSQL, params DbParameter[] ParaName)
{
MySqlConnection connection = new MySqlConnection(DataHelper.ConnectString);
MySqlCommand command = new MySqlCommand(sSQL, connection);
command.CommandType = CommandType.StoredProcedure;
if (ParaName != null)
{
command.Parameters.AddRange(ParaName);
}
try
{
if (connection.State == ConnectionState.Closed)
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception e)
{
CallException(sSQL + " " + e.Message);
return null;
}
}
#endregion
#region ExecuteScalar //执行查询,并返回查询所返回的结果集中第一行的第一列
/// <summary>
/// 执行查询,并返回查询所返回的结果集中第一行的第一列
/// </summary>
/// <param name="sSQL">SQL语句</param>
/// <returns></returns>
public object ExecuteScalar(string sSQL)
{
MySqlTransaction sqlT = null;
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
MySqlCommand cmd = new MySqlCommand(sSQL, m_Conn);
try
{
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
sqlT = m_Conn.BeginTransaction();
cmd.Transaction = sqlT;
var res = cmd.ExecuteScalar();
sqlT.Commit();
if (res == DBNull.Value) res = null;
return res;
}
catch (Exception e)
{
if (sqlT != null)
sqlT.Rollback();
CallException(sSQL + " " + e.Message);
return null;
}
}
}
#endregion ExecuteScalar
#region ExecuteStoredProcedure //执行一个存储过程
/// <summary>
/// 执行一个带参数的存储过程
/// </summary>
/// <param name="ProName">存储过程名</param>
/// <param name="ParaName">参数名称</param>
/// <param name="ParaDir">参数方向,Input参数是输入参数 InputOutput参数既能输入,也能输出 Output参数是输出参数 ReturnValue参数存储过程返回值。</param>
/// <param name="Para">参数对象数组</param>
/// <returns>成功返回true,失败返回false</returns>
public int ExecuteStoredProcedure(string ProName, params DbParameter[] ParaName)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
try
{
MySqlCommand cmd = new MySqlCommand(ProName, m_Conn)
{
CommandType = CommandType.StoredProcedure
};
if (ParaName != null)
{
cmd.Parameters.AddRange(ParaName);
}
MySqlParameter param = new MySqlParameter();
cmd.Parameters.Add(param);
param.Direction = ParameterDirection.ReturnValue;
if (m_Conn.State == ConnectionState.Closed)
{
m_Conn.Open();
}
cmd.ExecuteNonQuery();
return (int)param.Value;
}
catch (Exception e)
{
CallException(ProName + " " + e.Message);
return -1;
}
}
}
/// <summary>
/// 执行一个没有参数和返回值的存储过程(默认参数类型)
/// </summary>
/// <param name="ProName">存储过程名</param>
/// <param name="Para">参数对象数组</param>
/// <returns>成功返回true,失败返回false</returns>
public bool ExecuteStoredProcedure(string ProName)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
try
{
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
MySqlCommand cmd = new MySqlCommand(ProName, m_Conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
return true;
}
catch (Exception e)
{
CallException(ProName + " " + e.Message);
return false;
}
}
}
/// <summary>
/// 执行一个带参数的存储过程,并返回数据集
/// </summary>
/// <param name="ProName">存储过程名</param>
/// <param name="ParaName">参数名称</param>
/// <param name="Para">参数对象数组</param>
/// <param name="ds">执行过程中返回的数据集</param>
/// <returns>成功返回true,失败返回false</returns>
public DataSet ExecuteDataSetProcedure(string ProName, ref int returnValue, params DbParameter[] ParaName)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
DataSet ds = new DataSet();
try
{
MySqlCommand cmd = new MySqlCommand(ProName, m_Conn);
cmd.CommandType = CommandType.StoredProcedure;
if (ParaName != null)
{
cmd.Parameters.AddRange(ParaName);
}
MySqlParameter param = new MySqlParameter { Direction = ParameterDirection.ReturnValue };
cmd.Parameters.Add(param);
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
var da = new MySqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
returnValue = (int)param.Value;
return ds;
}
catch (Exception e)
{
CallException(ProName + " " + e.Message);
return null;
}
}
}
public DataSet ExecuteDataSetProcedure(string ProName, params DbParameter[] ParaName)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
DataSet ds = new DataSet();
try
{
MySqlCommand cmd = new MySqlCommand(ProName, m_Conn);
cmd.CommandType = CommandType.StoredProcedure;
if (ParaName != null)
{
cmd.Parameters.AddRange(ParaName);
}
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
var da = new MySqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
return ds;
}
catch (Exception e)
{
CallException(ProName + " " + e.Message);
return null;
}
}
}
/// <summary>
/// 执行一个带参数的存储过程,并返回数据集
/// </summary>
/// <param name="ProName">存储过程名</param>
/// <param name="ParaName">参数名称</param>
/// <param name="Para">参数对象数组</param>
/// <param name="ds">执行过程中返回的数据集</param>
/// <returns>成功返回true,失败返回false</returns>
///
public DataTable ExecuteDataTableProcedure(string ProName, params DbParameter[] ParaName)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
DataTable ds = new DataTable();
try
{
MySqlCommand cmd = new MySqlCommand(ProName, m_Conn);
cmd.CommandType = CommandType.StoredProcedure;
if (ParaName != null)
{
cmd.Parameters.AddRange(ParaName);
}
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
var da = new MySqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
return ds;
}
catch (Exception e)
{
CallException(ProName + " " + e.Message);
return null;
}
}
}
public DataTable ExecuteDataTableProcedure(string ProName, ref int returnValue, DbParameter[] ParaName)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
DataTable ds = new DataTable();
try
{
MySqlCommand cmd = new MySqlCommand(ProName, m_Conn);
cmd.CommandType = CommandType.StoredProcedure;
if (ParaName != null)
{
cmd.Parameters.AddRange(ParaName);
}
MySqlParameter param = new MySqlParameter { Direction = ParameterDirection.ReturnValue };
cmd.Parameters.Add(param);
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
var da = new MySqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
returnValue = (int)param.Value;
return ds;
}
catch (Exception e)
{
CallException(ProName + " " + e.Message);
return null;
}
}
}
/// <summary>
/// 执行一个带参数的存储过程,同时输出一行
/// </summary>
/// <param name="ProName">存储过程名</param>
/// <param name="ParaName">参数名称</param>
/// <param name="Para">参数对象数组</param>
/// <returns>返回整数</returns>
public DataRow ExecuteDataRowProcedure(string ProName, params DbParameter[] ParaName)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
try
{
MySqlCommand cmd = new MySqlCommand(ProName, m_Conn);
cmd.CommandType = CommandType.StoredProcedure;
if (ParaName != null)
{
cmd.Parameters.AddRange(ParaName);
}
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
DataTable table = new DataTable();
var da = new MySqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(table);
if (table.Rows.Count > 0)
return table.Rows[0];
else
return table.NewRow();
}
catch (Exception e)
{
CallException(ProName + " " + e.Message);
return null;
}
}
}
/// <summary>
/// 执行一个带参数的存储过程,同时输出一行
/// </summary>
/// <param name="ProName">存储过程名</param>
/// <param name="ParaName">参数名称</param>
/// <param name="Para">参数对象数组</param>
/// <returns>返回整数</returns>
public DataRowView ExecuteDataRowViewProcedure(string ProName, params DbParameter[] ParaName)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
try
{
MySqlCommand cmd = new MySqlCommand(ProName, m_Conn);
cmd.CommandType = CommandType.StoredProcedure;
if (ParaName != null)
{
cmd.Parameters.AddRange(ParaName);
}
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
DataTable table = new DataTable();
var da = new MySqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(table);
if (table.Rows.Count > 0)
return table.DefaultView[0];
else
return table.DefaultView.AddNew();
}
catch (Exception e)
{
CallException(ProName + " " + e.Message);
return null;
}
}
}
public bool BulkCopy(IDataReader reader, string tableName, string command = null, SqlBulkCopyOptions options = SqlBulkCopyOptions.Default)
{
using (MySqlConnection m_Conn = new MySqlConnection(DataHelper.ConnectString))
{
MySqlTransaction sqlT = null;
try
{
if (m_Conn.State == ConnectionState.Closed)
m_Conn.Open();
sqlT = m_Conn.BeginTransaction();
if (!string.IsNullOrEmpty(command))
{
MySqlCommand cmd = new MySqlCommand(command, m_Conn);
cmd.Transaction = sqlT;
cmd.ExecuteNonQuery();
}
string tmpPath = Path.GetTempFileName();
string csv = DataHelper.ReaderToCsv(reader);
File.WriteAllText(tmpPath, csv);
MySqlBulkLoader copy = new MySqlBulkLoader(m_Conn)
{
FieldTerminator = ",",
FieldQuotationCharacter = '"',
EscapeCharacter = '"',
LineTerminator = "\r\n",
FileName = tmpPath,
NumberOfLinesToSkip = 0,
TableName = tableName,
};
//copy.BatchSize = _capacity;
copy.Load();//如果写入失败,考虑不能无限增加线程数
//Clear();
sqlT.Commit();
m_Conn.Close();
File.Delete(tmpPath);
return true;
}
catch (Exception e)
{
if (sqlT != null)
sqlT.Rollback();
m_Conn.Close();
DataHelper.AddErrorLog(e);
return false;
}
}
}
#endregion ExecuteStoredProcedure
}
}