最近受到一位高级开发工程师的指导和建议,决定开始写一些c#相关的东西到博客上,记录工作和学习中的问题,更多的是总结经验吧,希望也能给大家带来一些有用的东西。以下是c#与Mysql数据库帮助类连接的操作过程及简单实例:
环境准备:vs2017、MySQL数据库
MySQL链接:https://dev.mysql.com/downloads/installer/
引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作。
1、添加引用MySql.Data.dll。
(1)可以到官网下载动态库;
(2) vs项目中点击项目右键找到管理NuGet程序包,找到MySQL.Data,点击安装,安装完之后项目中可直接引用MySql.Data到命名空间。如下图:
2、添加一个MySqlHelper类来对MySql数据库进行访问和操作。
添加引用后在你的数据库操作类(MySqlHelper.cs)中添加引用声明
using MySql.Data;
using MySql.Data.MySqlClient;
MySqlHelper类:
public class MySqlHelper
{
//数据库连接字符串
public static string Conn = "Database=world;Data Source=127.0.0.1;User Id=root;Password=123456;pooling=false;CharSet=utf8;port=3306";
// 用于缓存参数的HASH表
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
///
/// 给定连接的数据库用假设参数执行一个sql命令(不返回数据集)
///
/// 一个有效的连接字符串
/// 命令类型(存储过程, 文本, 等等)
/// 存储过程名称或者sql命令语句
/// 执行命令所用参数的集合
/// 执行命令所影响的行数
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
MySqlCommand cmd = new MySqlCommand();
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}
///
/// 用现有的数据库连接执行一个sql命令(不返回数据集)
///
/// 一个现有的数据库连接
/// 命令类型(存储过程, 文本, 等等)
/// 存储过程名称或者sql命令语句
/// 执行命令所用参数的集合
/// 执行命令所影响的行数
public static int ExecuteNonQuery(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
///
///使用现有的SQL事务执行一个sql命令(不返回数据集)
///
///
///举例:
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
///
/// 一个现有的事务
/// 命令类型(存储过程, 文本, 等等)
/// 存储过程名称或者sql命令语句
/// 执行命令所用参数的集合
/// 执行命令所影响的行数
public static int ExecuteNonQuery(MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
///
/// 用执行的数据库连接执行一个返回数据集的sql命令
///
///
/// 举例:
/// MySqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
///
/// 一个有效的连接字符串
/// 命令类型(存储过程, 文本, 等等)
/// 存储过程名称或者sql命令语句
/// 执行命令所用参数的集合
/// 包含结果的读取器
public static MySqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, 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 方法
MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
//清除参数
cmd.Parameters.Clear();
return reader;
}
catch
{
//关闭连接,抛出异常
conn.Close();
throw;
}
}
///
/// 返回DataSet
///
/// 一个有效的连接字符串
/// 命令类型(存储过程, 文本, 等等)
/// 存储过程名称或者sql命令语句
/// 执行命令所用参数的集合
///
public static DataSet GetDataSet(string connectionString, CommandType cmdType, string cmdText, 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);
//调用 MySqlCommand 的 ExecuteReader 方法
MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter.SelectCommand = cmd;
DataSet ds = new DataSet();
adapter.Fill(ds);
//清除参数
cmd.Parameters.Clear();
conn.Close();
return ds;
}
catch (Exception e)
{
throw e;
}
}
///
/// 用指定的数据库连接字符串执行一个命令并返回一个数据集的第一列
///
///
///例如:
/// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
///
///一个有效的连接字符串
/// 命令类型(存储过程, 文本, 等等)
/// 存储过程名称或者sql命令语句
/// 执行命令所用参数的集合
/// 用 Convert.To{Type}把类型转换为想要的
public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
MySqlCommand cmd = new MySqlCommand();
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
}
///
/// 用指定的数据库连接执行一个命令并返回一个数据集的第一列
///
///
/// 例如:
/// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
///
/// 一个存在的数据库连接
/// 命令类型(存储过程, 文本, 等等)
/// 存储过程名称或者sql命令语句
/// 执行命令所用参数的集合
/// 用 Convert.To{Type}把类型转换为想要的
public static object ExecuteScalar(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
///
/// 将参数集合添加到缓存
///
/// 添加到缓存的变量
/// 一个将要添加到缓存的sql参数集合
public static void CacheParameters(string cacheKey, params MySqlParameter[] commandParameters)
{
parmCache[cacheKey] = commandParameters;
}
///
/// 找回缓存参数集合
///
/// 用于找回参数的关键字
/// 缓存的参数集合
public static MySqlParameter[] GetCachedParameters(string cacheKey)
{
MySqlParameter[] cachedParms = (MySqlParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
MySqlParameter[] clonedParms = new MySqlParameter[cachedParms.Length];
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms[i] = (MySqlParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
///
/// 准备执行一个命令
///
/// sql命令
/// OleDb连接
/// OleDb事务
/// 命令类型例如 存储过程或者文本
/// 命令文本,例如:Select * from Products
/// 执行命令的参数
private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = cmdType;
if (cmdParms != null)
{
foreach (MySqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
}
以上是MySQLHelp类的相关代码,网上有很多例子,直接引用过来就可以,也可以根据需要进行改编。
3、配置你的MYSQL数据库链接字符串如下:
//数据库连接字符串
public static string Conn = "Database='数据库名';Data Source='数据库服务器地址';User Id='数据库用户名';Password='密码';charset='utf8';pooling=true";
例: string sqlStr = "Database=world;Data Source=127.0.0.1;User Id=root;Password=123456;pooling=false;CharSet=utf8;port=3306";
4、Mysql数据库中建表
如下,表格建立完成
5、以上步骤完成之后,即可调用MySQLHelp类里的方法对MySQL数据库进行操作,例:
dgv.DataSource=MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, "select * from wp_posts", null).Tables[0].DefaultView;
相关实例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string sqlStr = "Database=world;Data Source=127.0.0.1;User Id=root;Password=123456;pooling=false;CharSet=utf8;port=3306";
//查询按钮
private void btnQuery_Click(object sender, EventArgs e)
{
String sql;
string name = txtUserName.Text;
if (name.Equals(""))
{
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, "select * from world.ss", null).Tables[0].DefaultView;
}
else
{
sql = String.Format("select * from world.ss where Name='{0}'and Dtime between '{1}' and '{2}'", name, dtp_Start.Value.ToString("yyyy-MM-dd HH:mm:ss"), dtp_End.Value.ToString("yyyy-MM-dd HH:mm:ss"));
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;
}
if (radioButton1.Checked && name.Equals(""))
{
if (name.Equals(""))
{
sql = String.Format("select * from world.ss where Dtime between '{0}' and '{1}' and Type='中国'", dtp_Start.Value.ToString("yyyy-MM-dd HH:mm:ss"), dtp_End.Value.ToString("yyyy-MM-dd HH:mm:ss"));
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;
}
else
{
sql = String.Format("select * from world.ss where Name='{0}' and Dtime between '{1}' and '{2}' and Type='中国'",name, dtp_Start.Value.ToString("yyyy-MM-dd HH:mm:ss"), dtp_End.Value.ToString("yyyy-MM-dd HH:mm:ss"));
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;
}
}
if (radioButton2.Checked && name.Equals(""))
{
if (name.Equals(""))
{
sql = String.Format("select * from world.ss where Dtime between '{0}' and '{1}' and Type='国外'", dtp_Start.Value.ToString("yyyy-MM-dd HH:mm:ss"), dtp_End.Value.ToString("yyyy-MM-dd HH:mm:ss"));
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;
}
else
{
sql = String.Format("select * from world.ss where Name='{0}' and Dtime between '{1}' and '{2}' and Type='国外'", name, dtp_Start.Value.ToString("yyyy-MM-dd HH:mm:ss"), dtp_End.Value.ToString("yyyy-MM-dd HH:mm:ss"));
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;
}
}
if (radioButton3.Checked)
{
if (name.Equals(""))
{
sql = String.Format("select * from world.ss where Dtime between '{0}' and '{1}'", dtp_Start.Value.ToString("yyyy-MM-dd HH:mm:ss"), dtp_End.Value.ToString("yyyy-MM-dd HH:mm:ss"));
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;
}
else
{
sql = String.Format("select * from world.ss where Name='{0}' and Dtime between '{1}' and '{2}'", name, dtp_Start.Value.ToString("yyyy-MM-dd HH:mm:ss"), dtp_End.Value.ToString("yyyy-MM-dd HH:mm:ss"));
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;
}
}
}
//添加按钮
private void btnInsert_Click(object sender, EventArgs e)
{
string User = textBox1.Text;
string PWD = textBox2.Text;
MySqlConnection conn = new MySqlConnection(sqlStr);
MySqlCommand cmd;
conn.Open();
try
{
cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO world.ss(id,Name,pwd,Dtime,Type) VALUES(@id,@Name,@pwd,@Dtime,@Type)";
cmd.Parameters.AddWithValue("@id", int.Parse(textBox3.Text));
cmd.Parameters.AddWithValue("@Name", User);
cmd.Parameters.AddWithValue("@pwd", PWD);
cmd.Parameters.AddWithValue("Dtime", DateTime.Now);
cmd.Parameters.AddWithValue("Type", comboBox1.Text);
cmd.ExecuteNonQuery();
}
catch (Exception)
{
throw;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
dgv_HistoryData.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, "select * from world.ss", null).Tables[0].DefaultView;
}
}
}
}
上述代码实现简单功能为:可通过连接mysql查询数据库中的表和添加数据到表,可多条件查询,通过时间查询、关键字查询、类型查询。
实现功能图如下: