ADO.NET
介绍
ADO.NET是是一个COM组件库,用于在以往的Microsoft技术中访问数据。也是就是说通过ADO.NET技术可以访问数据库中的数据。(所以对我们来说了解它是十分有必要的)
1.对象模型构成
ADO.NET由两部分组成:数据提供程序(Provider)和数据集(DataSet)
- Provider:它能和数据库保持链接,并且执行SQL命令,操作数据集
- DataSet:能在断开数据库的情况下操作数据(核心)
- Dataset是由多张DataTable(即我们通常所说的表)构成的
- Provider里面有四个非常重要的对象,分别是:DataReader、DataAdapter、Commond、Connection。
2.ADO.NET 对象模型
*Connection
我们可以把数据库看作水源,里面存储了大量的水(数据),Connection好比伸入水中的进水龙头,保持了和水的接触,只有它和水接触了,其他的对象才能得到水。
*Command
Command 就像抽水机,为抽水提供动力和执行方法,通过“水龙头”,然后把水返回给“水管”。简单地说,就是我们写好了SQL语句,让command对象去执行。
*DataAdapter
DataAdapter像输水管,担任着水的传输任务,并起着桥梁的作用,通过发动机把水从水源送到水库(dataset)里进行保存
*DataReader
DataReader也是一种水管,起着同样的作用。但是,它不是把水输送到水库里面,而是单向地直接把水送到需要用水的用户那里,所以要比在水库中转一下要更快一点。
*DataSet
DataSet为”大水库”,把抽上来的水在按一定的关系的池子里进行存放,即使撤掉”抽水装置”,也能保持水的存在(ADO.NET的核心)。也可以理解为数据库的表在内存中映射的缓存。
*DataTable
DataTable是水库中,每个独立的水池子,分别存放不同类别的水,他们一起组成了”水库”。
3.Connection 连接关闭数据库
*访问数据库需要用到数据库连接类,在C#中可以通过Connect类来实现
*步骤
在网上下载相应的dll 驱动程序(类库),放到本地文件夹的某个地方
在你的工程项目中,单击”引用”添加引用添加之后,右边就可以看到新增的引用类库,其次就是引用命名空间,我这里用的是MySQL,其他的数据库也是类似的。
- 将连接方法声明至字符串中
- 创建Connection对象
- 调用方法,打开数据库连接
string conStr="Server=localhost;user=root;pwd=123456;database=XX";
MySqlConnection myCon=new MySqlConnection(conStr);
myCon.open();
*为了节省系统资源,提高性能,最好使用完数据库后就要关闭连接,下面介绍几种关闭连接的方式
=> 可以通过using语句,确保对象在退出时立即被释放,从而达到关闭数据库的作用
using(myCon){
myCon.Open();
//使用完之后会自动关闭连接
}
=> 使用try…catch…finally
try{
myCon.Open();
..... //代码
}
catch{
.... //异常处理
}
finally{
myCon.Close();
}
4.Command操作数据
常用属性:
CommandText: 要下达到数据源的命令
CommandTimeOut: 出错时等待时间
常用方法:
ExecuteNonQuery():不返回任何值,一般应用于insert,update,delete操作
下面进行一个插入操作,向clerk表插入一条记录(必须先添加引用,这样才能使用命名空间)
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //创建数据库连接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
string InsertSql = "inser into clerk values(10088,'Lucy',21,'F','warehouse',sysdate())";
MySqlCommand myCom = new MySqlCommand(InsertSql, myCon);
myCom.ExecuteNonQuery(); //执行操作
Console.WriteLine("数据库插入操作完成");
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
执行完之后就可以看到数据库表中多了一条记录o(∩_∩)o
ExecuteScalar() :返回一个值,一般用于只返回一个值的语句。如求数据统计的count语句,求最大数、求最小数等等。
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //创建数据库连接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
string maxAge = "select max(age) from clerk";
MySqlCommand myCom = new MySqlCommand(maxAge, myCon);
int max=(int)myCom.ExecuteScalar(); //执行操作
Console.WriteLine("最大的年龄是:"+max);
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
结果如下:
5.DataReader读取数据
*DataReader对象提供了用顺序的、只读的方式读取Command对象获得的数据结果集。正是因为DataReader以顺序的方式连续地读取数据,所以它会以独占的方式打开数据库连接
*由于DataReader指执行读操作,并且每次只在内存缓冲区里存储结果集中的一条数据,所以使用它的效率比较高。若要查询大量数据,同时不需随机访问和修改数据,它是优先选择。
常用属性:
FieldCount: 表示记录中有多少字段
HasRows: 用于表示DataReader是否包含数据
IsClosed :表示DataReader是否关闭
常用方法:
Close(): 将DataReader对象关闭。
GetDataTypeName(): 获取字段数据形态。
GetName(): 获取指定字段的名称。
GetOrdinal(): 获取指定字段名称在记录中的顺序
GetValue(): 获取字段的值
GetValues(): 获取字段的所有值
Read(): 读取下一条数据
++访问DataReader对象时,使用索引要比使用字段名称访问速度要快
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //创建数据库连接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
Console.WriteLine("数据库已经打开");
string Sql = "select * from clerk";
MySqlCommand sqlCom = new MySqlCommand(Sql, myCon);
//声明
MySqlDataReader dr;
dr = sqlCom.ExecuteReader();
Console.WriteLine("字段个数有:" + dr.FieldCount);
for (int i = 0; i < dr.FieldCount; i++) {
Console.Write(dr.GetName(i) + "\t"); //输出表的字段名
}
Console.WriteLine();
while (dr.Read()) {
for (int i = 0; i < dr.FieldCount; i++) {
Console.Write(dr.GetValue(i) +"\t");
}
Console.WriteLine();
}
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
6.DataSet
*Dataset对象由一组DataTable对象组成,这些对象与DataRelation对象相互关联,DataTable对象又包含Rows和Columns。
7.DataAdapter
*DataAdapter对象是DataSet和数据源之间的桥梁,可以建立并初始化数据表(DataTable),对数据源执行sql命令,与DataSet对象结合提供DataSet对象存取数据,可视为DataSet对象的核心操作。
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //创建数据库连接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
string sql = "select * from clerk";
MySqlDataAdapter Adapter = new MySqlDataAdapter(sql,myCon); //两个参数,一个是sql语句,一个是连接
DataSet myds = new DataSet(); //创建DataSet对象
// Console.WriteLine(myds.Tables[0]); //没有填充之前DataSet里面是没有表的
Adapter.Fill(myds, "clerk"); //两个参数,把表“clerk”向dataset里填充
Console.WriteLine("填充成功");
Console.WriteLine(myds.Tables[0]);// 控制台将会输出第一张表
outValues(myds); //调用函数输出表的内容
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
public static void outValues(DataSet ds)
{
foreach (DataTable dt in ds.Tables) {
Console.WriteLine("表名:" + dt.TableName);
//遍历行
foreach (DataRow row in dt.Rows) {
//遍历列
foreach (DataColumn col in dt.Columns) {
Console.Write(row[col] + "\t");
}
Console.WriteLine();
}
}
}
结果:
*DataAdapter可用于执行数据库的命令操作,含有四个不同的操作命令:
(1)SelectCommand: 选取数据源中的数据
(2)InsertCommand: 用于向数据源插入一条数据
(3)UpdateCommand: 用于更新数据源中的数据
(4)DeleteCommand: 用于删除数据源中的记录
UpdateCommand 进行更新
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //创建数据库连接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
string sql = "select * from clerk";
string updateSql="update clerk set sex='F' where name='smith'";
MySqlDataAdapter Adapter = new MySqlDataAdapter(sql,myCon); //两个参数,一个是sql语句,一个是连接
DataSet myds = new DataSet(); //创建DataSet对象
Adapter.UpdateCommand=new MySqlCommand(updateSql,myCon);
Adapter.Fill(myds,"clerk");
Console.WriteLine("更新之前的");
outValues(myds);
//更新dataset
DataRow row = myds.Tables[0].Rows[0];
row["sex"] = "F";
Adapter.Update(myds, "clerk");
Console.WriteLine("更新之后的");
outValues(myds);
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
近期自己在[我要自学网](http://www.51zxw.net/study.asp?vip=9618490)
学习C#入门教程。在这里对知识进行梳理,希望能帮到大家