源代码: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. Yii2 使用 Beanstalk 队列系统
  2. python 调用linux内核api_Linux系统调用及用户编程接口(API)学习
  3. 七夕节福利,一套java架构师资源等你拿
  4. php根据单词截取英文语句,php按单词截取字符串的方法
  5. AI理论知识整理(11)-线性组合线性相关与线性无关
  6. 洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 spfa (存多条边示例)
  7. 《Nginx文件类型错误解析漏洞--攻击演练》 (转)
  8. 解释logistic回归为什么要使用sigmoid函数
  9. python learning1.py
  10. CCCC-GPLT L1-038. 新世界 团体程序设计天梯赛
  11. [Linux] 学习笔记之安装学习环境(sshd, lrzsz)
  12. ubuntu eclipse for php,ubuntu 安装 Eclipse 支持PHP
  13. linux ubuntu 11.10 下的android开发环境的搭建!
  14. SpringMVC+Spring Data JPA +Bootstrap 分页实现和模糊查询分页
  15. 三方支付 微信支付 支付宝支付 银联支付 分享
  16. 9种退出极域课堂的方法
  17. 使用Arcgis Pro 2.5生成地图文件(tpk,mmpk)
  18. opencv建立数学坐标系绘制函数曲线
  19. layui 带按钮的搜索框_layui table可输入关键字搜索下拉框(select)
  20. 脾胃虚弱用什么中成药比较好?

热门文章

  1. 鸿蒙手表升级计划,鸿蒙升级第一夜,服务器崩了!各机型升级排期表来了
  2. python列表添加字符串_python字符串和列表操作
  3. c语言 链表_小陈的C语言笔记---链表(详细讲解基本操作和概念)
  4. java面试的计算机网络_Java面试总结之计算机网络(二)
  5. android自定义横向时间轴,Android自定义时间轴的实现过程
  6. 申通快递机器人上岗_【峰暴】618, 数万台机器人上岗为您服务!
  7. android 6.0 短信权限,Android6.0权限适配
  8. 人脸对齐(二十)--PRN
  9. 汇编学习--7.16--int指令
  10. android浏览系统分区,Android系统分区