程序中我们可能经常会在某个语句或者某方法后去修改数据库的内容(增删查改的一系列操作),但如果我们直接在程序中写这部分的代码会使得我们的代码量很大,并且我们可能经常做这种重复的操作,所有我们就把我们会用到的数据库操作封装起来放到一个类中,用的时候直接调用,方便编码和提高代码的可阅读性,这样我们就需要一个数据库帮助类。
那我就直接上代码了,项目MySql.Data.dll程序集引用要记得加上,结合我之前写过的app.config配置文件那一篇博客可能更配哦(这个背景如果看着不习惯可以复制到自己新创建的项目中看)
class MySQLHelper
{
//数据库连接字符串(注意:这里的“MySQLDBConnectionString”一定要与App.config文件中connectionStrings节点值一致)(两种写法)
//public static readonly string connectionString = ConfigurationManager.AppSettings["MySQLDBConnection"].ToString();
public static readonly string connectionString = ConfigurationManager.ConnectionStrings["MySQLDBConnection"].ConnectionString;
///
/// 给定连接的数据库用假设参数执行一个sql命令(非查询语句,不返回数据集)
///
/// 要执行的sql语句
/// 命令类型(存储过程,文本等)
/// 执行命令所用的参数的集合
/// 执行命令做影响的行数
public static int ExcuteNonQuery(string cmdText, CommandType cmdType, params MySqlParameter[] commandParmeters)
{
//使用using 语句,方便using语句中声明的对象自动被Dispose
using (MySqlCommand cmd = new MySqlCommand())
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
try
{
//执行命令前预处理
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParmeters);
//执行非查询操作
int val = cmd.ExecuteNonQuery();
//清空传入的参数
cmd.Parameters.Clear();
return val;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
}
}
///
/// 查询语句,返回查询到的int型数值
///
/// 查询语句
/// 命令字符串类型
/// SQL语句对应参数
/// 查询到的值
public static int GetCount(string cmdText, CommandType cmdType = CommandType.Text, params MySqlParameter[] commandParameters)
{
//创建MySqlCommand执行命令语句对象
using (MySqlCommand cmd = new MySqlCommand())
{
//创建一个MySqlConnection对象
using (MySqlConnection con = new MySqlConnection())
{
try
{
//对MySqlCommand对象设置参数
PrepareCommand(cmd, con, null, cmdType, cmdText, commandParameters);
//创建一个适配器adapter
using (MySqlDataAdapter adapter = new MySqlDataAdapter())
{
//给适配器添加MySqlCommand执行命令语句对象
adapter.SelectCommand = cmd;
//定义一个结果数据集
DataSet ds = new DataSet();
//将查询到数据填充到数据集
adapter.Fill(ds);
//清空参数
cmd.Parameters.Clear();
DataTable dt = ds.Tables[0];
return Convert.ToInt32(dt.Rows[0][0]);
//return DataSetToList(ds, 0);
}
}
catch (Exception e)
{
Console.WriteLine(e.GetType() + ":" + e.Message);
return -1;
}
}
}
}
///
/// 执行查询语句返回List
///
///
/// 查询语句
/// 命令字符串类型
/// SQL语句对应参数
/// DataSet
public static IList GetList(string cmdText, CommandType cmdType = CommandType.Text, params MySqlParameter[] commandParameters)
{
//创建MySqlCommand执行命令语句对象
using (MySqlCommand cmd = new MySqlCommand())
{
//创建一个MySqlConnection对象
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
//在这里用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在
try
{
//调用PrepareCommand方法,对MySqlCommand对象设置参数
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
//声明一个适配器
using (MySqlDataAdapter adapter = new MySqlDataAdapter())
{
//给适配器添加MySqlCommand执行命令语句对象
adapter.SelectCommand = cmd;
//定义一个结果数据集
DataSet ds = new DataSet();
//将查询到数据填充到数据集
adapter.Fill(ds);
//清除参数
cmd.Parameters.Clear();
return DataSetToList(ds, 0);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}
}
}
///
/// 用指定的数据库连接字符串执行一个命令并返回一个数据集的第一列
///
///
///例如: Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
///
/// 存储过程名称或者sql命令语句
/// 命令类型(存储过程, 文本, 等等)
/// 执行命令所用参数的集合
/// 用 Convert.To{Type}把类型转换为想要的
public static object ExecuteScalar(string cmdText, CommandType cmdType, params MySqlParameter[] commandParameters)
{
//创建MySqlCommand执行命令语句对象
using (MySqlCommand cmd = new MySqlCommand())
{
//使用using语句,方便using语句中声明的对象自动被Dispose
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
try
{
//执行命令前预处理
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
//使用ExecuteScalar()执行SQL语句,返回第一行第一列,object类型;转换使用Convert,不要使用强转;
//使用ExecuteScalar()一般执行聚合查询;使用ExecuteScalar()亦可查询select getdate()
object val = cmd.ExecuteScalar();
//清除参数
cmd.Parameters.Clear();
return val;
}
catch (Exception e)
{
Console.WriteLine(e.GetType() + ":" + e.Message);
return null;
}
}
}
}
///
/// 执行多条SQL语句,实现数据库事务。
///
/// 多条SQL语句
/// 对应SQL语句列表中每一条语句的参数集合列表
/// 命令类型(存储过程, 文本, 等等)
public static void ExecuteBatchSql(IList sqlStringList, IList commandParametersList, CommandType cmdType = CommandType.Text)
{
if (sqlStringList.Count == 0 || commandParametersList.Count == 0 || sqlStringList.Count != commandParametersList.Count)
{
throw new Exception("传入参数错误");
}
//创建MySqlCommand执行命令语句对象
using (MySqlCommand cmd = new MySqlCommand())
{
//使用using语句,方便using语句中声明的对象自动被Dispose
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
//打开数据库连接
conn.Open();
//MySqlCommand执行命令语句对象添加数据库连接对象
cmd.Connection = conn;
//创建事务
MySqlTransaction tx = conn.BeginTransaction();
//MySqlCommand执行命令语句对象添加事务对象
cmd.Transaction = tx;
try
{
//遍历SQL语句,依次执行
for (int n = 0; n < sqlStringList.Count; n++)
{
//执行命令前预处理
PrepareCommand(cmd, conn, null, cmdType, sqlStringList[n], commandParametersList[n]);
//执行非查询数据库操作
cmd.ExecuteNonQuery();
//清空传入的参数
cmd.Parameters.Clear();
}
//一次性提交事务
tx.Commit();
}
catch (System.Data.SqlClient.SqlException e)
{
tx.Rollback();
Console.WriteLine(e.GetType() + ":" + e.Message);
throw new Exception(e.Message);
}
}
}
}
///
/// 返回DataSet
///
/// 存储过程名称或者sql命令语句
/// 命令类型(存储过程, 文本, 等等)
/// 执行命令所用参数的集合
/// 结果数据集
public static DataSet GetDataSet(string cmdText, CommandType cmdType = CommandType.Text, params MySqlParameter[] commandParameters)
{
//创建一个MySqlCommand对象
MySqlCommand cmd = new MySqlCommand();
//创建一个MySqlConnection对象
MySqlConnection conn = new MySqlConnection(connectionString);
//在这里用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在
try
{
//调用PrepareCommand方法,对MySqlCommand对象设置参数
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
//声明一个适配器
MySqlDataAdapter adapter = new MySqlDataAdapter();
//给适配器添加MySqlCommand执行命令语句对象
adapter.SelectCommand = cmd;
//定义一个结果数据集
DataSet ds = new DataSet();
//将查询到数据填充到数据集
adapter.Fill(ds);
//清除参数
cmd.Parameters.Clear();
//关闭数据库连接对象
conn.Close();
return ds;
}
catch (Exception e)
{
Console.WriteLine(e.GetType() + ":" + e.Message);
//throw e;
}
return null;
}
///
/// 用执行的数据库连接执行一个返回数据集的sql命令
///
///
/// 举例:
/// MySqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
///
/// 存储过程名称或者sql命令语句
/// 命令类型(存储过程, 文本, 等等)
/// 执行命令所用参数的集合
/// 包含结果的读取器
public static MySqlDataReader ExecuteReader(string cmdText, CommandType cmdType = CommandType.Text, params MySqlParameter[] commandParameters)
{
//创建一个MySqlCommand对象
MySqlCommand cmd = new MySqlCommand();
//创建一个MySqlConnection对象
MySqlConnection conn = new MySqlConnection(connectionString);
//在这里用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在,
//因此commandBehaviour.CloseConnection 就不会执行
try
{
//调用 PrepareCommand 方法,对 MySqlCommand 对象设置参数
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
//调用MySqlCommand 的ExecuteReader方法
//CommandBehavior.CloseConnection的功能是保证当MySqlDataReader对象被关闭时,其依赖的连接也会被自动关闭
MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
//清除参数
cmd.Parameters.Clear();
return reader;
}
catch (Exception e)
{
//关闭连接,抛出异常
conn.Close();
Console.WriteLine(e.GetType() + ":" + e.Message);
//throw;
}
return null;
}
///
/// 执行命令前预处理
///
/// MySqlCommand执行命令语句对象
/// 数据库连接对象
/// 事务
/// 命令类型例如 存储过程或者文本
/// 命令文本,例如:Select * from Products
/// 执行命令的参数
private static void PrepareCommand(MySqlCommand cmd, MySqlConnection con, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdPrams)
{
//判断数据连接状态是否是打开状态
if (con.State != ConnectionState.Open)
con.Open();
//给执行命令语句的对象添加数据库连接对象
cmd.Connection = con;
//给执行命令语句的对象添加命令文本
cmd.CommandText = cmdText;
//给执行命令语句的对象添加命令类型
cmd.CommandType = cmdType;
//判断事物是否为空
if (trans != null)
cmd.Transaction = null;
//判断执行命令的参数是否为空
if (cmdPrams != null)
{
foreach (MySqlParameter parameter in cmdPrams)
{
//将参数添加到执行命令语句的对象的参数集合中
cmd.Parameters.Add(parameter);
}
}
}
///
/// DataSet数据转为IList集合
///
/// 转换类型
/// 数据源
/// 需要转换表的索引
///
public static IList DataSetToList(DataSet dataSet, int tableIndex)
{
//确认参数是否有效
if (dataSet == null || dataSet.Tables.Count <= 0 || tableIndex < 0)
return null;
//声明DataTable对象,通过索引来获取数据集DataSet中指定表
DataTable dt = dataSet.Tables[tableIndex];
//声明用于返回的集合对象
IList list = new List();
//遍历datatable中每一行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
//创建泛型对象
T _t = Activator.CreateInstance();
//获取对象所有属性
PropertyInfo[] propertyInfo = _t.GetType().GetProperties();
for (int j = 0; j < dt.Columns.Count; j++)
{
foreach (PropertyInfo info in propertyInfo)
{
//属性名称和列名称相同时赋值
if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
{
//判断是否为空
if (dt.Rows[i][j] != DBNull.Value)
{
//不为空设置当前列值
info.SetValue(_t, dt.Rows[i][j], null);
}
else
{
//为空,设为null
info.SetValue(_t, null, null);
}
break;
}
}
}
list.Add(_t);
}
return list;
}
}