目录
一、前期准备
二、ExecuteNonQuery()
三、ExecuteScalar()
四、ExecuteReader()
五、MySqlDataReader_读数据流的使用
例程一、List应用
例程二、DataTable应用
涉及知识点: C#对MySQL 小数据的增删改查
1、配置App.config文件 -- 若文件未找到,则 Ctrl+Shift+A --> 添加 " 应用程序配置文件 "
2、导入Nuget包
3、引入using
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
4、创建MySQL 数据表
create table tb_student_information
(
id int,
name varchar(10),
no int
);
概念:
sql语句执行,并返回受影响的行数 — 适用:插入、修改、删除 – 不适用:查询
int count = cmd.ExecuteNonQuery();
修改前数据库数据:
internal class Program
{
static void Main(string[] args)
{
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (MySqlConnection connect = new MySqlConnection(connStr))
{
string sql = "insert into tb_student_information(id,name,no) values (1,'小黄',20);";
MySqlCommand cmd = new MySqlCommand(sql, connect);
connect.Open();
//sql语句执行,并返回受影响的行数 --- 适用:插入、修改、删除 -- 不适用:查询
int count = cmd.ExecuteNonQuery();
Console.WriteLine(count);
connect.Close();
}
Console.WriteLine("Hello World!");
}
}
结果:
概念:
//sql语句执行,并返回第一行的第一列数据— 适用:查询一条数据
object obj = cmd.ExecuteScalar();
修改前数据库数据:
internal class Program
{
static void Main(string[] args)
{
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (MySqlConnection connect = new MySqlConnection(connStr))
{
string sql = "select * from tb_student_information;";
MySqlCommand cmd = new MySqlCommand(sql, connect);
connect.Open();
//sql语句执行,并返回第一行的第一列数据--- 适用:查询一条数据
object obj = cmd.ExecuteScalar();
Console.WriteLine(obj.ToString());
connect.Close();
}
Console.WriteLine("Hello World!");
}
}
结果:
概念:
sql语句执行,并返回读数据流 --- 适用: 查询小量数据
connect连接使用原则:最晚打开,最早关闭
注:用于大量数据时,会卡在这很长时间,故大量数据时不推荐使用
读取中需一直处于打开状态
CommandBehavior.CloseConnection — dr.Close() / connect.Close() 两个用其一即可
MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
修改前数据库数据:
insert into tb_student_information
values (2,'小白',25),
(3,'小红',30),
(4,'小兰',35);
internal class Program
{
static void Main(string[] args)
{
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (MySqlConnection connect = new MySqlConnection(connStr))
{
string sql = "select * from tb_student_information;";
MySqlCommand cmd = new MySqlCommand(sql, connect);
connect.Open();
MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (dr.Read())
{
Console.WriteLine(dr[0].ToString() + " "
+ dr[1].ToString() + " "
+ dr[2].ToString());
}
}
Console.WriteLine("Hello World!");
}
}
结果:
特点: 只读,遍历访问每一行数据的数据流,向一个方向,一行一行的
缺点: 不灵活,只适合数据小的情况,读取数据,一直占用连接
读取方式:Read()获取第一行的数据,再次调用Read()方法获取下一行,当调用Read()方法返回false时,就表示不再有有效数据行
创建方式: 不能直接构造, cmd.ExecuteReader()来创建
注意:
1、连接对象一直保持Open状态,不用时需要Close()关闭,不然会一直占用连接
2、cmd.ExecuteReader(CommandBehaviour.CloseConnection) -- 好处: 关闭reader对象时,就会自动关闭连接。
3、类型一一对应,尽量减少类型转换
4、在没有读取到末尾就结束read(),需先调用cmd.Cancel(),然后再调用reader.Close();
5、cmd.ExecuteReader()获取存储过程的返回值或输出参数,先调用reader.Close(),然后才能获取参数的值
常用属性:
Connection: 获取与Reader对象相关的MySqlConnection
FiedCount: 当前行中的列数
HasRows: reader是否包含一行还是多行
IsClosed: reader状态是否关闭
Item[int]: 获取指定列的值 dr[2]
Item[String]: 获取指定列的值 dr["id"]
常用方法:
Close() 关闭dr
GetInt32(列序号) -- 根据数据类型获取相匹配的方法
GetFieldType(i) -- 获取数据的类型
GetName(列序号) -- 获取指定列的列名
GetOrdinal(列号) -- 获取指定列名的列序号
Read() -- 使dr前进到下一条记录
NextResult() -- 使dr前进到下一个记录
DataTable dt = new DataTable();
dt.Load(dr); -- 加载到表格
修改前数据库数据:
internal class Program
{
static void Main(string[] args)
{
//获取外部文件字符串
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
string sql = "select tb.id,tb.name,tb.no from tb_student_information as tb;";
using (MySqlConnection connect = new MySqlConnection(connStr))
{
MySqlCommand cmd = new MySqlCommand(sql, connect);
connect.Open();
MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
List list = new List();
if (dr.HasRows) //若有值
{
int indexId = dr.GetOrdinal("id"); //根据列名获取下标
string indexName = dr.GetName(1); //根据下标获取列名
int indexNo = dr.GetOrdinal("no");
while (dr.Read())
{
Student student = new Student();
student.Id = dr.GetInt32(indexId); //获取id的值避免类型转换
student.Name = dr.GetString(indexName);
student.No = dr.GetInt32(indexNo);
list.Add(student);
}
}
foreach (Student item in list) //遍历显示
{
Console.WriteLine($"id:{item.Id} name:{item.Name} no:{item.No}");
}
}
Console.WriteLine("Hello World!");
}
}
internal class Student
{
public int Id { set; get; }
public string Name { set; get; }
public int No { set; get; }
}
结果:
修改前数据库数据:
internal class Program
{
static void Main(string[] args)
{
//获取外部文件字符串
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
string sql = "select tb.id,tb.name,tb.no from tb_student_information as tb;";
using (MySqlConnection connect = new MySqlConnection(connStr))
{
MySqlCommand cmd = new MySqlCommand(sql, connect);
connect.Open();
MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
DataTable dt = new DataTable();
int indexId = dr.GetOrdinal("id"); //根据列名获取下标
string indexName = dr.GetName(1); //根据下标获取列名
int indexNo = dr.GetOrdinal("no");
if (dr.HasRows) //若有值
{
dt.Load(dr);
}
connect.Close();
foreach (DataRow row in dt.Rows) //遍历显示
{
Console.WriteLine($"id:{row[indexId]} name:{row[indexName]} no:{row[indexNo]}");
}
}
Console.WriteLine("Hello World!");
}
}
结果:
如有错误,烦请批评指正