数据库访问
现在的话,数据库访问技术越来越受到大家的关注,ADO.NET数据访问技术收到大家的广泛好评.以前的话,大多数Web页面都由静态信息组成,Web站点仅允许访问者读取数据,交互性不强,并且不存储访问者的信息,如果必须存储访问者的信息.需要使用数据库并制定数据访问策略,该数据访问策略允许程序员与数据库建立连接,并且提供检索,插入,更新和删除数据的命令.
所以说,数据库的知识还是很有必要学习的,咱们闲话少叙,进入正题.
参考:如果你还不知道啥叫事务,那就有点low了,简单来说,就是你要执行SQL语句有10句,前5句正确执行了,后面的没有正确执行,但是因为SQL语句是解释执行的语句,所以,他会把前5句造成的效果写入数据库,后面的不管.这就麻烦大了,如果你给别人转钱的时候,你转钱的步骤成功了,可是从你银行卡里扣钱的步骤失败了,这就完了,我是说银行就完了.所以说,事务就是要么不执行,要么都执行.
来点概念性的东西吧,大家不喜跳过.
事务是作为一个逻辑单元执行的一系列操作,一个逻辑单元必须有四个属性,成为ACID属性,只有这样才能成为一个事务,简单来说,事务是不存在的,只是人为的划分出来的.
ACID代表的含义如下:
原子性:要么全执行,要么全都不执行,不能再划分为更小的工作单元了.
一致性:事务在完成时,必须使所有的数据都保持一致状态.在相关数据库中,所有规则都必须应用于事物的修改,以保持所有数据的完整性.事物结束时,所有的内部数据结构都必须是正确的.
隔离性:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离.事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是之后的状态,不存在中间状态的数据.这称为可串行性,因为他能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同.
持久性:事务完成之后,它对系统的影响是永久性的,该修改及时出现系统故障也将一直保持.
参考:你听过游标吗?说实话,楼主是第一次听过这个词(在数据库中),楼主以前只在物理课上听过,如果你对游标的内容掌握的很熟练,说明你在数据库编程方面已经达到了一定得水平和具备一定的熟练程度.
在操作数据库的时候,使用select查询语句检索数据时,返回的结果为一个集合这个大家应该不陌生吧.如果用户要对结果集中的每条数据进行处理,就必须使用游标.游标是一个可以存储查询结果集的对象,并能将存储在其中的记录提取出来进行处理.
游标实现的功能非常类似于.NET中使用循环遍历数据集(DataSet)中的记录.
对于游标的具体使用情况,我觉得对楼主这样走马观花式的博客不适合写,等我把.NET编程之美看完之后,我会详细介绍知识点!相信楼主!
参考:要区别这两者的话,需要你对ADO.NET编程有着深刻了解,像楼主这样屌丝是不行了,你们都比楼主聪明肯定能理解的很好.相信你们.
ADO.NET提供了两种数据访问方式:一种是断开式访问(使用DataAdapter和DataSet实现数据访问),另一种是流模式访问(使用Command和DataReader实现数据访问).这两种访问模式是ADO.NET的精髓.额...如果你不知道的话,我只能说呵呵了...我现在说了,再不知道不合适了.
DataReader和DataSet最大的区别在于DataReader使用时始终占用SqlConnection,在线操作数据库.任何对SqlConnection的操作都会引发DataReader的异常,因为DataReader每次值在内存中加载一条数据,所以占用的内存很小,而且DataReader只能向前读取记录.
DataSet则是将数据一次性加载在内存中,然后髯断数据库连接.因为DataSet时将数据全部加载爱内存中,所以比较消耗内存,但是比DataReader要灵活,可以动态的添加行,列,数据以及对数据库进行回传更新操作.
其实,流模式访问和断开式访问的名字就是根据作用来的,你再回头更具这两者的区别看看定义,是不是恍然大悟?学习么,要总结回顾,才是好的学习方法.最近楼主看了一本小书叫做铁器时代,这是楼主看过最扯淡的小说!楼主是看完三体的人了,所以说啊,一般的小说入不了楼主的法眼!不过DataSet和DataReader可以入我的法眼.我一般把DataSet比作大客车,把DataReader是小摩托车.这不是胡诌的,有原因的.
参考:如果你看到这个问题之后,一股热浪直冲大脑,恭喜你,你是不是想起来咱们前面说的.NET和ASP.NET的区别?你是不是想说微软好有病,起的这些名字真是我去年买了个表.额...对于和个问题,楼主也觉得微软现在真点有点不知道要干啥了,当初老盖和乔帮主争市场的时候,微软还有一手好活,现在真是,唉,当初和乔帮主一样,想搞平板,结果被乔帮主三言两语忽悠的懵逼了,当初搞手机,非要弄个手写笔,唉,乔帮主这个时候又出来忽悠他,你弄个手写笔好啊,大家肯定都用啊,不管微软搞不搞,反正我苹果要搞手写笔,这项技术真是太了不起了,比灯泡的发明还要伟大.微软信了,转头之后,乔帮主就对苹果员工说,上帝已经给了我们是个手写笔了,微软还要在造手写笔,这群**玩意,苹果这是要火啊!微软之后又搞过MSN,手机,现在有要搞搜索引擎bing,唉,搞了几天又要卖了...微软这是要火啊!
不说微软了,咱们进入正题,说到哪了?哦,对了,这个微软,楼主错了,和大家开个玩笑.
其实呢,ADO是一项技术,这个大家应该没意见,所谓的ADO.NET是ADO的加强版!楼主就是这么理解的.如果不对,请给楼主留言,楼主洗耳恭听.
参考:这个问题,没别的,记住,你应该很少看到楼主详细的说一个问题有具体的几点,对吧.因为如果我具体的说了几点,你就会努力的记忆,而不是理解,就像当初背历史的时候,老师提问我们说辛亥革命的历史意义有那三点呢?我觉得这样没帮助,要是我,我会说,你能说一下辛亥革命的历史意义吗?楼主认为这才是正确的教育方式,你把所有的一切都说了,都规定好了,我们一直在走你们设计好的路,有什么意思?全是应试教育下的受害者!
咱们前面说过的数据集DataSet对象和数据阅读器DataReader对象,这就两个了,还有数据库连接Connection对象,数据适配器对象DataAdapter以及数据库命令对象Command.
参考:这两个方法堪称使用率最高的两个SQL语句的方法.
这两个方法的区别如下:
Insert,Update和Delete等操作的SQL语句主要用ExecuteNonQuery方法来执行;而Select操作的SQL语句通常用ExecuteReader方法来执行.
ExecuteNonQuery方法返回执行SQL语句所影响的行数;而ExecuteReader方法返回一个DataReader对象,也就是一个数据集合.
其实你通过看名字你能知道这两个方法的区别,对吧.
参考:看到这个问题如果你像楼主一样感觉到迷茫,懵逼等一系列负面情绪,没关系,do not worry.请相信有好心人会给楼主留言的,哈哈!
参考:说实话,using这个玩意貌似哪里都有它呢,这让我想起了我初中的班主任经常对楼主说的一句话:”哪里都有你!”.哈哈,好怀念年轻的时候.C#中最常用的代码就是使用using引入命名空间,但是!using还有其他功能:
用处1:用using关键字命名类的别名
本来想举个例子的说明的,但是说实话,楼主也是第一次听过这个用法,以前一次也没用过.这里全党理解吧.
用法2:通过using语句可以释放对象
你自己使用过操作文件的代码吗?或者自己写过操作数据库的代码吗?你应该知道using的用法吧?这个用法你不觉得和try...finally语句的功能类似吗?
参考:身为一个ASP.NET程序员,不可能不知道SQL注入攻击吧?这种攻击方式很常见.
这么说吧,一般咱们在判断用户登录的时候都是使用如下的代码:
select count(*) from UserInfo where UserName=’Admin’
对吧,这句话一般先判断用户是否存在,再判断用户密码是否正确,这里楼主就写成一句了.
但是,有的用户他们不按常规出牌,他们在输入用户名的地方是这么输入的” Admin or 1=1”,这个时候你的SQL语句会变成这样:
select count(*) from UserInfo where UserName=’Admin’ or 1=1
这个时候这句话的判断永远是正确的,根本起不到判断用户存在的作用,还有的人更狠,直接给你输入”--”注释,这样的话,你的后面连执行的机会都没了,对吧,SQL注入就是这样来的.防范SQL注入的方法就是使用ADO.NET中传递参数的方法.别说你不知道,我知道你知道!给你点提示好啦,SqlParameter.
参考:这里可能出现了池的概念,不止数据库有池的概念,线程,进程都有池的概念.池?听名字就知道是一个容器,生活中的池就是用来放东西的,听过水池吧,用来放水的,那么数据库连接池呢?聪明,就是用来放数据库连接的,同理,进程池呢?线程池呢?
数据库操作的第一步就是连接数据库,但是连接数据是一个非常牺牲性能的操作,为啥牺牲性能呢?自己先想想.所以对数据库链接进行优化是提高系统性能的关键.在ADO.NET中使用数据库连接池对数据连接进行优化.所有的数据库连接都放在连接池中,连接池有选择性的保留程序释放的数据库连接,以便日后使用.
用户调用链接对象的Open方法时池进程会检查池中是否有可用的连接,如果有可用连接,那么直接将该链接返回给调用者;如果池中没有可用的连接,则创建新数据连接.当应用程序调用连接的CLose方法时,池进程会将此链接返回到活动链接池中,而不是真正关闭连接.你知道在项目中删除数据库中的数据不是真正的删除,是给数据的删除标识换成一个别的值吗?
还有一个问题,ADO.NET如何判断连接池内的连接是否符合用户请求数据库连接需求呢?答案很简单,那就是根据连接字符串.用户请求数据库连接必须传入连接字符串,池进程首先判断连接池中是否有与之相同的字符串,如果有则直接分配给用户,不存在就新建连接.
说明:在默认情况下,数据库连接池处于启动状态,也就是用户创建连接时默认都在使用连接池,当然用户可以通过设置不适用数据库连接池.
在连接字符串里加上一项 Pooling=false;
参考:在配置数据库连接字符串时,一般的用户一般习惯性是将其放在配置文件(web.config)中,这样做固然没错,楼主一般就是这样,但是这样做不容易维护而且安全性差,容易出问题.实际项目开发中你可能会遇见过只更改配置文件中连接字符串的一小部分就导致整个系统的崩溃,还有一个问题是在配置文件中明码标识的连接字符串存在系统安全隐患.
所以,针对上述问题,出现了ConnectionStringBuilder类型(连接字符串构造器).
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder["Data Source"]=".";//设置数据库服务器为当前及其
builder["Initial Catalog"]="ExpatiaAspNet";//设置连接字符串的数据库名
builder["Integrated Security"]=true;//使用集成安全验证方式
Response.Write(builder.ConnectionString);//输出
可以看到,ConnectionStringBuilder类型使我们以编程的方式创建,修改连接字符串的强类型键/值对.同时,该类型还能对键/值对实行有效性检查,如果添加无效的键/值对来创建无效的连接字符串将引发异常.
技巧:你可以将连接字符串构造器管理的键/值对存放在数据库中,专门做出一个连接字符串配置页面对连接字符串进行统一管理.
参考:楼主以前也是没有听过LINQ的,但是身为祖国栋梁的你们没听过LINQ很不应该!LINQ是个什么东西呢?说白了,它是一项技术,一套查询技术.大家知道数据库主要是用来查询的对吧,微软开发的这套LINQ就是和数据库查询类似,在数据不大的情况下,使用LINQ很方便高效!LINQ可以查询或操作任何存储形式的数据,如对象(集合,数组,字符串等),关系(关系数据库,ADO.NET数据集等)以及XML.
针对以上三种不同的数据,LINQ又分为了LINQ to Objects查询技术,LINQ to ADO.NET查询技术,LINQ to XML查询技术.
本来楼主向详细介绍一下这三种技术的,但是楼主发现楼主的材料写的LINQ不是很详细,一共用了两页,等楼主学成归来的时候,给大家详细介绍一下LINQ的内容.
楼主的文章一般不是什么高级技术,甚至连技术都算不上,没有什么实际的代码,全是一些小概念啥的,如果您能楼主的文章中学到那么一丝的东西,那么楼主不胜荣幸!