1. 程式人生 > 其它 >C#mysql輔助類 mysqlhelper

C#mysql輔助類 mysqlhelper

public class MSqlHelper: IDisposable
{
private string ConnectionString = "";
/// <summary>
/// 批量操作每批次記錄數
/// </summary>
public static int BatchSize = 2000;

/// <summary>
/// 超時時間
/// </summary>
public static int CommandTimeOut = 600;
public SqlHelper(string connectionString = null)
{
if (string.IsNullOrWhiteSpace(connectionString))
ConnectionString = AppSettings.Configuration["DbConnection:ConnectionString"];
else
ConnectionString = connectionString;
}
private MySqlConnection connection { get; set; }
#region ExecuteNonQuery

/// <summary>
/// 執行SQL語句,返回影響的行數
/// </summary>
/// <param name="commandType">命令型別(儲存過程,命令文字, 其它.)</param>
/// <param name="commandText">SQL語句或儲存過程名稱</param>
/// <param name="parms">引數</param>
/// <returns>返回影響的行數</returns>
public int ExecuteNonQuery(string commandText, CommandType commandType = CommandType.Text, MySqlParameter[] parms=null)
{
try
{
using (MySqlConnection connection = GetConnection())
{
Open();

using (var command = GetCommand(connection, commandType, commandText, CommandTimeOut, parms))
{
int retval = command.ExecuteNonQuery();
command.Parameters.Clear();
return retval;

}
}
}
finally
{
Dispose();
}
}
#endregion ExecuteNonQuery
#region ExecuteDataTable

/// <summary>
/// 執行SQL語句,返回結果集中的資料表
/// </summary>
/// <param name="commandType">命令型別(儲存過程,命令文字, 其它.)</param>
/// <param name="commandText">SQL語句或儲存過程名稱</param>
/// <param name="parms">查詢引數</param>
/// <returns>返回結果集中的第一個資料表</returns>
public DataTable QueryDataTable(string commandText, CommandType commandType = CommandType.Text, MySqlParameter[] parms = null)
{
try
{
using (MySqlConnection connection = GetConnection())
{
Open();
using (var command = GetCommand(connection, commandType, commandText, CommandTimeOut, parms))
{

using (var adapter = new MySqlDataAdapter(command))
{
using (var ds = new DataSet())
{
adapter.Fill(ds);
if (commandText.IndexOf("@") > 0)
{
commandText = commandText.ToLower();
int index = commandText.IndexOf("where ");
if (index < 0)
{
index = commandText.IndexOf("\nwhere");
}
if (index > 0)
{
ds.ExtendedProperties.Add("SQL", commandText.Substring(0, index - 1)); //將獲取的語句儲存在表的一個附屬數組裡,方便更新時生成CommandBuilder
}
else
{
ds.ExtendedProperties.Add("SQL", commandText); //將獲取的語句儲存在表的一個附屬數組裡,方便更新時生成CommandBuilder
}
}
else
{
ds.ExtendedProperties.Add("SQL", commandText); //將獲取的語句儲存在表的一個附屬數組裡,方便更新時生成CommandBuilder
}

foreach (DataTable dt in ds.Tables)
{
dt.ExtendedProperties.Add("SQL", ds.ExtendedProperties["SQL"]);
}

command.Parameters.Clear();
return ds.Tables[0];
}
}
}
}

}
finally
{
Dispose();
}
}


/// <summary>
/// 查詢分頁(必須帶ID引數)
/// </summary>
/// <param name="sql">sql語句</param>
/// <param name="page">當前頁</param>
/// <param name="pageSize">條數</param>
/// <param name="orderby">排序</param>
/// <param name="total">返回總條數</param>
/// <param name="parms">引數</param>
/// <returns></returns>
public DataTable QueryPageList(string sql, int page, int pageSize, string orderby, ref int total, params MySqlParameter[] parms)
{
try
{
using (MySqlConnection connection = GetConnection())
{
string cmdtext = "select * from (" + sql + ") a inner join (select id from (" + sql + ") b order by " + orderby + " limit " + (page - 1) * pageSize + "," + pageSize + ") c using(id) ";

Open();
using (var command = GetCommand(connection, CommandType.Text, cmdtext, CommandTimeOut, parms))
{
total = Count(connection, sql);
using (var adapter = new MySqlDataAdapter(command))
{

using (var ds = new DataSet())
{
adapter.Fill(ds);
if (sql.IndexOf("@") > 0)
{
sql = sql.ToLower();
int index = sql.IndexOf("where ");
if (index < 0)
{
index = sql.IndexOf("\nwhere");
}
if (index > 0)
{
ds.ExtendedProperties.Add("SQL", sql.Substring(0, index - 1)); //將獲取的語句儲存在表的一個附屬數組裡,方便更新時生成CommandBuilder
}
else
{
ds.ExtendedProperties.Add("SQL", sql); //將獲取的語句儲存在表的一個附屬數組裡,方便更新時生成CommandBuilder
}
}
else
{
ds.ExtendedProperties.Add("SQL", sql); //將獲取的語句儲存在表的一個附屬數組裡,方便更新時生成CommandBuilder
}

foreach (DataTable dt in ds.Tables)
{
dt.ExtendedProperties.Add("SQL", ds.ExtendedProperties["SQL"]);
}

command.Parameters.Clear();
return ds.Tables[0];
}
}
}
}
}
finally
{
Dispose();
}
}


#endregion ExecuteDataTable
#region private function
/// <summary>
/// 獲取連線
/// </summary>
/// <returns></returns>
private MySqlConnection GetConnection()
{
return GetConnection(ConnectionString);
}
private MySqlConnection GetConnection(string ConnectionString)
{
if (connection == null)
{
connection = new MySqlConnection(ConnectionString);
}
return connection;
}
/// <summary>
/// 開啟連線
/// </summary>
public void Open()
{
CheckConnection();
}
/// <summary>
/// 關閉連線
/// </summary>
public void Close()
{
if (this.connection != null && this.connection.State == ConnectionState.Open)
{
this.connection.Close();
}
}
/// <summary>
/// 檢查連線狀態並開啟連線
/// </summary>
private void CheckConnection()
{
if (this.connection.State != ConnectionState.Open)
{
try
{
this.connection.Open();
}
catch (Exception ex)
{
throw ex;
}
}
}
/// <summary>
/// 釋放資源
/// </summary>
public void Dispose()
{

Close();
if (this.connection != null)
{
this.connection.Dispose();
}
this.connection = null;
}
/// <summary>
/// 獲取command
/// </summary>
/// <param name="connection"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="commandTimeOut"></param>
/// <param name="parms"></param>
/// <returns></returns>
private MySqlCommand GetCommand(MySqlConnection connection, CommandType commandType, string commandText, int commandTimeOut, params MySqlParameter[] parms)
{
var mysqlCmd = new MySqlCommand()
{
CommandType = commandType,
CommandText = commandText,
Connection = connection,
CommandTimeout = commandTimeOut
};
mysqlCmd.Parameters.Clear();
if (parms != null && parms.Length > 0)
{
//預處理MySqlParameter引數陣列,將為NULL的引數賦值為DBNull.Value;
foreach (MySqlParameter parameter in parms)
{
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
}
mysqlCmd.Parameters.AddRange(parms);
}
return mysqlCmd;
}
private int Count(MySqlConnection connection, string commandText)
{
string sql = "select count(*) from (" + commandText + ") a ";
MySqlCommand command = GetCommand(connection, CommandType.Text, sql, CommandTimeOut);
return Convert.ToInt32(command.ExecuteScalar());
}
/// <summary>
/// 執行查詢sql,用於自定義事務處理,此處不會釋放和斷開連線
/// </summary>
/// <param name="connection">(MySqlConnection)資料庫連線</param>
/// <param name="sql">執行的sql語句</param>
/// <returns>受影響的行數</returns>
public int ExecuteTransNonQuery(MySqlConnection connection, string sql)
{
MySqlCommand command = GetCommand(connection, CommandType.Text, sql, CommandTimeOut);
return command.ExecuteNonQuery();
}

/// <summary>
/// 執行查詢sql返回datatable,用於自定義事務處理,此處不會釋放和斷開連線
/// </summary>
/// <param name="connection">(MySqlConnection)資料庫連線</param>
/// <param name="sql">執行的sql語句</param>
/// <returns>返回datatable</returns>
public DataTable ExecuteTransDataTable(MySqlConnection connection, string sql)
{
MySqlCommand command = GetCommand(connection, CommandType.Text, sql, CommandTimeOut);
var adapter = new MySqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds.Tables[0];
}
#endregion
#region 批量操作

/// <summary>
/// 批量更新資料
/// </summary>
/// <param name="table">資料表</param>
public int BatchUpdate(DataTable table)
{
var res = 0;
using (var connection = GetConnection())
{
using (var command = connection.CreateCommand())
{
command.CommandTimeout = CommandTimeOut;
command.CommandType = CommandType.Text;
using (var adapter = new MySqlDataAdapter(command))
{
using (MySqlCommandBuilder commandBulider = new MySqlCommandBuilder(adapter))
{
commandBulider.ConflictOption = ConflictOption.OverwriteChanges;

MySqlTransaction transaction = null;
try
{
Open();
transaction = connection.BeginTransaction();
//設定批量更新的每次處理條數
adapter.UpdateBatchSize = (table.Rows.Count + 1);
//設定事物
adapter.SelectCommand.Transaction = transaction;

if (table.ExtendedProperties["SQL"] != null)
{
adapter.SelectCommand.CommandText = table.ExtendedProperties["SQL"].ToString();
}
res= adapter.Update(table);
transaction.Commit();/////提交事務
}
catch (MySqlException ex)
{
if (transaction != null) transaction.Rollback();
throw ex;
}
finally
{
Dispose();
}
}
}

}
}

return res;
}

/// <summary>
///大批量資料插入,返回成功插入行數
/// </summary>
/// <param name="table">資料表</param>
/// <returns>返回成功插入行數</returns>
public int BulkInsert(DataTable table)
{
if (string.IsNullOrEmpty(table.TableName)) throw new Exception("請給DataTable的TableName屬性附上表名稱");
if (table.Rows.Count == 0) return 0;
int insertCount = 0;
string tmpPath = Path.GetTempFileName();
string csv = DataTableToCsv(table);
File.WriteAllText(tmpPath, csv);
using (MySqlConnection conn = GetConnection())
{
MySqlTransaction tran = null;
try
{
Open();
tran = conn.BeginTransaction();
MySqlBulkLoader bulk = new MySqlBulkLoader(conn)
{
FieldTerminator = ",",
FieldQuotationCharacter = '"',
EscapeCharacter = '"',
LineTerminator = "\r\n",
FileName = tmpPath,
NumberOfLinesToSkip = 0,
TableName = table.TableName,
};
bulk.Columns.AddRange(table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList());
insertCount = bulk.Load();
tran.Commit();
}
catch (MySqlException ex)
{
if (tran != null) tran.Rollback();
throw ex;
}
finally
{
Dispose();
}
}
File.Delete(tmpPath);
return insertCount;
}

#endregion 批量操作
/// <summary>
///將DataTable轉換為標準的CSV
/// </summary>
/// <param name="table">資料表</param>
/// <returns>返回標準的CSV</returns>
private static string DataTableToCsv(DataTable table)
{
//以半形逗號(即,)作分隔符,列為空也要表達其存在。
//列內容如存在半形逗號(即,)則用半形引號(即"")將該欄位值包含起來。
//列內容如存在半形引號(即")則應替換成半形雙引號("")轉義,並用半形引號(即"")將該欄位值包含起來。
StringBuilder sb = new StringBuilder();
DataColumn colum;
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < table.Columns.Count; i++)
{
colum = table.Columns[i];
if (i != 0) sb.Append(",");
if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))
{
sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");
}
else sb.Append(row[colum].ToString());
}
sb.AppendLine();
}

return sb.ToString();
}
}