解析ASP.NET中C 和J#的混合應用_.Net教程
推薦:解析.NET中的動態編譯技術代碼的動態編譯并執行是一個.NET平臺提供給我們的很強大的工具用以靈活擴展(當然是面對內部開發人員)復雜而無法估算的邏輯,并通過一些額外的代碼來擴展我們已有 的應用程序。這在很大程度上給我們提供了另外一種擴展的方式(當然這并不能算是嚴格意義上的
不想搞得太復雜,我僅僅演示實現 DataReader和DataSet,起個拋磚引玉的作用,也顧不得代碼結構是否優美、性能是否良好,能夠達到本文的目的即可。
為了方便大家親自動手實踐,數據庫使用的是ACCESS,文章末尾有下載鏈接。實際項目中要使用SqlServer和ORACLE的話,把幾個OleDb函數換個名字即可,怎么換就不用我多說了。
相同的功能,我用三種語言來實現,首先,給出.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中創建C .Net類庫,命名net_dll,項目中引用System.Data、System.Web、System.XML,生成net_dll.dll文件,以下是主文件全部源碼(其它那些頭文件、資源文件什么亂七八糟的統統不用理會,當它們不存在):
以下為引用的內容: #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")); } }; |
以下是J#版本:
道理同C ,使用J#創建類庫,命名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文件夾下面即可。
以上三個文件的功能完全是一樣的。
通過以上三種代碼的觀察,我們可以發現,C#的代碼相當簡潔(其實能夠寫得最簡潔的是Jscript.Net,下篇文章再說),J#其次,C 就比較難看了。
在DataTable和DataReader的操作上,可以看到J#和C 大量使用了get_Item()函數,我估計J#和C 都是經過Object變換的,可能會對性能造成少許的影響。
使用這兩種語言創建ASP.NET,對于習慣了C 和JAVA的朋友來說,可能會比較有用。
我相信每種語言都有它的長處,大家互相取長補短,構造一個良好的整體,曾經看到過不少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開發者的眼中,RecordSet的名聲可能沒有DataReader要好,但是這不在本文的討論范圍,這里只說:倘若硬是要用C#實現以上相同功能的話,結果只能是 執行慢、代碼長、結構復雜。
在.NET的世界里,沒有哪個語言最好、哪個語言最爛的說法,五個語言各自有長處短處,大家生成的都是IL中間代碼,也就是說,它們天生就可以互相融合,這才是.NET的精髓之所在。
分享:注意.NET中容易混淆的幾組重要概念許多朋友在學習和開發.NET程序的過程中經常發現一些誤用.NET概念的情況。本文將對AJAX、LINQ、Lambda等相關的概念進行梳理,希望在明確這些概念之后,大家能夠把注意力集中在對于具體問題的分析解決上,而不要讓溝通成為瓶頸。 在這篇文章中,希望澄清三組概
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-解析ASP.NET中C 和J#的混合應用。