?
?
?
無(wú)助的時(shí)候,我曾讀過(guò)N遍《金剛經(jīng)》,講到《金剛經(jīng)》,我必須把愛(ài)因斯坦先拿來(lái)當(dāng)我的檔箭牌,不然,寫(xiě)這么個(gè)題目,我可能會(huì)被拍死:
?
“如果世界上有一個(gè)宗教不但不與科學(xué)相違,而且每一次的科學(xué)新發(fā)現(xiàn)都能夠驗(yàn)證她的觀點(diǎn),這就是佛教。”《愛(ài)因斯坦文集》,第一卷。
?
“我不能設(shè)想真正的科學(xué)家會(huì)沒(méi)有這樣深摯的信仰。這情況可以用這樣一個(gè)形象來(lái)比喻:科學(xué)沒(méi)有宗教就象瘸子,宗教沒(méi)有科學(xué)就象瞎子。”------------《愛(ài)因斯坦文集》,第三卷,商務(wù)印書(shū)館,1979年,第182-183頁(yè)。
?
我還要提到我們國(guó)家,有位工科出身的領(lǐng)導(dǎo)人,我印象中,他也曾有段時(shí)間,每天都讀《金剛經(jīng)》…
?
先引用一段吧:
?
所有一切眾生之類,若卵生、若胎生、若濕生、若化生、若有色、若無(wú)色、若有想、若無(wú)想、若非有想非無(wú)想,我皆令入無(wú)余涅槃而滅度之。如是滅度無(wú)量無(wú)數(shù)無(wú)邊眾生,實(shí)無(wú)眾生得滅度者。何以故?須菩提,若菩薩有我相、人相、眾生相、壽者相,即非菩薩。
?
類是眾生之類嗎?若化生??若無(wú)想??若非有想非無(wú)想??
?
我不是個(gè)無(wú)知無(wú)欲的佛教徒,寫(xiě)這一段,我是非常非常傷感的,因?yàn)榻裉欤覀兙鸵盐覀儎倓傉J(rèn)識(shí)的,剛剛喜歡的,感覺(jué)已經(jīng)有了很深的情感的幾個(gè)類,幾個(gè)象人一樣可愛(ài)的類,給“滅度”掉。
?
請(qǐng)?jiān)徫业娜涡裕也恢烙眠@個(gè)詞到底確切不確切,只是想這么用,就這么用了,原諒我的無(wú)知吧……
?
這幾個(gè)類,早已讓很多網(wǎng)友不耐煩了,它們是SqlConnection、SqlCommand、SqlDataReader…
讓我們,慢慢地,把它們送走吧……
?
《十八相送》是越劇《梁山伯與祝英臺(tái)》中的最精彩的片段,可惜,不會(huì)有多少人這么有耐心地傾聽(tīng)那悠悠的、凄美的愛(ài)情了….
?
那么,我們簡(jiǎn)化一下,分六步吧:
一相送,送到try…catch…finally結(jié)構(gòu)中:
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()結(jié)構(gòu)中:
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();
//簡(jiǎn)單地說(shuō),using()結(jié)構(gòu)等同于前面的try...finally結(jié)構(gòu),隱式關(guān)閉了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();
}
}
}
三相送,送到通用的數(shù)據(jù)庫(kù)訪問(wèn)函數(shù)中:
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();
//如果創(chuàng)建了 SqlDataReader 并將 CommandBehavior 設(shè)置為 CloseConnection,
//則關(guān)閉 SqlDataReader 會(huì)自動(dòng)關(guān)閉此連接
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return rdr;
}
catch
{
conn.Close();
throw;
}
//finally
//{
// conn.Close();
//}
}
}
}
這個(gè)通用數(shù)據(jù)庫(kù)訪問(wèn)函數(shù)可以進(jìn)一步完善如下:
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);
//如果創(chuàng)建了 SqlDataReader 并將 CommandBehavior 設(shè)置為 CloseConnection,
//則關(guān)閉 SqlDataReader 會(huì)自動(dòng)關(guān)閉此連接。
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);
}
}
}
}
因?yàn)橹攸c(diǎn)在過(guò)程,在結(jié)構(gòu),代碼都比較簡(jiǎn)單,唯一值得一提的是SqlConnection的關(guān)閉問(wèn)題,在最后比較完善的數(shù)據(jù)庫(kù)訪問(wèn)函數(shù)中(這是SQLHelper中的源代碼),沒(méi)有使用using()結(jié)構(gòu),也沒(méi)有顯示關(guān)閉,主要原因是調(diào)用ExecuteReader方法時(shí),使用了參數(shù) CommandBehavior 并將其設(shè)置為 CloseConnection:
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
根據(jù)MSDN的說(shuō)法:如果創(chuàng)建了 SqlDataReader 并將 CommandBehavior 設(shè)置為 CloseConnection ,則關(guān)閉 SqlDataReader 會(huì)自動(dòng)關(guān)閉此連接。
參考網(wǎng)址: http://msdn.microsoft.com/zh-cn/library/y6wy5a0f(v=vs.80).aspx
?
?更多文章請(qǐng)參閱博客 http://blog.csdn.com/yousuosi
?
編程也講禪,您讀過(guò)《金剛經(jīng)》嗎?——ADO.NET核心類的滅度與SQLHelper的誕生——十八相送(上)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

