ADO.NET
ADO.NET 是以 ODBC (Open Database Connectivity) 技术的方式来访问数据库的一种技术。
ADO.NET 中的常用命名空间如下表所示。
命名空间 | 数据提供程序 |
---|---|
System.Data.SqlClient | Microsoft SQL Server |
System.Data.Odbc | ODBC |
System.Data.OracleClient | Oracle |
System.Data.OleDb | OLE DB |
在使用 ADO.NET 进行数据库操作时通常会用到 5 个类,分别是 Connection 类、 Command 类、DataReader 类、DataAdapter 类、DataSet 类。
Connection :该类主要用于数据库中建立连接和断开连接的操作,并且能通过该类获取当前数据库连接的状态。
Command:该类主要对数据库执行增加、删除、修改以及查询的操作。
DataReader:该类用于读取从数据库中查询出来的数据,但在读取数据时仅能向前读不能向后读, 并且不能修改该类对象中的值。
DataAdapter:该类与 DataSet 联用,它主要用于将数据库的结果运送到 DataSet 中保存。
DataSet:该类与 DataReader 类似,都用于存放对数据库查询的结果。
其中DataSet的值可以重复多次读取,还可以通过更改 DataSet 中的值更改数据库中的值。DataSet 类中的值在数据库断开连接的情况下依然可以保留原来的值。
Connection
Connection 类根据要访问的数据和访问方式不同,使用的命名空间也不同,类名也稍有区别。
SqlConnection 类中提供的常用属性和方法如下表所示:
属性或方法 | 说明 |
---|---|
SqlConnection() | 无参构造方法 |
SqlConnection(string connectionstring) | 带参数的构造方法,数据库连接字符串作为参数 |
Connectionstring | 属性,获取或设置数据库的连接串 |
State | 属性,获取当前数据库的状态,由枚举类型 Connectionstate 为其提供值 |
ConnectionTimeout | 属性,获取在尝试连接时终止尝试并生成错误之前所等待的时间 |
DataSource | 属性,获取要连接的 SQL Server 的实例名 |
Open() | 方法,打开一个数据库连接 |
Close() | 方法,关闭数据库连接 |
BeginTransaction() | 方法,开始一个数据库事务 |
连接数据库
连接SQL Server
在使用 Connection 类连接 SQL Server 2014 时,先要编写数据库连接串。
第1种方式
server = 服务器名称 / 数据库的实例名 ; uid = 登录名 ; pwd = 密码 ; database = 数据库名称
其中:
- server:用于指定要访问数据库的数据库实例名,服务器名称可以换成 IP 地址或者数据库所在的计算机名称,如果访问的是本机数据库,则可以使用“.”来代替,如果使用的是默认的数据库实例名,则可以省略数据库实例名。例如连接的是本机的默认数据库,则可以写成“server = .”。
- uid:登录到指定 SQL Server 数据库实例的用户名,相当于以 SQL Server 身份验证方式登录数据库时使用的用户名,例如 sa 用户。
- pwd:与 uid 用户对应的密码。
- database:要访问数据库实例下的数据库名。
第2种方式
Data Source = 服务器名称 \ 数据库实例名 ; Initial Catalog = 数据库名称 ; User ID = 用户名 ; Password = 密码
其中:
- Data Source:与第1种连接串写法中的 server 属性的写法一样,用于指定数据库所在的服务器名称和数据库实例名,如果连接的是本机的默认数据库实例,则写成“Data Source=. ”的形式。
- Initial Catalog:与第 1 种连接串写法中的 database 属性的写法一样,用于指定在 Data Source 中数据库实例下的数据库名。
- User ID:与第 1 种连接串写法中的 uid 属性的写法一样,用于指定登录数据库的用户名。
- Password:与第 1 种连接串写法中的 pwd 属性的写法一样,用于指定 User ID 用户名所对应的密码。
此外,还可以在连接字符串中使用 Integrate Security = True 的属性,省略用户名和密码,即以 Windows 身份验证方式登录 SQL Server 数据库(不推荐)。
创建数据库连接示例:
class Program {
static void Main(string[] args) {
//编写数据库连接串
string connStr = "Data source=.;Initial Catalog=test;User ID=sa;Password=123456";
//创建SqlConnection的实例
SqlConnection conn = null;
try {
conn = new SqlConnection(connStr);
//打开数据库连接
conn.Open();
Console.WriteLine("数据库连接成功!");
}
catch (Exception ex) {
Console.WriteLine("数据库连接失败!" + ex.Message);
}finally {
if (conn != null) {
//关闭数据库连接
conn.Close();
}
}
}
}
如果要省略finally语句,可以使用using关键字释放资源:
class Program {
static void Main(string[] args) {
//编写数据库连接串
string connStr = "Data source=.;Initial Catalog=test;User ID=sa;Password=123456";
try {
using (SqlConnection connection = new SqlConnection(connStr)) {
connection.Open();
Console.WriteLine("数据库连接成功!");
}
} catch (Exception e) {
Console.WriteLine("数据库连接失败!" + e.Message);
}
}
}
连接MYSQL
在使用Mysql之前需要导入相应的驱动,在代码页里输入using Mysql.Data.MysqlClient。没有找到则搜索安装即可。
class Program {
static void Main(string[] args) {
String connetStr = "server=127.0.0.1;port=3306;user=root;password=123456; database=legendDb;";
try {
MySqlConnection connection = new MySqlConnection(connetStr);
connection.Open();
Console.WriteLine("连接数据库成功!");
}
catch (Exception e) {
Console.WriteLine("连接数据库失败!" + e.Message);
}
}
}
Command:操作数据库
操作数据库需则要用到 Command 类中提供的属性和方法。
在 System.Data.SqlClient 命名空间下,对应的 Command 类为 SqlCommand,在创建 SqlCommand 实例前必须已经创建了与数据库的连接。
SqlCommand 类中常用的构造方法如下表所示。
构造方法 | 说明 |
---|---|
SqlCommand() | 无参构造方法 |
SqlCommand(string commandText,SqlConnection conn) | 带参的构造方法,第 1 个参数是要执行的 SQL 语句,第 2 个参数是数据库的连接对象 |
对数据库中对象的操作不仅包括对数据表的操作,还包括对数据库、视图、存储过程等数据库对象的操作
在对不同数据库对象进行操作时,SqlCommand 类提供了不同的属性和方法,常用的属性和方法如下表所示:
属性或方法 | 说明 |
---|---|
CommandText | 属性,Command 对象中要执行的 SQL 语句 |
Connection | 属性,获取或设置数据库的连接对象 |
CommandType | 属性,获取或设置命令类型 |
Parameters | 属性,设置 Command 对象中 SQL 语句的参数 |
ExecuteReader() | 方法,获取执行查询语句的结果 |
ExecuteScalar() | 方法,返回查询结果中第 1 行第 1 列的值 |
ExecuteNonQuery() | 方法,执行对数据表的增加、删除、修改操作 |
操作数据库
Command 类中提供了 3 种命令类型,分别是 Text、TableDirect 以及 StoredProcedure,默认情况下是 Text。
Text 类型是指使用 SQL 语句的形式,包括增加、删除、修改以及查询的SQL语句。
TableDirect 仅在 OLE DB 驱动程序中有效。
StoredProcedure 用于执行存储过程。
下面是操作数据库的实例:
1、创建账号密码的数据库和表结构
create database legendDb;
use legenddb;
create table userinfo(
id int not null auto_increment primary key,
name varchar(10) not null,
password char(10) not null)comment = '用户表';
2、编写代码操作来保存账号和密码
class Program {
static void Main(string[] args) {
String connetStr = "server=127.0.0.1;port=3306;user=root;password=123456; database=legendDb;";
MySqlConnection connection = null;
try {
connection = new MySqlConnection(connetStr);
connection.Open();
Console.WriteLine("连接数据库成功!");
// 编写SQL语句,在userinfo表中插入用户名和密码
string sql = "insert into userinfo(name, password) values ('{0}', '{1}')";
// 填充SQL语句
sql = string.Format(sql, "legend", "123456");
// 创建SqlCommand对象
MySqlCommand cmd = new MySqlCommand(sql, connection);
// 执行SQL语句
int result = cmd.ExecuteNonQuery();
if (result != -1) {
Console.WriteLine("注册成功!");
} else {
Console.WriteLine("注册失败!");
}
} catch (Exception e) {
Console.WriteLine("连接数据库失败!" + e.Message);
} finally {
connection.Close();
}
}
}
3、编写登录功能,并保证用户名唯一。
class Program {
static void Main(string[] args) {
String connetStr = "server=127.0.0.1;port=3306;user=root;password=123456; database=legendDb;";
MySqlConnection connection = null;
try {
connection = new MySqlConnection(connetStr);
connection.Open();
Console.WriteLine("连接数据库成功!");
//判断用户名是否重复
string checkNameSql = "select count(*) from userinfo where name='{0}'";
checkNameSql = string.Format(checkNameSql, "legend");
// 创建SqlCommand对象
MySqlCommand command = new MySqlCommand(checkNameSql, connection);
// 执行SQL语句
long isRepeatName = (long) command.ExecuteScalar();
if (isRepeatName != 0l) {
Console.WriteLine("用户名已存在!");
}
string sql = "insert into userinfo(name,password) values('{0}','{1}')";
//填充SQL语句
sql = string.Format(sql, "legend", "123456");
//创建SqlCommand对象
MySqlCommand cmd = new MySqlCommand(sql, connection);
//执行SQL语句
int returnvalue = cmd.ExecuteNonQuery();
//判断SQL语句是否执行成功
if(returnvalue != -1) {
Console.WriteLine("注册成功!");
} else {
Console.WriteLine("注册失败");
}
}
catch (Exception e) {
Console.WriteLine("连接数据库失败!" + e.Message);
} finally {
connection.Close();
}
}
}
DataReader
DDataReader 类在 System.Data.SqlClient 命名空间中,对应的类是 SqlDataReader,主要用于读取表中的查询结果,并且是以只读方式读取的(即不能修改 DataReader 中存放的数据)。
正是由于 DataReader 类的特殊的读取方式,其访问数据的速度比较快,占用的服务器资源比较少。
SqlDataReader 类中常用的属性和方法如下表所示。
SqlDataReader 类中常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
FieldCount | 属性,获取当前行中的列数 |
HasRows | 属性,获取 DataReader 中是否包含数据 |
IsClosed | 属性,获取 DataReader 的状态是否为已经被关闭 |
Read | 方法,让 DataReader 对象前进到下一条记录 |
Close | 方法,关闭 DataReader 对象 |
Get XXX (int i) | 方法,获取指定列的值,其中XXX代表的是数据类型。例如获取当前行第1列 double 类型的值,获取方法为GetDouble(o) |
下面的实例是根据中文名搜索指定的用户名称信息:
class Program {
static void Main(string[] args) {
String connetStr = "server=127.0.0.1;port=3306;user=root;password=123456; database=legendDb;";
using (MySqlConnection connection = new MySqlConnection(connetStr)) {
try {
connection.Open();
string sql = "select * from userinfo where name = '{0}'";
sql = string.Format(sql, "legend");
MySqlCommand command = new MySqlCommand(sql, connection);
MySqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read()) {
Console.Write(dataReader["id"] + " ");
Console.Write(dataReader["name"] + " ");
Console.WriteLine(dataReader["password"]);
}
}
catch (Exception e) {
Console.WriteLine("查询失败:" + e.Message);
}
}
}
}
注意:DataReader的值只能读取一次,并且可以通过索引下标访问。
DataAdapter&DataSet
DataAdapter
DataAdapter 类用于将数据表中的数据查询出来并添加到 DataSet 中,DataAdapter 在 System.Data.SqlClient 命名空间下对应的类名是 SqlDataAdapter。
SqlDataAdapter 类的主要构造方法如下表所示。
构造方法 | 说明 |
---|---|
SqlDataAdapter(SqlCommand cmd) | 带参数的构造方法,传递 SqlCommand 类的对象作为参数 |
SqlDataAdapter(string sql, SqlConnection conn) | 带参数的构造方法,sql 参数是指定对数据表执行的 SQL 语句,conn 是数据库的连接对象 |
SqlDataAdapter() | 不带参数的构造方法 |
从 SqlDataAdapter 类的构造方法可以看出,SqlDataAdapter 类需要与 SqlCommand 类和 SqlConnection 类一起使用。
SqlDataAdapter 类常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
SelectCommand | 属性,设置 SqlDataAdapter 中要执行的查询语句 |
InsertCommand | 属性,设置 SqlDataAdapter 中要执行的添加语句 |
UpdateCommand | 属性,设置 SqlDataAdapter 中要执行的修改语句 |
DeleteCommand | 属性,设置 SqlDataAdapter 中要执行的删除语句 |
Fill(DataSet ds) | 方法,将 SqlDataAdapter 类中查询出的结果填充到 DataSet 对象中 |
Fill(DataTable dt) | 方法,将 SqlDataAdapter 类中查询出的结果填充到 DataTable 对象 中,DataTable是数据表对象,在一个DataSet对象中由多个 DataTable对象构成 |
Update(DataSet ds) | 方法,更新 DataSet 对象中的数据 |
Update(DataTable dt) | 方法,更新 DataTable 对象中的数据 |
DataSet 类是一种与数据库结构类似的数据集,每个 DataSet 都是由若干个数据表构成的,DataTable 即数据表,每个 DataTable 也都是由行和列构成的,行使用 DataRow 类表示、列使用 DataColumn 类表示。
DataSet
DataSet 类中的构造方法如下表所示。
构造方法 | 说明 |
---|---|
DataSet() | 无参构造方法 |
DataSet(string DataSetName) | 带参数的构造方法,DataSetName 参数用于指定数据集名称 |
DataSet 类中常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
Tables | 属性,获取 DataSet 中所有数据表的集合,Tables[0] 代表集合中的第一个数据表 |
CaseSensitive | 属性,获取或设置 DataSet 中的字符串是否区分大小写 |
Relations | 属性,获取 DataSet 中包含的关系集合 |
Clear() | 方法,清空 DataSet 中的数据 |
Copy() | 方法,复制 DataSet 中的数据 |
AcceptChanges() | 方法,更新 DataSet 中的数据 |
HasChanges() | 方法,获取 DataSet 中是否有数据发生变化 |
RejectChanges() | 方法,撤销对 DataSet 中数据的更改 |
DataTable
DataTable 作为 DataSet 中的重要对象,其与数据表的定义是类似的,都是由行和列构成,并有唯一的表名。
从 SqlDataAdapter 类的填充方法 (Fill) 中可以看出允许将数据直接填充到 DataTable 中,这样既能节省存储空间也能简化查找数据表中的数据。
DataTable 中常用的构造方法如下表所示。
构造方法 | 说明 |
---|---|
DataTable() | 无参构造方法 |
DataTable(string TableName) | 带参数的构造方法, TableName 参数用于指定数据表的名称 |
DataTable 与 DataSet 有很多相似的属性和方法,在下表中列出了一些与 DataSet 类不同的属性。
属性 | 说明 |
---|---|
TableName | 属性,获取或设置 DataTable 的名称 |
Columns | 属性,获取 DataTable 中列的集合 |
Rows | 属性,获取 DataTable 中行的集合 |
DataSet | 属性,获取 DataTable 所在的 DataSet |
Constraints | 属性,获取 DataTable 中的所有约束 |
在实际应用中,将查询结果存储到 DataSet 类或 DataTable 类中均可,在操作查询结果时也非常类似。
class Program {
static void Main(string[] args) {
String connetStr = "server=127.0.0.1;port=3306;user=root;password=123456; database=legendDb;";
using (MySqlConnection connection = new MySqlConnection(connetStr)) {
try {
connection.Open();
string sql = "select name from userinfo";
MySqlDataAdapter adapter = new MySqlDataAdapter(sql, connection);
DataSet dataSet = new DataSet();
//使用SQLDataAdapter对象sda将查询结果填充到Dataset对象ds中
adapter.Fill(dataSet);
//遍历所有的datatable
foreach (DataTable dataTable in dataSet.Tables) {
foreach (DataRow dataRow in dataTable.Rows) ///遍历所有的行
foreach (DataColumn dataColumn in dataTable.Columns) //遍历所有的列
Console.WriteLine("{0}, {1}, {2}", dataTable.TableName, dataColumn.ColumnName, dataRow[dataColumn]); //表名,列名,单元格数据
}
}
catch (Exception e) {
Console.WriteLine("查询失败:" + e.Message);
}
}
}
}
对于DataSet的迭代主要有如下几种方式:
//多表多行多列的情况,遍历所有的datatable
foreach (DataTable dt in dataSet.Tables) {
foreach (DataRow dr in dt.Rows) ///遍历所有的行
foreach (DataColumn dc in dt.Columns) //遍历所有的列
Console.WriteLine("{0}, {1}, {2}", dt.TableName, dc.ColumnName, dr[dc]); //表名,列名,单元格数据
}
//遍历一个表多行多列
foreach (DataRow mDr in dataSet.Tables[0].Rows) {
foreach (DataColumn mDc in dataSet.Tables[0].Columns) {
Console.WriteLine(mDr[mDc].ToString());
}
}
//遍历一个表多行一列
foreach (DataRow row in dataSet.Tables[0].Rows) {
Console.WriteLine(row[0].ToString());
}
//一行一列
ds.Tables[0].Rows[0]["字段"];
在Winform开发中,DataSet可以直接当做数据源设置给ListBox进行展示:
listBox1.DataSource = ds.Tables[0];
listBox1.DisplayMember = ds.Tables[0].Columns[0].ToString();
需要注意的是,ListBox 控件中的 DataSource 属性用于设置控件中内容的数据源,并需要通过 DisplayMember 属性来指定显示在 ListBox 控件中的内容。
在本实例中将 DataSet 对象换成 DataTable 对象,更改部分代码如下。
//创建 SqlDataAdapter 类的对象
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
//创建 DataTable 类的对象
DataTable dataTable = new DataTable();
//使用 SqlDataAdapter 对象 sda 将查询结果填充到 DataSet 对象 dt 中
sda.Fill(dataTable);
//设置 ListBox 控件的数据源(DataSource)属性
listBox1.DataSource = dataTable;
//在 ListBox 控件中显示 name 列的值
listBox1.DisplayMember = dataTable.Columns[0].ToStiring();
DataRow & DataColum
每个 DataSet 都是由多个 DataTable 构成的,更新 DataSet 中的数据实际上是通过更新 DataTable 来实现的。
每个 DataTable 对象都是由行 (DataRow) 和列 (DataColumn) 构成的,下面分别介绍 DataRow 类和 DataColumn 类的使用。
DataRow
DataRow 类代表数据表中的行,并允许通过该类直接对数据表进行添加、修改、删除行的操作。
DataRow 类中常用的属性和方法如下表所示。
属性或方法 | 说明 |
---|---|
Table | 属性,设置 DataRow 对象所创建 DataTable 的名称 |
RowState | 属性,获取当前行的状态 |
HasErrors | 属性,获取当前行是否存在错误 |
AcceptChanges() | 方法,更新 DataTable 中的值 |
RejectChanges() | 方法,撤销对 DataTable 中的值的更新 |
Delete() | 方法,标记当前的行被删除,并在执行 AcceptChanges 方法后更新数据表 |
在 DataRow 类中没有提供构造方法,需要通过 DataTable 中的 NewRow 方法创建 DataRow 类的对象,具体的语句如下。
DataTable dt = new DataTable();
DataRow dr = dt.NewRow();
dr 即为新添加的行,每行数据是由多列构成的,如果在 DataTable 对象中已经存在表结构,则直接使用dr[ 编号或列名 ]= 值
的形式即可为表中的列赋值。
DataColum
DataColumn 类是数据表中的列对象,与数据库中表的列定义一样,都可以为其设置列名以及数据类型。
DataColumn类中常用的构造方法如下表所示。
构造方法 | 说明 |
---|---|
DataColumn() | 无参构造方法 |
DataColumn(string columnName) | 带参数的构造方法,columnName 参数代表的是列名 |
DataColumn(string columnName,Type dataType) | 带参数的构造方法,columnName 参数代表的是列名,dataType 参数代表的是列的数据类型 |
DataColumn 类提供了一些属性对 DataColumn 对象进行设置,常用的属性如下表所示。
属性 | 说明 |
---|---|
ColumnName | 属性,设置 DataColumn 对象的列名 |
DataType | 属性,设置 DataColumn 对象的数据类型 |
MaxLength | 属性,设置 DataColumn 对象值的最大长度 |
Caption | 属性,设置 DataColumn 对象在显示时的列名,类似于给表中的列设置别名 |
DefaultValue | 属性,设置 DataColumn 对象的默认值 |
AutoIncrement | 属性,设置 DataColumn 对象为自动增长列,与 SQL Server 中数据表的标识列类似 |
AutoIncrementSeed | 属性,与 AutoIncrement 属性联用,用于设置自动增长列的初始值 |
AutoIncrementStep | 属性,与 AutoIncrement 属性联用,用于设置自动增长列每次增加的值 |
Unique | 属性,设置 DataColumn 对象的值是唯一的,类似于数据表的唯一约束 |
AllowDBNull | 属性,设置 DataColumn 对象的值是否允许为空 |
下面通过实例来演示 DataRow 类和 DataColumn 类的使用。
class Program {
private static DataTable _dataTable = new DataTable("major");
static void Main(string[] args) {
string name = Console.ReadLine();
// 创建ID列
DataColumn idColumn = new DataColumn("id", typeof(int));
idColumn.AutoIncrement = true; //设置id为自动增长列
idColumn.AutoIncrementSeed = 1; //设置id的初始值
idColumn.AutoIncrementStep = 1; //设置id每次增长的值
_dataTable.Columns.Add(idColumn);
// 专业名称列,列名为name
DataColumn nameColumn = new DataColumn("name", typeof(string));
nameColumn.Unique = true;
_dataTable.Columns.Add(nameColumn);
// 将输出的值添加到DataTable中
DataRow dataRow = _dataTable.NewRow();
dataRow["name"] = name;
_dataTable.Rows.Add(dataRow);
// 迭代输出
foreach (DataRow row in _dataTable.Rows) {
Console.WriteLine(row[0].ToString() + " " + row[1].ToString());
}
}
}
ComboBox
在 Windows 应用程序中很多控件都提供了 DataSource 属性,并将 DataSet 或 DataTable 的值直接赋给该属性,这样在控件中即可显示从数据库中查询出来的数据。
组合框控件(ComboBox)在 Windows 窗体应用程序中是常用的控件,例如用于存放省市信息、专业、图书类型、房间类型等。
1、创建专业数据库表major
create database demoDb;
use demoDb;
create table major (
id int primary key auto_increment,
name varchar(20) unique
);
insert into major(name) values ("legend");
insert into major(name) values ("vincent");
insert into major(name) values ("kevin");
使用ComboBox和数据库表major
进行数据绑定。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
String connetStr = "server=127.0.0.1;port=3306;user=root;password=123456; database=demoDb;";
using (MySqlConnection connection = new MySqlConnection(connetStr)) {
try {
connection.Open();
string sql = "select * from major";
MySqlDataAdapter adapter = new MySqlDataAdapter(sql, connection);
DataSet dataSet = new DataSet();
adapter.Fill(dataSet);
comboBox1.DataSource = dataSet.Tables[0];
comboBox1.ValueMember = "id";
comboBox1.DisplayMember = "name";
}
catch (Exception e) {
Console.WriteLine("出现错误:" + e.Message);
}
}
}
}
在实际工作中,使用代码绑定的方式是应用最多的方式,一方面体现了代码的灵活性,另一个方面也增强了代码的可移植性。
DataGridView
数据表格控件是 WinForm 窗体应用程序中用于查询时以表格形式显示数据的重要控件,同样数据表格控件也可以使用可视化数据绑定和代码的方式来绑定数据表中的数据,并能在数据表格控件中实现对表中数据的修改和删除操作。
使用代码绑定 DataGridView 控件时需要为该控件设置数据源 (DataSource) 属性。
public partial class Form1 : Form {
private MySqlDataAdapter _adapter;
private DataSet _dataSet;
public Form1() {
InitializeComponent();
String connetStr = "server=127.0.0.1;port=3306;user=root;password=123456; database=demoDb;";
using (MySqlConnection connection = new MySqlConnection(connetStr)) {
try {
connection.Open();
string sql = "select * from major";
_adapter = new MySqlDataAdapter(sql, connection);
_dataSet = new DataSet();
_adapter.Fill(_dataSet);
dataGridView1.DataSource = _dataSet.Tables[0];
}
catch (Exception e) {
Console.WriteLine("出现错误:" + e.Message);
}
}
}
private void button1_Click(object sender, EventArgs e) {
// 同步修改到数据库
MySqlCommandBuilder builder = new MySqlCommandBuilder(_adapter);
_adapter.Update(_dataSet);
}
}
使用MysqlCommandBuilder
类可以将修改更新到数据库。