【背景】
敲三层的时候遇到很多不懂的代码,以及参数调用问题,所以在敲七层之前,先用三层敲了一条线,解决了很多
心中存有疑问的东西。很多人用SQlHelper代码大体上相同,这些是冠以关于ADO.net的一些相关知识比如
SQLDateReader等,所以把这些天学习的东西先总结一下。
问题1:在D层写SQL语句的时候用到@这是做什么用的呢?
我们通过看博客大多已经知道了:防止SQL注入。在机房收费的时候就已经接触过SQL注入,那么什么才是SQL注入呢?
我们学习机房收费的时候敲的时候代码是这样的:txtsql = "select * from Card_info where CardNo = '" & txtCardNo.Text & "'"
如果我们在文本框中输入 1' or '1'='1 则是 select * from Card_info where CardNo ='1' or '1'='1' 永远为true 这样就会登录我们的系统造成信息的泄露。SQL注入实际上就是SQL语句拼接变成一个合理的SQL语句,进入我们的系统,所以在用C# 敲的时候用了@,CardNo=@CardNo,有效防止SQL注入。
问题2:我们在敲三层登录的时候查询用的是SqlDataReader,这是查询数据的一种方法,在博客上在写SQLHelper时
很多人选择用DataTable(dataset包含若干datatalbe)返回数据集,这两种查询方式有什么区别呢?
这个查询和机房收费系统用的mrc.EOF,mrc.BOF有点相似,查询时是要根据自己写的SQL语句查询的,查询的时候用什么方式查呢?
SqlDatereader读取数据的时候是从数据库对应表中,第一条数据之前开始读,执行一次while(reader.read())然
后就向下读一条,知道找到自己对应的卡号就返回一个值,读到一条就返回一个值,知道读到最后一条就不再继续查
询了。这样如果想返回数据集就有些麻烦了。
SQLDateReader优点:查询结果是放在数据库中的,读取数据SQl会自己做优化,会占用客户端少量内存。
缺点:如果服务器发生情况,遭到破坏等,那么客户端就不能查到数据了。
dataset 优点:数据放到了客户端,数据库那边被破坏也不会影响到客户端
缺点:占用客户端大量内存。
dataset 返回数据集的代码也很简单:DataSet ds=new DataSet(), SqlDataAdapter da = new
SqlDataAdapter(sql,conn);da.Fill(ds);
在博客中看到有人写到DataTable是一张保存数据的网络虚拟表,返回类型是一个结果集,可以用泛型替代,这
些东西还是等以后慢慢探索吧。
在敲三层的时候用到Using,using是做什么用的呢?
在一本书是这样写的,在敲完程序或会产生很多垃圾,为了在后台释放资源,设计了很多方法如:
SqlConnection类,公开了Dispose方法,而后期设计了一种比较简单的方法,一种确保已经清除了资源的简单方法是
打开Ussing 代码中的一个短期生存资源。
我的个人理解就是起到一个关闭连接的作用吧,包括在代码中看到他们在SQLHelper中用到的try---cash应该也是
为了关闭对象吧。
实体层到底是做什么的呢?
我个人的理解:负责传送和接受数据的,entity实体层本身对属性也有定义get;set;以查询为例:从客户端文本框获得数据,变成参数从U层--B层--D层,在D层执行SQL语句然后将查询的结果集(比如姓名、学号,学院)传给实体层,实体层接收这些值,然后又从D层返回B层,再返回到U层。这就是为什么每个层返回时要返回实体类型。