源代码:13033480群共享

无助的时候,我曾读过N遍《金刚经》,讲到《金刚经》,我必须把爱因斯坦先拿来当我的档箭牌,不然,写这么个题目,我可能会被拍死:

“如果世界上有一个宗教不但不与科学相违,而且每一次的科学新发现都能够验证她的观点,这就是佛教。”《爱因斯坦文集》,第一卷。

“我不能设想真正的科学家会没有这样深挚的信仰。这情况可以用这样一个形象来比喻:科学没有宗教就象瘸子,宗教没有科学就象瞎子。”------------《爱因斯坦文集》,第三卷,商务印书馆,1979年,第182-183页。

我还要提到我们国家,有位工科出身的领导人,我印象中,他也曾有段时间,每天都读《金刚经》…

先引用一段吧:

所有一切众生之类,若卵生、若胎生、若湿生、若化生、若有色、若无色、若有想、若无想、若非有想非无想,我皆令入无余涅槃而灭度之。如是灭度无量无数无边众生,实无众生得灭度者。何以故?须菩提,若菩萨有我相、人相、众生相、寿者相,即非菩萨。

类是众生之类吗?若化生??若无想??若非有想非无想??

我不是个无知无欲的佛教徒,写这一段,我是非常非常伤感的,因为今天,我们就要把我们刚刚认识的,刚刚喜欢的,感觉已经有了很深的情感的几个类,几个象人一样可爱的类,给“灭度”掉。

请原谅我的任性,我不知道用这个词到底确切不确切,只是想这么用,就这么用了,原谅我的无知吧……

这几个类,早已让很多网友不耐烦了,它们是SqlConnection、SqlCommand、SqlDataReader…

让我们,慢慢地,来个《梁山伯与祝英台》中的《十八相送》??

怕是没有多少人这么有耐心地倾听那悠悠的、凄美的爱情了,我们还是简化一下,分六步吧:….

一相送,送到try…catch…finally结构中:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using WestGarden.Model;namespace WestGarden.Web
{public partial class Default1 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){IList<CategoryInfo> catogories = new List<CategoryInfo>();string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;string cmdText = "SELECT CategoryId, Name, Descn FROM Category";SqlCommand cmd = new SqlCommand();SqlConnection conn = new SqlConnection(connectionString);try{cmd.Connection = conn;cmd.CommandType = CommandType.Text;cmd.CommandText = cmdText;conn.Open();SqlDataReader rdr = cmd.ExecuteReader();while (rdr.Read()){CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));catogories.Add(category);}rdr.Close();}finally{conn.Close();}ddlCategories.DataSource = catogories;ddlCategories.DataTextField = "Name";ddlCategories.DataValueField = "CategoryId";ddlCategories.DataBind();}}
}

二相送,送到using()结构中:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using WestGarden.Model;namespace WestGarden.Web
{public partial class Default2 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){IList<CategoryInfo> catogories = new List<CategoryInfo>();string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;string cmdText = "SELECT CategoryId, Name, Descn FROM Category";SqlCommand cmd = new SqlCommand();//简单地说,using()结构等同于前面的try...finally结构,隐式关闭了conn。using(SqlConnection conn = new SqlConnection(connectionString)){cmd.Connection = conn;cmd.CommandType = CommandType.Text;cmd.CommandText = cmdText;conn.Open();SqlDataReader rdr = cmd.ExecuteReader();while (rdr.Read()){CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));catogories.Add(category);}rdr.Close();}ddlCategories.DataSource = catogories;ddlCategories.DataTextField = "Name";ddlCategories.DataValueField = "CategoryId";ddlCategories.DataBind();}}
}

三相送,送到通用的数据库访问函数中:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using WestGarden.Model;namespace WestGarden.Web
{public partial class Default3 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){IList<CategoryInfo> catogories = new List<CategoryInfo>();string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;string cmdText = "SELECT CategoryId, Name, Descn FROM Category";SqlDataReader rdr = ExecuteReader(connectionString, CommandType.Text, cmdText);while (rdr.Read()){CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));catogories.Add(category);}rdr.Close();ddlCategories.DataSource = catogories;ddlCategories.DataTextField = "Name";ddlCategories.DataValueField = "CategoryId";ddlCategories.DataBind();}public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText){SqlCommand cmd = new SqlCommand();SqlConnection conn = new SqlConnection(connectionString);try{cmd.Connection = conn;cmd.CommandType = cmdType;cmd.CommandText = cmdText;conn.Open();//如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection,//则关闭 SqlDataReader 会自动关闭此连接SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);return rdr;}catch{conn.Close();throw;}//finally//{//    conn.Close();//}}}
}

这个通用数据库访问函数可以进一步完善如下:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using WestGarden.Model;namespace WestGarden.Web
{public partial class Default4 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){IList<CategoryInfo> catogories = new List<CategoryInfo>();string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;string cmdText = "SELECT CategoryId, Name, Descn FROM Category";SqlDataReader rdr = ExecuteReader(connectionString, CommandType.Text, cmdText,null);while (rdr.Read()){CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));catogories.Add(category);}rdr.Close();ddlCategories.DataSource = catogories;ddlCategories.DataTextField = "Name";ddlCategories.DataValueField = "CategoryId";ddlCategories.DataBind();}public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters){SqlCommand cmd = new SqlCommand();SqlConnection conn = new SqlConnection(connectionString);try{//cmd.Connection = conn;//cmd.CommandType = cmdType;//cmd.CommandText = cmdText;//conn.Open();PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);//如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection,//则关闭 SqlDataReader 会自动关闭此连接。SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);cmd.Parameters.Clear();return rdr;}catch{conn.Close();throw;}//finally//{//    conn.Close();//}}private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms){if (conn.State != ConnectionState.Open)conn.Open();cmd.Connection = conn;cmd.CommandText = cmdText;if (trans != null)cmd.Transaction = trans;cmd.CommandType = cmdType;if (cmdParms != null){foreach (SqlParameter parm in cmdParms)cmd.Parameters.Add(parm);}}}
}

因为重点在过程,在结构,代码都比较简单,唯一值得一提的是SqlConnection的关闭问题,在最后比较完善的数据库访问函数中(这是SQLHelper中的源代码),没有使用using()结构,也没有显示关闭,主要原因是调用ExecuteReader方法时,使用了参数 CommandBehavior 并将其设置为 CloseConnection:

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

根据MSDN的说法:如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection,则关闭 SqlDataReader 会自动关闭此连接。

参考网址:http://msdn.microsoft.com/zh-cn/library/y6wy5a0f(v=vs.80).aspx

版权所有©2012,WestGarden.欢迎转载,转载请注明出处.更多文章请参阅博客http://www.cnblogs.com/WestGarden/

转载于:https://www.cnblogs.com/WestGarden/archive/2012/06/04/2533560.html

编程也讲禅,您读过《金刚经》吗?——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(上)...相关推荐

  1. R语言编程 第一讲 变量与赋值

    R语言编程 第一讲 变量与赋值 R语言的变量名 赋值符号 <- 与 = 的区别 赋值符号 <- 的更多细节 Copy-on-Modify与Modify-in-Place 函数调用 列表 数 ...

  2. FX3U PLC源代码,stm32芯片。 全套硬件,软件源码,可以直接用GX Works2编程直接写入。 带读保护版本

    FX3U PLC源代码,stm32芯片. 全套硬件,软件源码,可以直接用GX Works2编程直接写入. 带读保护版本. 是以太网之前的最高版本. 产品功能描述:用梯形图语言编写应用程序,可以直接使用 ...

  3. Shell脚本编程35讲视频教程

    Shell脚本编程35讲视频教程 http://www.360doc.com/content/15/0502/19/3167194_467510602.shtml

  4. 查生日代码_让库克亲自送上生日祝福的10后小学生,还在B站教人学编程?

    "别人家的孩子"从小到大都是父母口中夸赞的对象,但有时候人与人的差距比想象中的还要大. 前几天苹果CEO库克在微博上分享由苹果公司组织的"人人能编程"项目线下交 ...

  5. 本科毕业四年时间如何从月薪7k到年薪60w,讲下个人从菜鸟程序员到公司核心开发工程师的历程!

    本科毕业四年时间如何从月薪7k到年薪60w,讲下个人从菜鸟程序员到公司核心开发工程师的历程,本帖主要分享下个人经历,只要努力最终会收获一个相对于自己较好的结果的,工位照镇楼 毕业四年到现在总共换了三份 ...

  6. 一帖读尽所有管理大师的核心思想

    一帖读尽所有管理大师的核心思想 我读了N本书.熬夜到了凌晨两点写出来的帖子我容易么,你们还这样随便的不经本人同意就copy复制并且把本人名字还故意去掉换上你们的名,你们觉得这就能给你们自己涨粉?记住吧 ...

  7. 学习编程时真正值得一读的一篇文章 与 书籍

    Teach Yourself Programming in Ten Years 彼得·诺维格(Peter Norvig)是美国计算机科学家.他是Google,LLC的研究总监,并曾担任Google搜索 ...

  8. golang:1.并发编程之互斥锁、读写锁详解

    本文转载自junjie,而后稍作修改. 一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是 ...

  9. 【C/C++多线程编程之九】pthread读写锁

    多线程编程之读写锁 Pthread是 POSIX threads 的简称,是POSIX的线程标准. pthread读写锁把对共享资源的访问者分为读者和写者,读者只对共享资源进行读访问,写者只对共享资源 ...

最新文章

  1. magento获取判断当前页或句柄handles
  2. wordpress 自定义删除后台管理菜单
  3. 杭州 | PMCAFF 产品经理第一课,面向3-5年产品经理,全面提升产品战略能力
  4. VR开发中性能问题—OculusWaitForGPU
  5. 分布式系统概念和设计 第十五章 (1)
  6. html5 websocket与c,打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
  7. HTML inline 与block元素
  8. 浅析小米登录/注册页面(原生)
  9. 第五十三回 关云长义释黄汉升  孙仲谋大战张文远
  10. svchost.exe“病毒”
  11. 最新RiPro6.3.8 wordpress主题最新版完整修复去后门和加密文件
  12. 关于互联网金融的安全、监管
  13. 仿coco点餐系统的微信小程序
  14. [转]情侣相处最佳模式
  15. DFC Session Management Srinivas Jakkula
  16. CButton类的继承+重写--本类来自孙鑫老师C++课堂
  17. 数据结构课程设计报告——Huffman编码
  18. true || false false
  19. Q4财报过后,为何说兰亭集势迎来“价值拐点”?
  20. 国家高新技术企业的好处

热门文章

  1. oracle的exp程序,数据库expimp迁移的整个过程,及注意事项
  2. pythonweb静态服务器_python实现外部静态服务器,浏览器通过HTTP与之通信2
  3. linux 内核dump,linux内核调试技巧之一 dump_stack【转】
  4. python requests 异步调用_构建高效的python requests长连接池详解
  5. fatfs 文件属性_FATFS文件系统剖析(全).
  6. asp.net设置元素css的属性
  7. 如何在 CentOS 中添加、启用和禁用一个仓库
  8. 实现挖掘大数据价值的三大因素
  9. 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
  10. lisp语言代替python_Lisp 语言优点那么多,为什么国内很少运用?