推薦:解析.NET中的動態(tài)編譯技術代碼的動態(tài)編譯并執(zhí)行是一個.NET平臺提供給我們的很強大的工具用以靈活擴展(當然是面對內部開發(fā)人員)復雜而無法估算的邏輯,并通過一些額外的代碼來擴展我們已有 的應用程序。這在很大程度上給我們提供了另外一種擴展的方式(當然這并不能算是嚴格意義上的
不想搞得太復雜,我僅僅演示實現(xiàn) DataReader和DataSet,起個拋磚引玉的作用,也顧不得代碼結構是否優(yōu)美、性能是否良好,能夠達到本文的目的即可。
為了方便大家親自動手實踐,數(shù)據(jù)庫使用的是ACCESS,文章末尾有下載鏈接。實際項目中要使用SqlServer和ORACLE的話,把幾個OleDb函數(shù)換個名字即可,怎么換就不用我多說了。
相同的功能,我用三種語言來實現(xiàn),首先,給出.NET的“標準語言”——C#版本作為基本參照。
以下是C#版本:
main_cs.dll文件源碼:
| 以下為引用的內容: using System; using System.Data; using System.Data.OleDb; using System.Text; public class main_cs:System.Web.UI.Page { OleDbDataReader dr; OleDbCommand cmd; DataSet ds; OleDbDataAdapter adp; OleDbConnection conn; StringBuilder connStr; public void Page_Load() { connStr = new StringBuilder("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="); connStr.Append(Server.MapPath("image.mdb")); conn = new OleDbConnection(connStr.ToString()); cmd = new OleDbCommand("SELECT title FROM image_data",conn); conn.Open(); dr = cmd.ExecuteReader(); while(dr.Read()) { Response.Write(dr["title"]); } dr.Close(); conn.Close(); ds = new DataSet(); adp = new OleDbDataAdapter("SELECT title FROM image_data",conn); adp.Fill(ds); Response.Write(ds.Tables[0].Rows[0]["title"]); } } |
以下是C 版本:
在VisualStudio2003中創(chuàng)建C .Net類庫,命名net_dll,項目中引用System.Data、System.Web、System.XML,生成net_dll.dll文件,以下是主文件全部源碼(其它那些頭文件、資源文件什么亂七八糟的統(tǒng)統(tǒng)不用理會,當它們不存在):
| 以下為引用的內容: #include "stdafx.h" #include "net_dll.h" #using #using #using #using using namespace System;; using namespace System::Xml; using namespace System::Web; using namespace System::Text; using namespace System::Data; using namespace System::Data::OleDb; public __gc class main : public System::Web::UI::Page { private: OleDbDataReader __gc* dr; OleDbCommand __gc* cmd; DataSet __gc* ds; OleDbDataAdapter __gc* adp; OleDbConnection __gc* conn; StringBuilder __gc* connStr; public: void Page_Load() { connStr = new StringBuilder("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="); connStr->Append(HttpContext::Current->Server->MapPath("image.mdb")); conn = new OleDbConnection(connStr->ToString()); cmd = new OleDbCommand("SELECT title FROM image_data",conn); conn->Open(); dr = cmd->ExecuteReader(); while(dr->Read()) { Response->Write(dr->get_Item("title")); } dr->Close(); conn->Close(); ds = new DataSet(); adp = new OleDbDataAdapter("SELECT title FROM image_data",conn); adp->Fill(ds); Response->Write(ds->Tables->get_Item(0)->Rows->get_Item(0)->get_Item("title")); } }; |
道理同C ,使用J#創(chuàng)建類庫,命名main_jsl,項目中引用System.Data、System.Web、System.XML,源碼如下:
| 以下為引用的內容: import System.Data.*; import System.Data.OleDb.*; import System.Web.*; import System.Text.*; public class main_jsl extends System.Web.UI.Page { OleDbDataReader dr; OleDbCommand cmd; DataSet ds; OleDbDataAdapter adp; OleDbConnection conn; StringBuilder connStr; public void Page_Load() { connStr = new StringBuilder("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="); connStr.Append(get_Server().MapPath("image.mdb")); conn = new OleDbConnection(connStr.ToString()); cmd = new OleDbCommand("SELECT title FROM image_data",conn); conn.Open(); dr = cmd.ExecuteReader(); while(dr.Read()) { get_Response().Write(dr.get_Item("title")); } dr.Close(); conn.Close(); ds = new DataSet(); adp = new OleDbDataAdapter("SELECT title FROM image_data",conn); adp.Fill(ds); get_Response().Write(ds.get_Tables().get_Item(0).get_Rows().get_Item(0).get_Item("title")); } } |
完畢,DLL文件放置在站點根目錄的Bin文件夾下面即可。
以上三個文件的功能完全是一樣的。
通過以上三種代碼的觀察,我們可以發(fā)現(xiàn),C#的代碼相當簡潔(其實能夠寫得最簡潔的是Jscript.Net,下篇文章再說),J#其次,C 就比較難看了。
在DataTable和DataReader的操作上,可以看到J#和C 大量使用了get_Item()函數(shù),我估計J#和C 都是經(jīng)過Object變換的,可能會對性能造成少許的影響。
使用這兩種語言創(chuàng)建ASP.NET,對于習慣了C 和JAVA的朋友來說,可能會比較有用。
我相信每種語言都有它的長處,大家互相取長補短,構造一個良好的整體,曾經(jīng)看到過不少C#的初學者,似乎都對VB.NET有偏見,以“從來不用VB”為榮耀,還有一些朋友,對C .Net和J#的了解比較少,便誤會為這兩種語言沒有用途,實際上這些認識都是片面的。
我舉個例子:
| 以下為引用的內容: /* Jscript | Jscript.Net */ var conn = Server.CreateObject("ADODB.Connection"); conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" Server.MapPath("image.mdb")); var rs = conn.Execute("SELECT * FROM image_data"); while(!rs.EOF) { Response.Write(rs("title").value); rs.MoveNext(); } rs.Close(); conn.Close(); |
不用認為這只是ASP,這同樣也是地地道道的ASP.NET。雖然在我們.NET開發(fā)者的眼中,RecordSet的名聲可能沒有DataReader要好,但是這不在本文的討論范圍,這里只說:倘若硬是要用C#實現(xiàn)以上相同功能的話,結果只能是 執(zhí)行慢、代碼長、結構復雜。
在.NET的世界里,沒有哪個語言最好、哪個語言最爛的說法,五個語言各自有長處短處,大家生成的都是IL中間代碼,也就是說,它們天生就可以互相融合,這才是.NET的精髓之所在。
分享:注意.NET中容易混淆的幾組重要概念許多朋友在學習和開發(fā).NET程序的過程中經(jīng)常發(fā)現(xiàn)一些誤用.NET概念的情況。本文將對AJAX、LINQ、Lambda等相關的概念進行梳理,希望在明確這些概念之后,大家能夠把注意力集中在對于具體問題的分析解決上,而不要讓溝通成為瓶頸。 在這篇文章中,希望澄清三組概
新聞熱點
疑難解答
圖片精選