C# (江湖小新)- 连接Mysql数据库
作者:mmseoamin日期:2023-12-18

依赖插件

MySql.Data安装 

  • 使用之前需要先在 vs中安装MySql.Data 插件,本文采用 Nuget 方式安装 ,步骤如下:

    • 选中项目右键——》管理Nuget程序包 

    • 输入 MySql.Data ,搜索安装即可

    C# (江湖小新)- 连接Mysql数据库,第1张

    连接数据库的基本对象介绍

    • MySqlConnection: 数据库连接对象
    • MySqlCommand: sql语句执行对象
    • MySqlDataReader:包含sql语句执⾏的结果,并提供⼀个⽅法从结果中阅读⼀⾏
    • MySqlTransaction: sql事务管理对象
    • MySqlException:  报错时返回的Exception。
    • MySqlCommandBuilder:自动生成命令,该命令用于MySQL数据库协调对数据集所做的更改
    • MySqlDataAdapter: 表示一组数据命令和数据库连接,用于填充数据集和更新MySQL数据库
    • MySqlHelper:提供帮助的工具类  

      sql执行方法

      • ExcuteNonQuery:执行【insert(增)】、【updata(改)】、【delete(删)】语句
      • ExcuteReader:执行多行查询,返回DataReader对象
      • ExcuteScalar:执行单行查询,返回查询结果的首行数据

        DataTable和DataSet 容器

        • 可以把DataTable和DataSet看做是数据容器,比如你查询数据库后得到一些结果,可以放到这种容器里
        • DataSet 可以比作一个内存中的数据库
        • DataTable 是一个内存中的数据表
        • DataSet 里可以存储多个DataTable
        • 数据结果 直接放到 dataTable中
          • DataTable dt = new DataTable();
            MySqlDataAdapter DataAdapter = new MySqlDataAdapter(sql, conn);
            // 将数据填充到dataTable中
            DataAdapter.Fill(dt);
        • 数据结果 直接放到 dateSet 中
          • DataSet ds = new DataSet();
            MySqlDataAdapter DataAdapter = new MySqlDataAdapter(sql, conn);
            // 将数据填充到dataSet中
            DataAdapter.Fill(ds);
        • 数据结果放到dataset中,若要用那个datatable,可以这样:dataset[0]  
          • DataSet ds = new DataSet();
            MySqlDataAdapter DataAdapter = new MySqlDataAdapter(sql, conn);
            // 将数据填充到dataSet中
            DataAdapter.Fill(ds);
            DataTable td = ds.Tables[0]

          Mysql的增删改查(CRUD)

          创建Mysql连接

          • 方式一: 通过 MySqlConnectionStringBuilder  对象
            public MySqlConnection createConnect()
            {
            	// 数据连接的基本信息对象
            	MySqlConnectionStringBuilder scsb = new MySqlConnectionStringBuilder();
            	scsb.UserID = "root";
            	scsb.Server = "127.0.0.1";
            	scsb.Port = 3306;
            	scsb.Password = "123456";
            	scsb.Database = "account_center";
            	MySqlConnection mySqlConnection = new MySqlConnection(scsb.ConnectionString);
            	mySqlConnection.Open();
            	Console.WriteLine("数据库连接成功!");
            	return mySqlConnection;
            }
            • 方式二:直接通过字符串,然后new MySqlConnection

              public MySqlConnection createConnect2()
              {
              	// 数据连接的基本信息对象
              	string conStr = "server=127.0.0.1;database=account_center;username=root;password=123456;";
              	MySqlConnection mySqlConnection = new MySqlConnection(conStr);
              	mySqlConnection.Open();
              	return mySqlConnection;
              }

              MySqlDataAdapter 方式

              查询数据表数据(无参数)

              public void queryNoArg(MySqlConnection conn)
              {
              	string sql = "select * from user_test ";
              	DataTable dt = new DataTable();
              	try
              	{
              		MySqlDataAdapter DataAdapter = new MySqlDataAdapter(sql, conn);
              		// 将数据填充到dataTable中
              		DataAdapter.Fill(dt);
              	}
              	catch (Exception ex)
              	{
              		Console.WriteLine(ex.Message);
              	}
              	finally
              	{
              		// 关闭连接
              		conn.Close();
              	}
              	// 打印表数据
              	printData(dt);
              }

              打印数据方法

              public void printData(DataTable dt)
              {
              	if (dt.Rows.Count < 0)
              	{
              		return;
              	}
              	//打印所有列名
              	string columnName = string.Empty;
              	for (int i = 0; i < dt.Columns.Count; i++)
              	{
              		columnName += dt.Columns[i].ColumnName + " | ";
              	}
              	Console.WriteLine(columnName);
              	Console.WriteLine("-------------------------");
              	//打印每一行的数据
              	foreach (DataRow row in dt.Rows)
              	{
              		string columnStr = string.Empty;
              		foreach (DataColumn column in dt.Columns)
              		{
              			columnStr += row[column] + " | ";
              		}
              		Console.WriteLine(columnStr);
              	}
              }

              输出结果

              name | age | create_date |
              -------------------------
              张三 | 12 | 2023/1/4 17:17:24 |
              李四 | 33 | 2023/1/4 17:17:24 |

              查询数据表数据(带参数)

              public void queryByArg(MySqlConnection conn)
              {
              	string sql = "select * from user_test where name=@p1 and age=@p2  ";
              	DataTable dt = new DataTable();
              	try
              	{
              		// 建立命令执行对象
              		MySqlCommand cmd = new MySqlCommand();
              		cmd.Connection = conn;
              		cmd.CommandText = sql;
              		// 设置命令的类型,普通的sql命令是字符串的用Text即可 ,如果是存储过程则用 CommandType.StoredProcedure
              		cmd.CommandType = CommandType.Text;
              		cmd.Parameters.AddWithValue("@p1", "张三");
              		cmd.Parameters.AddWithValue("@p2", 12);
              		MySqlDataAdapter DataAdapter = new MySqlDataAdapter(cmd);
              		// 将数据填充到dataTable中
              		DataAdapter.Fill(dt);
              		// 释放资源
              		DataAdapter.Dispose();
              	}
              	catch (Exception ex)
              	{
              		Console.WriteLine(ex.Message);
              	}
              	finally
              	{
              		// 关闭连接
              		conn.Close();
              	}
              	// 打印表数据
              	printData(dt);
              }

              输出结果

              name | age | create_date |
              -------------------------
              张三 | 12 | 2023/1/4 17:17:24 |

              MySqlDataReader 方式

              查询数据表数据

              public void ExecuteReader(MySqlConnection connection)
              {
              	string sql = "select * from user_test ";
              	MySqlCommand cmd = new MySqlCommand(sql, connection);
              	MySqlDataReader myReader = null;
              	try
              	{
              		myReader = cmd.ExecuteReader();
              		// 打印数据
              		printByReader(myReader);
              	}
              	catch (Exception e)
              	{
              		throw new Exception(e.Message);
              	}
              	finally
              	{
              		connection.Close();
              		cmd.Dispose();
              	}
              }

              打印数据方法

              public void printByReader(MySqlDataReader myReader)
              {
              	if (myReader==null)
              	{
              		return;
              	}
              	//打印所有列名
              	string columnName = string.Empty;
              	for (int i = 0; i < myReader.FieldCount; i++)
              	{
              		columnName += myReader.GetName(i) + " | ";
              	}
              	Console.WriteLine(columnName);
              	Console.WriteLine("-------------------------");
              	//打印每一行的数据
              	while (myReader.Read())
              	{
              		string columnStr = string.Empty;
              		for (int i = 0; i < myReader.FieldCount; i++)
              		{
              			columnStr += myReader[i].ToString() + " | ";
              		}
              		Console.WriteLine(columnStr);
              	}
              	// 释放资源
              	myReader.Close();
              }

              输出结果

              name | age | create_date |
              -------------------------
              张三 | 12 | 2023/1/4 17:17:24 |
              李四 | 33 | 2023/1/4 17:17:24 |

              修改表数据都用 ExecuteNonQuery() 方法

              ExecuteNonQuery()  适用于 添加、修改、删除 相关的sql操作

              public int updateData(MySqlConnection conn)
              {
              	// 添加数据
              	string addSql = "insert into user_test(name,age,create_date) values('王五',14,now())";
              	// 修改数据
              	string updateSql = "update user_test set age=55 where name='李四'";
              	// 删除数据
              	string delSql = "delete from user_test where name = '张三'";
              	MySqlCommand cmd = new MySqlCommand(addSql, conn);
              	try
              	{
              		int rows = cmd.ExecuteNonQuery();
              		return rows;
              	}
              	catch (Exception e)
              	{
              		conn.Close();
              		//throw e;
              		Console.WriteLine(e.Message);
              	}
              	finally
              	{
              		cmd.Dispose();
              		conn.Close();
              	}
              	return -1;
              }

              数据库事务(MySqlTransaction类)

              事务执行过程: 

              • 开启

              • 提交  -- 正常

              • 回滚  -- 出现问题

                事务管理 

                • BeginTransaction():开启事务, 只要未提交,期间执行的数据更新相关的操作都不会生效
                • transaction.Commit(): 提交事务,提交后,数据更新
                • transaction.Rollback():回滚事务,回滚后,之前执行的数据更新操作都将失效
                  public void TransactionTest(MySqlConnection conn)
                  {
                  	string sql = "insert into user_test(name,age,create_date) values('bbb',224,now())";
                  	// 开启事务
                  	MySqlTransaction transaction = conn.BeginTransaction();
                  	try
                  	{
                  		MySqlCommand cmd = new MySqlCommand(sql, conn);
                  		cmd.ExecuteNonQuery();
                  	}
                  	catch (Exception ex)
                  	{
                  		Console.WriteLine(ex.Message);
                          // 事务回滚
                  		transaction.Rollback();
                  		conn.Close();
                  	}
                  	finally
                  	{
                  		if (conn.State != ConnectionState.Closed)
                  		{
                  			//事务要么回滚要么提交,即Rollback()与Commit()只执行一个
                  			transaction.Commit();
                  			conn.Close();
                  		}
                  	}
                  }
                  // 更多**好看的内容**和**好玩的案例**请关注**我的微信公众号: 程序猿知秋**