C#链接mysql基本操作的多线程实现
先来看看如何链接mysql,需要⽤到mysql.Data.dll 这个dll不是⾃带的,⾃⾏搜索下载。
MySqlConnection conn = new MySqlConnection(connectionString);//使⽤MySqlConnection类来链接mysql;
connectionString 的格式是
server=mysqlhost;port=mysqlport;user=mysqlusername;password=mysqlpassword;database=databasename;
链接问题解决了,接下来分析数据库操作⾏为
数据库操作⾏为⽆⾮就是两种(我只⽤到两种,应该还有别的),第⼀种是执⾏sql语句,第⼆种是执⾏存储过程。
先来看看执⾏sql语句
执⾏sql语句⼜分为查询类和⾮查询类,查询类需要返回结果,⾮查询类不需要返回结果
先来看看⾮查询类的
string sqlstr = "insert into testtable values('a',1)";
MySqlCommand cmd = new MySqlCommand(sql, conn);//conn是数据库链接
cmd.CommandType = CommandType.Text; //说明执⾏的是sql语句
if (cmd.Connection.State == ConnectionState.Closed) //如果连接已关闭就打开连接
cmd.Connection.Open();
cmd.ExecuteNonQuery();  //去执⾏sql语句
接着在来看看查询类的
string sqlstr = "select * from testtable";
MySqlCommand cmd = new MySqlCommand(sql, conn);//conn是数据库链接
cmd.CommandType = CommandType.Text; //说明执⾏的是sql语句
if (cmd.Connection.State == ConnectionState.Closed) //如果连接已关闭就打开连接
cmd.Connection.Open();
MySqlDataAdapter sda = new MySqlDataAdapter();
DataSet ds = new DataSet();
sda.SelectCommand = cmd;
sda.Fill(ds);
sda.Dispose(); //⼀定要关闭,不然下次执⾏报错;
查询到的所有数据库表在 DataSet。
注意查询类与⾮查询的执⾏的区别
⾮查询类调⽤ MySqlCommand.ExecuteNonQuery()。执⾏sql语句
查询类调⽤ MySqlDataAdapter.Fill(DataSet)。执⾏Sql语句
再来看看执⾏存储过程
MySqlCommand cmd = new MySqlCommand(procedure, conn);//procedure 是存储过程名字 conn是数据库链接
cmd.CommandType = System.Data.CommandType.StoredProcedure; //设置存储过程模式
//添加存储过程参数
MySqlParameter param = cmd.Parameters.Add(paramName,type); //paramName 是参数名,type是参数类型 MySqlDbType枚举类型param.Value = value; //设置参数值, 注意不能传递 Null,如果是null值需要使⽤ DBNull.Value传递
param.Direction = pd; //参数种类 ParameterDirection枚举,表⽰是输⼊参数、输出参数、输⼊输出参数。默认是输⼊参数。
if (cmd.Connection.State == ConnectionState.Closed) //如果连接已关闭就打开连接
cmd.Connection.Open();
//执⾏存储过程
//如果需要使⽤到存储过程中Select 的值,
//也就是上⾯所说的查询类就使⽤MySqlDataAdapter.FiIl()执⾏。
//如果⾮查询类使⽤MySqlCommand.ExecuteNonQuery() 执⾏.
cmd.ExecuteNonQuery();
存储过程的输出参数值使⽤cmd.Parameters[“参数名”].Value 来获取,
现在数据库的操作都解决了。再分析下如何在多线程中使⽤数据库。
只要每个线程调⽤数据库时不使⽤共同的资源就不会出问题。
也就是说同⼀时刻不能两个线程持有同⼀个链接。
⽤⼀个连接池来管理链接即可解决此问题。
下⾯是我的完整代码:
先是对查询键做⼀层包装
/// <summary>
/
// 存储过程查询键
/// </summary>
public class SqlProdureParameter {
/*
public SqlCommand sqlcommand {
get;
private set;
}
*/
public MySqlCommand mysqlcommand {
get;
private set;
}
private SqlProdureParameter() { }
internal SqlProdureParameter(SqlCommand sqlcommand) {
this.sqlcommand = sqlcommand;
}
/*
internal SqlProdureParameter(MySqlCommand mysqlcommand) {            sqlcommand = mysqlcommand;
}
*/
/// <summary>
/// 释放
/// </summary>
internal void Dispose() {
sqlcommand = null;
}
}
配置类
所见即所得html编辑器* 由SharpDevelop创建。
* ⽤户: Administratorpython编程画圆入门
* ⽇期: 2019-03-21
* 时间: 10:10
*excel做系统教程
* 要改变这种模板请点击⼯具|选项|代码编写|编辑标准头⽂件 */
using System;
sql的中文含义是using System.Net;
namespace MrWu.DB
{
/// <summary>
/// sql 配置
/// </summary>
public class SqlConfig
{
/
// <summary>
///
/// </summary>
public IPAddress host;
/// <summary>
/// 端⼝
/// </summary>
public int port;
/// <summary>
/// ⽤户名
/// </summary>
public string username;
/// <summary>
/// 密码
/// </summary>
public string pwd;
/// <summary>
/// 缓存链接数量
/// </summary>
instruct in
public int cacheCount = 10;
}
}
主要实现代码
/*
* 由SharpDevelop创建。
* ⽤户: Administrator
* ⽇期: 2019-03-21
* 时间: 10:07
*
* 要改变这种模板请点击⼯具|选项|代码编写|编辑标准头⽂件 */
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text;
namespace MrWu.DB
/// <summary>
/// sqlServer 操作
/// </summary>
public class MMSQL
{
/// <summary>
/
// 链接池
/// </summary>
private class ConnectionPool{
/// <summary>
/// 链接字符串
/// </summary>
private readonly string connstr;
/// <summary>
/// 缓存链接数量
/// </summary>
private readonly int itemCount;
/
// <summary>
/// 所有的链接
/// </summary>
private readonly ConcurrentQueue<SqlConnection> conns = new ConcurrentQueue<SqlConnection>();
public ConnectionPool(SqlConfig config){
this.itemCount = config.cacheCount;
/// <returns></returns>
public SqlConnection GetConnection(string dbbase){
SqlConnection conn;
if (conns.TryDequeue(out conn)) {
if(conn.State == ConnectionState.Closed)
conn.Open();
try{
conn.ChangeDatabase(dbbase);
//这⾥有可能被数据库主动关闭,客户端根本不知道,执⾏将会报错!不应该存储链接,⽤完即放⼊连接池,不然应⽤的时候也可能会报错,被服务器主动断开
}catch{
conn = null;
}
if(conn != null)
return conn;
}
Console.WriteLine("创建⼀链接!" + conns.Count);
return new str + dbbase);
}
/// <summary>
/// 放⼊⼀个连接
/
// </summary>
/// <param name="conn"></param>
public void Push(SqlConnection conn) {
mysql查看所有存储过程Task.Factory.StartNew(
() => {
if (conns.Count < itemCount) {
//Console.WriteLine("放⼊⼀个连接Begin");
conns.Enqueue(conn); //好像不会阻塞,Task可能是多余的,
//Console.WriteLine("放⼊⼀个链接!");
} else
conn.Dispose();
}
);
}
}
/*
* 1.执⾏sql语句获得执⾏sql语句后的结果
* 2.执⾏存储过程获得存储过程的结果
*
* 每个库都有⼀个链接
*
* */
private ConnectionPool ConnPool = null;
/// <summary>
/// 初始化
/// </summary>
/// <param name="config"></param>
public MMSQL(SqlConfig config){
this.ConnPool = new ConnectionPool(config);
}
/// <summary>
/// 开始存储过程
/// </summary>
/
// <param name="dbbase">存储过程所在的数据库</param>
/// <param name="procedure">存储过程名</param>
/// <returns></returns>
public SqlProdureParameter BeginProcedure(string dbbase,string procedure){
if(ConnPool == null)
throw new Exception("you dont hava init");
SqlCommand cmd = new SqlCommand(procedure, ConnPool.GetConnection(dbbase));
SqlProdureParameter result = new SqlProdureParameter(cmd);
//存储过程模式
cmd.CommandType = System.Data.CommandType.StoredProcedure;
return result;
}
/// <summary>
/// 添加参数
/// </summary>
/// <param name="spp">存储过程查询键</param>
/// <param name="paramName">参数名</param>
/// <param name="value">参数值</param>
/// <param name="type">参数类型</param>
/// <param name="PD">参数种类</param>
public void AddParam(SqlProdureParameter spp,string paramName,object value,SqlDbType type,ParameterDirection pd = ParameterDirection.Input){  if(spp == null || spp.sqlcommand == null)
throw new Exception("param spp null");
SqlParameter param = spp.sqlcommand.Parameters.Add(paramName,type);
param.Direction = pd;
if (value == null)
param.Value = DBNull.Value;
else
param.Value = value;
}
/// <summary>
/// 提交存储过程

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。