?
?
?
無助的時候,我曾讀過N遍《金剛經(jīng)》,講到《金剛經(jīng)》,我必須把愛因斯坦先拿來當(dāng)我的檔箭牌,不然,寫這么個題目,我可能會被拍死:
?
“如果世界上有一個宗教不但不與科學(xué)相違,而且每一次的科學(xué)新發(fā)現(xiàn)都能夠驗證她的觀點,這就是佛教。”《愛因斯坦文集》,第一卷。
?
“我不能設(shè)想真正的科學(xué)家會沒有這樣深摯的信仰。這情況可以用這樣一個形象來比喻:科學(xué)沒有宗教就象瘸子,宗教沒有科學(xué)就象瞎子。”------------《愛因斯坦文集》,第三卷,商務(wù)印書館,1979年,第182-183頁。
?
我還要提到我們國家,有位工科出身的領(lǐng)導(dǎo)人,我印象中,他也曾有段時間,每天都讀《金剛經(jīng)》…
?
先引用一段吧:
?
所有一切眾生之類,若卵生、若胎生、若濕生、若化生、若有色、若無色、若有想、若無想、若非有想非無想,我皆令入無余涅槃而滅度之。如是滅度無量無數(shù)無邊眾生,實無眾生得滅度者。何以故?須菩提,若菩薩有我相、人相、眾生相、壽者相,即非菩薩。
?
類是眾生之類嗎?若化生??若無想??若非有想非無想??
?
我不是個無知無欲的佛教徒,寫這一段,我是非常非常傷感的,因為今天,我們就要把我們剛剛認識的,剛剛喜歡的,感覺已經(jīng)有了很深的情感的幾個類,幾個象人一樣可愛的類,給“滅度”掉。
?
請原諒我的任性,我不知道用這個詞到底確切不確切,只是想這么用,就這么用了,原諒我的無知吧……
?
這幾個類,早已讓很多網(wǎng)友不耐煩了,它們是SqlConnection、SqlCommand、SqlDataReader…
讓我們,慢慢地,把它們送走吧……
?
《十八相送》是越劇《梁山伯與祝英臺》中的最精彩的片段,可惜,不會有多少人這么有耐心地傾聽那悠悠的、凄美的愛情了….
?
那么,我們簡化一下,分六步吧:
一相送,送到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(); //簡單地說,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ù)庫訪問函數(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 會自動關(guān)閉此連接 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); return rdr; } catch { conn.Close(); throw; } //finally //{ // conn.Close(); //} } } }
這個通用數(shù)據(jù)庫訪問函數(shù)可以進一步完善如下:
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 會自動關(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); } } } }
因為重點在過程,在結(jié)構(gòu),代碼都比較簡單,唯一值得一提的是SqlConnection的關(guān)閉問題,在最后比較完善的數(shù)據(jù)庫訪問函數(shù)中(這是SQLHelper中的源代碼),沒有使用using()結(jié)構(gòu),也沒有顯示關(guān)閉,主要原因是調(diào)用ExecuteReader方法時,使用了參數(shù) CommandBehavior 并將其設(shè)置為 CloseConnection:
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
根據(jù)MSDN的說法:如果創(chuàng)建了 SqlDataReader 并將 CommandBehavior 設(shè)置為 CloseConnection ,則關(guān)閉 SqlDataReader 會自動關(guān)閉此連接。
參考網(wǎng)址: http://msdn.microsoft.com/zh-cn/library/y6wy5a0f(v=vs.80).aspx
?
?更多文章請參閱博客 http://blog.csdn.com/yousuosi
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
