ADO.NET
为什么要学习ADO.NET呢?
之前我们所学只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,
所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据
什么是ADO.NET?
ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类用类操作文件一样, System.Data.这组类是用来操作数据库(不光是MSSql Server),它提供了统一的编程接口让操作其它数据库(Access、Oracle等)的方式和操作MSSql Server一致.
连接数据库最重要的三个语句:
数据提供程序(常用类)
Connection,用来连接数据库
Command,用来执行SQL语句
DataReader只读、只进的结果集,一条一条读取数据(StreamReader、XmlReader微软的类库中这些Reader的使用方式都差不多)
除了上面三个还有:
DataAdapter,一个封装了上面3个对象的对象。
接下来一个问题就是我们读取出来的数据存到什么地方呢?
数据集(DataSet),临时数据库。
断开式数据操作
ADO.NET中的其他常见类
ConnectionStringBuilder//自动生成连接字符串(连接的时候需要一些基本的信息,就通过这个给传过去)
Parameter//带参数的SQL语句
Transaction//在ADO.NET中使用事务
与DataSet相关的类:
DataView//视图类,DataTable中的数据以不同的视角查看
DataRowView//DataView中的行。
DataTable //DataSet中的数据表
DataRow//DataTable中的行
DataColumn//DataTable中的列
DataRealation//DataTable与DataTable的关系
Constraint//DataTable中建立的约束
一、Data Source
二、理解连接数据库过程
马上就说记不住怎么办?
上面的代码只是让大家理解,以后没必要写那么多。
三、连接数据库简化写法
步骤一:声明一个字符串
步骤二:一般数据库用完要关闭并释放其资源。
再次简化的代码,dispose()没有必要每次这样调,用using默认帮我们调了。
四、连接数据库最终简化的代码
五、dispose方法用反编译器查看
六、连接数据库需要注意的地方
连接对象当中有个事件:con.StateChange通过这个事件每次就能捕获连接状态的改变。下面看下它的具体的用法:
七、事件con.StateChange
连接字符串的设置方法:
八、连接字符串属性的设置方法
如果没有这个工具,我们怎么生成这个字符串呢?就是用SqlConnectionStringBuilder
具体演示如图所示:
九、用SqlConnectionStringBuilder写连接字符串属性
能不能自己做一个小的连接字符串的生成工具呢?用这个类非常的容易,一下子就做好了。
十、连接字符串的生成工具
建议还是把常规字符串的写法记下来。
上面我们已经把数据库连上了,还没有对其进行操作.下面我们说说第二个对象Command
完成连接数据库并且向里面插入一条记录:
在数据库当中选择一张简单的表,建立winForm界面,点击按钮.插入数据.
十一、向数据库中插入一列
尽量晚打开,早关闭。用这个资源的时候,不到万不得以不要打开。在这里有个连接池的问题。后面详细讲解。
十二、向另一个数据库中插入一条数据
十三、删除数据库中一条记录
十四、更新数据库当中的一条数据
小结:刚才我们对数据库进行了增,删,改,代码几乎一样,只有sql语句不一样。都是创建连接对象,sql语句,创建另一个对象,打开,执行,关闭。
接下来我们看看查询。
十五、查询数据库中的数据的代码
十六、查询数据输出结果过程
我们可以试着用软件练习一下上面刚讲解的内容,对容易出现错误的地方,我进行了统计。马上总结一下。
- 连接字符串的时候出现的问题:写计算机名,具体到自己写的时候,看这。
十七、查看数据库连接的计算机名
- 写数据库名称的地方写成了表名
- 由于sql语句写错报的错。
怎么调呢?插入的时候报错
十八、插入的时候报错这样处理
在代码中有con.Open();
Int r=cmd.ExecuteNonQuery();
按道理来讲应该加上try catch,可能会出现断网等现象。
但是,这里加上没法显示出错误。这里要是加上的话,后面也要抛出来。
总而言之一般在ado.net中遇到的错误:
- 连接字符串问题
- Sql语句问题
十九、ExecuteScalar()方法
StatementCompleted事件,每条SQL语句执行完毕之后触发。
多条语句同时执行(用分号隔开),如何获取每条语句所影响的行数?
实际返回值为每条语句所影响的行数的和。
ExecuteScalar()方法除了能执行上面聚合函数的问题,请执行插入一条语句,获取刚刚插入这条语句的返回值编号。
二十、执行查询语句返回自动编号首界面
二十一、执行查询语句返回自动编号代码部分
所以,ExecuteScalar()不光是能执行count(*)聚合函数的问题,任何的返回单条语句都可以使用。
常用的三个方法:
ExecuteNonQuery() 执行对数据库的增删改,返回受影响的行数,适合:insert、delete、update(对于其他语句返回-1)
ExecuteScalar()执行查询,返回首行首列
ExecuteReader() 执行查询,返回DataReader对象
还记得我们上面刚做的查询的例题么?下面通过这张图说明一下原理:
二十二、DataReader
下面我们再说说通过DataReader获取列中数据时的问题:
二十三、通过索引器reader[ ]和使用reader.GetValue
二十四、通过索引器reader[ ]和使用reader.GetValue代码
很多的时候我们不想做类型转换了,这个时候怎么办呢?请看下面的办法。
二十五、通过reader获取强类型的数据
SqlDataReader使用注意的地方
数据库中的类型与C#的不太一样,数据库中的float,得用C#的GetDouble( )来获取。
二十六、空值的处理判断
二十七、获取多个结果集的数据
接下来我们再通过SqlDataReader做个小的案例。
二十八、登录首界面
查一条小技巧:
二十九、操作技巧,转换成一行
三十、登录案例代码
完成当用户登录失败了提示是用户名错了,还是密码错了。怎么做呢?思考一下。
下面看下Ado.net连接池相关
三十一、没启用连接池的情况
三十二、启用连接池的情况
我们发现启用连接池以后的速度相当的快。
下面我们用工具看下,启用,没启用状态下数据库内部做了什么东西。
先告诉大家SQL中有这么一个功能:
三十三、监视连接池内部的情况
三十四、这种情况下又打开了一个连接
2.什么情况下才会使用池中的连接对象?
1>当上一个连接对象调用Close()方法后,才会将连接放入池中。
2>当再次创建连接对象时,只有当本次创建连接对象所使用的连接字符串与池中现有连接对象的连接字符串完全一致时,才会使用池中的连接对象。
三十五、池可以通过连接字符串配置
3.连接池中的连接对象的数量可以通过设置连接字符串来设置。
4.池中的连接对象的销毁由系统决定。
Ado.net连接池使用总结:
1.第一次打开连接会创建一个连接对象。
2.当这个连接关闭时(调用Close()方法时)会将当前那个连接对象放入池中。
3.下一个连接对象,如果连接字符串与池中现有连接对象的连接字符串完全一致,则会使用池中的现有连接,而不会重新创建一个。
4.只有对象调用Close(),的时候才会放入池中,如果一个连接对象一直在使用,则下次再创建一个连接对象发现池中没有,也会再创建一个新连接对象。
在池中的连接对象,如果过一段时间没有被访问则自动销毁。
什么情况下需要禁用连接池?
一般都不禁用。尤其是asp.net之类的程序,n多个用户频繁访问,但是大多数用户访问时采用的都是同一个连接字符串
但如果某个应用程序有多个客户端,每个客户端访问时采用的都是各自的连接字符串,这时如果采用连接池,虽然每次打开连接的速度会变快,但是由于“池”的问题同时会保存多个打开的连接对象。
另外,需要注意的是在递归的时候尽量不要去访问数据库。
下面我们再看下刚才我们做的登录的案例:
三十六、SQL注入攻击
怎么解决注入攻击的问题呢?
答案就是我们带参数的SQL语句。
三十七、带参数的SQL语句
作者近期文章列表:
C#基础教程(完全免费,献给代码爱好者的最好礼物。注:本作者分享自己精心整理的C#基础教程,无任何商业目的。 希望与更多的代码爱好者交流心得,也请高手多多指点!!!) |
|
三层 | 三层(一) |
三层相关案例(及常见的错误) | |
三层实例(内涵Sql CRUD) | |
SQL数据库 ADO.net | 数据库的应用图解一 |
数据库的应用详解二 | |
ADO.NET(内涵效率问题) | |
面向过程,面向对象中高级 | 面向过程,面向对象的深入理解一 |
面向过程,面向对象的深入理解二 | |
面向对象的深入理解三 | |
winform基础 | Winform基础 |
winform中常用的控件 | |
面向过程 | 三种循环的比较 |
C#中的方法(上) | |
我们常见的数组 | |
面向对象 | 思想的转变 |
C#中超级好用的类 | |
C#中析构函数和命名空间的妙用 | |
C#中超级好用的字符串 | |
C#中如何快速处理字符串 | |
值类型和引用类型及其它 | |
ArrayList和HashTable妙用一 | |
ArrayList和HashTable妙用二 | |
文件管理File类 | |
多态 | |
C#中其它一些问题的小节 | |
GDI+ | 这些年我收集的GDI+代码 |
这些年我收集的GDI+代码2 | |
HTML概述以及CSS | 你不能忽视的HTML语言 |
你不能忽视的HTML语言2精编篇 | |
你不能忽视的HTML语言3 | |
CSS基本相关内容--中秋特别奉献 | |
CSS基本相关内容2 | |
JavaScript基础 | JavaScript基础一 |
jQuery | jQuery(内涵: jquery选择器) |