连接数据库、操作数据库,本质是利用数据库提供的动态链接库MySql.Data.dll进行操作。MySql.Data.dll提供以下8个类:
- MySqlConnection: 连接MySQL服务器数据库。
- MySqlCommand:执行一条sql语句。
- MySqlDataReader: 包含sql语句执行的结果,并提供一个方法从结果中阅读一行,需要循环对结果进行处理。
- MySqlTransaction: 数据库事务操作。
- MySqlException: MySQL报错时返回的Exception。
- MySqlCommandBuilder: 自动生成单表命令,用于将对数据集所做的更改与关联的MySQL数据库进行协调。
- MySqlDataAdapter: 表示用于填充数据集和更新MySQL数据库的一组数据命令和数据库连接。
- MySqlHelper: 帮助器类,使它更易于与提供程序一起工作。
1.添加动态链接库文件
方法一:Visual Studio,在 项目(右键)-管理NuGet程序包(N) 然后在浏览里面搜索MySql.Data并进行安装
选择后根据提示安装即可。
方法二:手工添加 MySql.Data.dll引用。 MySql.Data.dll可以自行在网上下载,添加方法:
安装完成后:
配置完成后下面就可以开始链接数据库了。
链接字符串:
//链接字符串
public static String connetStr = "server=127.0.0.1;port=3306;user=root;password=root; database=test;";
数据库链接建立:
public MySqlConnection SqlConn = new MySqlConnection(connetStr);
/****
* 开启数据库链接
*
*/
public void DBConnection()
{
//确认是否已打开连接,为打开则打开连接
if (this.SqlConn.State != ConnectionState.Open)
{
try
{
SqlConn.Open();
}catch(Exception e)
{
}
}
}
数据库关闭:
/// <summary>
/// 关闭数据库连接
/// </summary>
public void DBClose()
{
//确认是否已打开连接,为打开则打开连接
if (this.SqlConn.State == ConnectionState.Open)
{
SqlConn.Close();
}
}
数据库查询操作:
/// <summary>
/// 获得查询结果 返回DataTable
/// </summary>
/// <param name="sqlstr">SQL字符串</param>
/// <returns></returns>
public DataTable QuerySql(string sql)
{
DataTable dt = new DataTable();
MySqlDataAdapter mysqlData = new MySqlDataAdapter(sql,SqlConn);
mysqlData.Fill(dt);
return dt;
}
/// <summary>
/// 获得查询结果 返回字符串
/// </summary>
/// <param name="sqlstr">SQL字符串</param>
/// <returns></returns>
public string QueryForString(string sql)
{
MySqlCommand cmd = new MySqlCommand(sql, SqlConn);
//执行查询,并返回查询结果集中第一行的第一列。所有其他的列和行将被忽略。select语句无记录返回时,ExecuteScalar()返回NULL值
Object result = cmd.ExecuteScalar();
return result.ToString();
}
/// <summary>
/// 获得查询结果 返回int
/// </summary>
/// <param name="sqlstr">SQL字符串</param>
/// <returns></returns>
public int QueryForInt(string sql)
{
MySqlCommand cmd = new MySqlCommand(sql, SqlConn);
//执行查询,并返回查询结果集中第一行的第一列。所有其他的列和行将被忽略。select语句无记录返回时,ExecuteScalar()返回NULL值
Object result = cmd.ExecuteScalar();
int count = 0;
if (result != null)
{
count = int.Parse(result.ToString());
}
return count;
}
数据库ddl操作及事务处理:
/// <summary>
/// 操作数据库(无返回值) 单条sql执行
/// </summary>
/// <param name="sqlstr">操作SQL字符串</param>
public bool ExecuteNonQuerySQL(string sql)
{
Boolean flag = false;
try
{
//确认是否已打开连接,为打开则打开连接
DBConnection();
MySqlCommand sqlcommand = new MySqlCommand(sql, SqlConn);
sqlcommand.ExecuteNonQuery();
flag= true;
}
catch (SqlException ex)
{
//Console.WriteLine(ex.Message);
flag= false;
}
finally
{
DBClose();
}
return flag;
}
/// <summary>
/// 操作数据库(无返回值) 多条sql执行 引入事务概念
/// </summary>
/// <param name="sqlstr">操作SQL字符串</param>
public bool ExecuteNonQuerySQLBatch(List<string> sqlList)
{
//确认是否已打开连接,为打开则打开连接
DBConnection();
//事务必须在try外面赋值不然catch里的transaction会报错:未赋值
MySqlTransaction tran= SqlConn.BeginTransaction();
Boolean flag = false;
try
{
MySqlCommand sqlcommand = null;
for (int i=0;i<= sqlList.Count;i++)
{
sqlcommand = new MySqlCommand(sqlList[i], SqlConn);
sqlcommand.ExecuteNonQuery();
}
tran.Commit();
flag = true;
}
catch(Exception e)
{
tran.Rollback();
flag = false;
}
finally
{
//事务要么回滚要么提交,即Rollback()与Commit()只能执行一个
DBClose();
}
return flag;
}
完整代码如下:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
namespace Restful.db
{
class MySqlHelper
{
//链接字符串
public static String connetStr = "server=127.0.0.1;port=3306;user=root;password=root; database=test;";
//数据库链接
public MySqlConnection SqlConn = new MySqlConnection(connetStr);
public MySqlHelper()
{
DBConnection();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(true);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
return;
}
if (SqlConn != null)
{
SqlConn.Dispose();
SqlConn = null;
}
}
/****
* 开启数据库链接
*
*/
public void DBConnection()
{
//确认是否已打开连接,为打开则打开连接
if (this.SqlConn.State != ConnectionState.Open)
{
try
{
SqlConn.Open();
}catch(Exception e)
{
}
}
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void DBClose()
{
//确认是否已打开连接,为打开则打开连接
if (this.SqlConn.State == ConnectionState.Open)
{
SqlConn.Close();
}
}
/// <summary>
/// 获得查询结果 返回DataTable
/// </summary>
/// <param name="sqlstr">SQL字符串</param>
/// <returns></returns>
public DataTable QuerySql(string sql)
{
DataTable dt = new DataTable();
MySqlDataAdapter mysqlData = new MySqlDataAdapter(sql,SqlConn);
mysqlData.Fill(dt);
return dt;
}
/// <summary>
/// 获得查询结果 返回字符串
/// </summary>
/// <param name="sqlstr">SQL字符串</param>
/// <returns></returns>
public string QueryForString(string sql)
{
MySqlCommand cmd = new MySqlCommand(sql, SqlConn);
//执行查询,并返回查询结果集中第一行的第一列。所有其他的列和行将被忽略。select语句无记录返回时,ExecuteScalar()返回NULL值
Object result = cmd.ExecuteScalar();
return result.ToString();
}
/// <summary>
/// 获得查询结果 返回int
/// </summary>
/// <param name="sqlstr">SQL字符串</param>
/// <returns></returns>
public int QueryForInt(string sql)
{
MySqlCommand cmd = new MySqlCommand(sql, SqlConn);
//执行查询,并返回查询结果集中第一行的第一列。所有其他的列和行将被忽略。select语句无记录返回时,ExecuteScalar()返回NULL值
Object result = cmd.ExecuteScalar();
int count = 0;
if (result != null)
{
count = int.Parse(result.ToString());
}
return count;
}
/// <summary>
/// 操作数据库(无返回值) 单条sql执行
/// </summary>
/// <param name="sqlstr">操作SQL字符串</param>
public bool ExecuteNonQuerySQL(string sql)
{
Boolean flag = false;
try
{
//确认是否已打开连接,为打开则打开连接
DBConnection();
MySqlCommand sqlcommand = new MySqlCommand(sql, SqlConn);
sqlcommand.ExecuteNonQuery();
flag= true;
}
catch (SqlException ex)
{
//Console.WriteLine(ex.Message);
flag= false;
}
finally
{
DBClose();
}
return flag;
}
/// <summary>
/// 操作数据库(无返回值) 多条sql执行 引入事务概念
/// </summary>
/// <param name="sqlstr">操作SQL字符串</param>
public bool ExecuteNonQuerySQLBatch(List<string> sqlList)
{
//确认是否已打开连接,为打开则打开连接
DBConnection();
//事务必须在try外面赋值不然catch里的transaction会报错:未赋值
MySqlTransaction tran= SqlConn.BeginTransaction();
Boolean flag = false;
try
{
MySqlCommand sqlcommand = null;
for (int i=0;i<= sqlList.Count;i++)
{
sqlcommand = new MySqlCommand(sqlList[i], SqlConn);
sqlcommand.ExecuteNonQuery();
}
tran.Commit();
flag = true;
}
catch(Exception e)
{
tran.Rollback();
flag = false;
}
finally
{
//事务要么回滚要么提交,即Rollback()与Commit()只能执行一个
DBClose();
}
return flag;
}
}
}
代码整理出来仅作为记录,欢迎大神提出改进意见!