当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 浅析ASP.NET中C++和J#的混合应用

ASP.NET
asp.net GridView控件中模板列CheckBox全选、反选、取消
asp.net GridView 删除时弹出确认对话框(包括内容提示)
asp.net DropDownList 三级联动下拉菜单实现代码
asp DataTable添加列和行的三种方法
Asp.net 页面调用javascript变量的值
asp.net 长文章通过设定的行数分页
asp.net 定时间点执行任务的简易解决办法
asp.net 页面延时五秒,跳转到另外的页面
asp.net 动态输出透明gif图片
asp.net DataList与Repeater用法区别
asp.net Javascript获取CheckBoxList的value
asp.net程序在调式和发布之间图片路径问题的解决方法
asp.net下生成英文字符数字验证码的代码
asp.net 页面版文本框智能提示JSCode (升级版)
ASP.NET URL伪静态重写实现方法
ASP.NET 2.0 中Forms安全认证
asp.net 动态添加多个用户控件
asp.net Repeater显示父子表数据,无闪烁
asp.net 无法获取的内部内容,因为该内容不是文本 的解决方法
asp.net GridView排序简单实现

浅析ASP.NET中C++和J#的混合应用


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 64 ::
收藏到网摘: n/a

不想搞得太复杂,我仅仅演示实现 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的精髓之所在。