分手快乐 发表于 2015-1-16 22:34:10

ASP.NET网页编程之在Oracle上构建 .NET 使用程序

我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。oracle|程序懂得构建利用Oracle数据库的.NET使用程序所触及到的基础但不成或缺的历程

本文触及的下载

・示例代码

・OracleDataProviderfor.NET(ODP.NET)

跟着Microsoft的.NET框架的渐渐盛行,很多开辟职员急切想懂得关于将.NET使用程序与Oracle集成的最好的体例的信息―不但在基础的连通性方面,还包含与利用VisualStudio.NET(VS.NET)举行无效的使用程序开辟的干系。

在本文中,我将申明构建利用Oracle数据库的.NET使用程序所触及到的基础但不成或缺的历程,包含:

怎样增加工程援用,以在您的.NET工程中撑持Oracle类

怎样创立Oracle数据库毗连字符串

怎样利用Connection、Command和DataReader工具。

您将无机会使用您在三个上机操纵理论中学到的内容,难度局限从对照简单到更庞大。

.NETDataProvider

除基础的Oracle客户端连通性软件,.NET使用程序还必要利用称为manageddataprovider(个中"managed"指的是代码由.NET框架办理)的工具。数据供给程序是.NET使用程序代码和Oracle客户端连通性软件之间的层。在几近一切情形下,最优的功能都是经由过程利用为特定命据库平台优化了的供给程序而不是一样平常的.NETOLEDB数据供给程序完成的。



Oracle、Microsoft和第三方供给商都供应了针对Oracle产物举行了优化的数据供给程序。Oracle和Microsoft收费供应其Oracle数据供给程序。(Microsoft为.NET框架的1.1版供应的供给程序包括在该框架中,不必要独自下载或安装。)一些第三方数据供给程序撑持Oracle的较早的版本,大概不必要安装Oracle客户端软件。在本文中,我们假定利用OracleDataProviderfor.NET(ODP.NET),并独自供应下载。



当安装了ODP.NET和一切请求的Oracle客户端连通性软件时,就能够入手下手利用VisualStudio.NET举行使用程序开辟了。在入手下手开辟前,请先确认客户端连通性。假如您在VS.NET地点的盘算机上利用SQL*Plus可以与Oracle毗连,那末证实您已准确地安装和设置了Oracle客户端软件。



假如您刚打仗Oracle,那末请参阅OracleDataProviderfor.NET开辟职员指南10g版本1(10.1)中的“与Oracle数据库毗连”部分,以懂得ODP.NET的背景信息,或参阅Oracle数据库办理员指南10g版本1(10.1),以懂得关于办理Oracle数据库的通用信息。您还能够查阅“利用ODP.NET与Oracle数据库毗连”示例代码“办法”文档。



在VisualStudio.NET中创立工程



在启动VS.NET以后,第一个义务是创立一个工程。您能够单击NewProject按钮或选择File|New|Project...。



呈现一个NewProject对话框。在对话框左边的ProjectTypes下,选择您的编程言语。在这个例子中,我们选择VB.NET。在右边的Templates下,选择一个工程模板。为复杂起见,这里选择WindowsApplication。



您将必要为工程(我们利用OtnWinApp)息争决计划(我们利用OtnSamples)指定成心义的称号。一个办理计划包括一个或多个工程。当一个办理计划仅包括一个工程时,很多人对两者利用不异的称号。



增加援用



由于我们的工程必需与Oracle数据库毗连,因而必需增加一个到包括我们选择的数据供给程序的dll的援用。在SolutionExplorer内,选择References节点,右键单击并选择AddReference。大概,您能够转至菜单栏并选择Project,然后选择AddReference。



呈现AddReference对话框。



从列表当选择Oracle.DataAccess.dll,然后单击Select按钮,最初单击OK按钮,使您的工程可以找到ODP.NET数据供给程序。



VB.NET/C#语句



在增加援用以后,尺度的做法是要增加VB.NETImports语句、C#using语句或J#import语句。从手艺上说这些语句不是需要的,可是利用它们可让您不需用冗杂且完全称号来援用数据库工具。



依照常规,这些语句呈现在代码文件的顶部或顶部四周,在定名空间或类声明之前。



ImportsSystem.DataVB.NETImportsOracle.DataAccess.ClientODP.NETOraclemanagedproviderusingSystem.Data;//C#usingOracle.DataAccess.Client;//ODP.NETOraclemanagedproviderimportSystem.Data.*;//J#importOracle.DataAccess.Client;//ODP.NETOraclemanagedprovider





毗连字符串和工具



Oracle毗连字符串和Oracle称号剖析是不成分的。假定我们在tnsnames.ora文件中界说了一个数据库别号OraDb,以下:



OraDb=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)))

要利用下面所述的在tnsnames.ora文件中界说的OraDb别号,您必要利用以下语法:

DimoradbAsString="DataSource=OraDb;UserId=scott;Password=tiger;"VB.NETstringoradb="DataSource=OraDb;UserId=scott;Password=tiger;";//C#

不外,您能够修正毗连字符串,如许就不需用tnsnames.ora文件。只需用在tnsnames.ora文件中界说别号的语句交换别号便可。

VB.NETDimoradbAsString="DataSource=(DESCRIPTION="_+"(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))"_+"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"_+"UserId=scott;Password=tiger;"stringoradb="DataSource=(DESCRIPTION="//C#+"(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))"+"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"+"UserId=scott;Password=tiger;";

正如您在下面看到的那样,用户名和口令是以不加密的文本情势嵌进到毗连字符串中的。这是创立毗连字符串的最复杂的办法。但是,从平安的角度而言不加密文本的办法是不成取的。并且,您必要懂得编译的.NET使用程序代码仅比不加密文本情势的源代码文件略微平安一点。能够十分烦琐的反编译.NETdll和exe文件,进而检察原始的不加密文本情势的内容。(加密实践上是准确的办理计划,但这个主题与我们这里的会商相差太远。)

接上去,您必需从毗连类中完成一个毗连工具的实例化。毗连字符串必需与毗连工具联系关系。



DimconnAsNewOracleConnection(oradb)VB.NETOracleConnectionconn=newOracleConnection(oradb);//C#

注重,经由过程将毗连字符串传送给毗连工具的机关器(该机关器举行了重载),毗连字符串与毗连工具创建联系关系。机关函数的其他重载同意以下这些替换的语法:

DimconnAsNewOracleConnection()VB.NETconn.ConnectionString=oradbOracleConnectionconn=newOracleConnection();//C#conn.ConnectionString=oradb;

在毗连字符串与毗连工具创建联系关系以后,利用Open办法来创立实践的毗连。

conn.Open()VB.NETconn.Open();//C#

我们将在稍后先容毛病处置。



Command工具



Command工具用于指定实行的SQL命令文本―SQL字符串或存储历程。相似于Connection工具,它必需从完成其类的实例化,而且它具有一个重载的机关函数。



DimsqlAsString="selectdnamefromdeptwheredeptno=10"VB.NETDimcmdAsNewOracleCommand(sql,conn)cmd.CommandType=CommandType.Textstringsql="selectdnamefromdeptwheredeptno=10";//C#OracleCommandcmd=newOracleCommand(sql,conn);cmd.CommandType=CommandType.Text;

分歧的重载,语法的布局略微有点分歧。Command工具有效于实行命令文本的办法。分歧的办法合用于分歧范例的SQL命令。





检索标量值





从数据库中检索数据能够经由过程实例化一个DataReader工具并利用ExecuteReader办法(它前往一个OracleDataReader工具)来完成。经由过程将列称号或以零为基数的列序号传送给项属性B.NET开辟职员能够会见前往的数据。另外一种选择是利用存取程序范例办法来前往列数据。



DimdrAsOracleDataReader=cmd.ExecuteReader()VB.NETdr.Read()Label1.Text=dr.Item("dname")retrievebycolumnnameLabel1.Text=dr.Item(0)retrievethefirstcolumnintheselectlistLabel1.Text=dr.GetString(0)retrievethefirstcolumnintheselectlist

C#开辟职员必需利用存取器办法来检索数据。有得当范例的存取程序用于前往.NET当地数据范例,其他的存取程序用于前往当地Oracle数据范例。以零为基数的序号被传送给存取程序,以指定前往哪一列。

OracleDataReaderdr=cmd.ExecuteReader();//C#dr.Read();label1.Text=dr.GetString(0);//C#retrievethefirstcolumnintheselectlist

在这个简化的例子中,dname的前往值是一个字符串,它用来设置标签控件的文本的属性值(也是一个字符串)。但假如检索的是deptno,而不是字符串,那末将呈现数据范例不婚配的情形。当源数据范例与方针数据范例不婚配时,.NET运转时将实验隐式地转换数据范例。偶然数据范例不兼容,则隐式转换将失利,并跳出一个非常警报。但即便能够举行隐式转换,利用显式数据范例转换仍比用隐式数据范例转换好。

到整型的显式转换显现以下:



Label1.Text=CStr(dr.Item("deptno"))VB.NETintegertostringcast

在隐式转换上,C#的容错才能不如VB.NET。您必需本人实行显式转换:

stringdeptno=dr.GetInt16("deptno").ToString();//C#

您能够显式地转换标量值和数组。



封闭并扫除



能够挪用毗连工具的Close办法或Dispose办法来封闭到数据库的毗连。Dispose办法挪用Close办法。



conn.Close()VB.NETconn.Dispose()VB.NETconn.Close();//C#conn.Dispose();//C#

作为可选项,C#供应了一种在毗连超越局限时主动扫除毗连的特别语法。利用using关头字可启用这一特征。

using(OracleConnectionconn=newOracleConnection(oradb)){conn.Open();OracleCommandcmd=newOracleCommand();cmd.Connection=conn;cmd.CommandText="selectdnamefromdeptwheredeptno=10";cmd.CommandType=CommandType.Text;OracleDataReaderdr=cmd.ExecuteReader();dr.Read();label1.Text=dr.GetString(0);}

您能够实验在上机操纵1(从数据库中检索数据)和上机操纵2(增添交互性)中学到的一些观点。



毛病处置



Try-Catch-Finally布局的毛病处置是.NET言语的一部分。上面是利用Try-Catch-Finally语法的一个绝对最小的例子:



DimconnAsNewOracleConnection(oradb)VB.NETTryconn.Open()DimcmdAsNewOracleCommandcmd.Connection=conncmd.CommandText="selectdnamefromdeptwheredeptno="+TextBox1.Textcmd.CommandType=CommandType.TextIfdr.Read()ThenLabel1.Text=dr.Item("dname")orusedr.Item(0)EndIfCatchexAsExceptioncatchesanyerrorMessageBox.Show(ex.Message.ToString())Finallyconn.Dispose()EndTryOracleConnectionconn=newOracleConnection(oradb);//C#try{conn.Open();OracleCommandcmd=newOracleCommand();cmd.Connection=conn;cmd.CommandText="selectdnamefromdeptwheredeptno="+textBox1.Text;cmd.CommandType=CommandType.Text;if(dr.Read())//C#{label1.Text=dr.GetString(0);}}catch(Exceptionex)//catchesanyerror{MessageBox.Show(ex.Message.ToString());}finally{conn.Dispose();}

固然这类办法将得当地捕捉实验从数据库中猎取数据时产生的任何毛病,但这类办法对用户却不友爱。



OracleDBA或开辟职员很分明ORA-12545的意义,可是终极用户不分明。一种更好的办理计划是增加一条分外的Catch语句来捕捉最多见的数据库毛病并显现对用户友爱的动静。



CatchexAsOracleExceptioncatchesonlyOracleerrorsIfInStr(1,ex.Message.ToString(),"ORA-1:",CompareMethod.Text)ThenMessageBox.Show("Errorattemptingtoinsertduplicatedata.")ElseIfInStr(1,ex.Message.ToString(),"ORA-12545:",CompareMethod.Text)ThenMessageBox.Show("Thedatabaseisunavailable.")ElseMessageBox.Show("Databaseerror:"+ex.Message.ToString())EndIfCatchexAsExceptioncatchesanyerrorMessageBox.Show(ex.Message.ToString())catch(OracleExceptionex)//catchesonlyOracleerrors{switch(ex.Number){case1:MessageBox.Show("Errorattemptingtoinsertduplicatedata.");break;case12545:MessageBox.Show("Thedatabaseisunavailable.");break;default:MessageBox.Show("Databaseerror:"+ex.Message.ToString());break;}}catch(Exceptionex)//catchesanyerror{MessageBox.Show(ex.Message.ToString());}

注重下面的代码示例中的两条Catch语句。假如没有捕捉就任何Oracle毛病,那末将跳过第一条Catch语句分支,让第二条Catch语句来捕捉其他任何范例的毛病。在代码中,应当依据从特别到一样平常的按次对Catch语句排序。在实行了对用户友爱的非常处置代码以后,ORA-12545毛病动静



Finally代码将一直实行,而不管毛病是不是产生。经由过程在Finally代码块中到场毗连工具的Close或Dispose办法挪用,在实行了Try-Catch-Finally代码段以后,数据库毗连将一直封闭。试图封闭没有翻开的数据库毗连不会招致毛病。比方,假如数据库不成用,数据库毗连没有翻开,那末Finally代码块将试图封闭不存在的毗连。实行过剩的Close或Dispose是有效的。只需将一条Close或Dispose办法放到Finally代码块中,将包管封闭毗连。



使用DataReader检索多个值



到今朝为止,我们的示例仅申明了怎样检索单个值。DataReader能够检索多列和多行的值。起首举行多行、单列的查询:



selectdeptno,dname,locfromdeptwheredeptno=10

要猎取列的值,可使用以零为基数的序号或列名。序号与查询中的按次相干。因此,能够在VB.NET中经由过程利用dr.Item(2)或dr.Item("loc")来查询loc列的值。



上面是将dname和来自上一查询的loc列串联起来的代码段:



Label1.Text="The"+dr.Item(1)+"departmentisin"+dr.Item("loc")VB.NETLabel1.Text="The"+dr.GetString(1)+"departmentisin"+dr.GetString(2);//C#

如今我们举行前往多行的查询:

selectdeptno,dname,locfromdept

要处置从DataReader中前往的多行,必要某品种型的轮回布局。别的,必要一个能够显现多行的控件。DataReader是一个仅正向的只读游标,因而不克不及将其与可更新或完整可转动的控件(如WindowsFormsDataGrid控件)绑缚在一同。DataReader与ListBox控件兼容,如以下代码段所示:

Whiledr.Read()VB.NETListBox1.Items.Add("The"+dr.Item(1)+"departmentisin"+dr.Item("loc"))EndWhilewhile(dr.Read())//C#{listBox1.Items.Add("The"+dr.GetString(1)+"departmentisin"+dr.GetString(2);}

上机操纵3(使用DataReader检索多列和多行)重点先容了这些观点中的一部分。

总结



本文向您先容了利用VS.NET编程言语会见Oracle数据库的历程。您如今应当可以毗连数据库并检索多列和多行。





JohnPaulCook(johnpaulcook@email.com)是寓居在休斯顿的一名数据库和.NET参谋。他撰写了很多关于.NET、Oracle和其他主题的文章,并从1986年以来一向开辟干系数据库使用程序。他今朝的乐趣包含VisualStudio2005和Oracle10g。他是Oracle认证DBA和MicrosoftMCSDfor.NET。





上机操纵1:从数据库中检索数据



起首向Windows表单增加一个按钮控件和一个标签控件。务必在这些控件上方保存空间,以便在上机操纵2中增加控件。











增加代码,它们用于从Oracle数据库中检索数据并在表单上显现了局。将代码放在按钮的单击事务处置程序中。入手下手这项义务的最简单的体例是双击该按钮,由于它将为事务处置程序创立一个stub。











在PublicClass声明之前增加VB.NETImports语句,或在定名空间声明之前增加C#using语句。

ImportsSystem.DataVB.NETImportsOracle.DataAccess.ClientODP.NETOraclemanagedproviderusingSystem.Data;//C#usingOracle.DataAccess.Client;//ODP.NETOraclemanagedprovider

在PrivateSub和EndSub语句之间增加VB.NET版本事务语句代码(确保用您的服务器的主机称号替换OTNSRVR):

DimoradbAsString="DataSource=(DESCRIPTION=(ADDRESS_LIST="_+"(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))"_+"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"_+"UserId=scott;Password=tiger;"DimconnAsNewOracleConnection(oradb)VB.NETconn.Open()DimcmdAsNewOracleCommandcmd.Connection=conncmd.CommandText="selectdnamefromdeptwheredeptno=10"cmd.CommandType=CommandType.TextDimdrAsOracleDataReader=cmd.ExecuteReader()dr.Read()Label1.Text=dr.Item("dname")ordr.Item(0)conn.Dispose()

将以下C#代码增加到按钮的单击事务处置程序中的括号{和}之间,并确保用您的服务器的主机称号替换OTNSRVR:

stringoradb="DataSource=(DESCRIPTION=(ADDRESS_LIST="+"(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))"+"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"+"UserId=scott;Password=tiger;";OracleConnectionconn=newOracleConnection(oradb);//C#conn.Open();OracleCommandcmd=newOracleCommand();cmd.Connection=conn;cmd.CommandText="selectdnamefromdeptwheredeptno=10";cmd.CommandType=CommandType.Text;OracleDataReaderdr=cmd.ExecuteReader();dr.Read();label1.Text=dr.GetString(0);conn.Dispose();

运转使用程序。单击按钮。您将看到以下内容:





上机操纵2:增添交互性





如今在代码中实行了数据库会见的基本,下一步是为使用程序增添交互性。能够增加一个文本框来吸收用户输出的部门号码(deptno),而不是运转硬编码的查询。



向表单中增加一个文本框控件和另外一个标签控件:将Label2控件的文本属性设为EnterDeptno:并确保未将TextBox1的Text属性设为任何器材。





修正界说选择字符串的代码:

cmd.CommandText="selectdnamefromdeptwheredeptno="+TextBox1.TextVB.NETcmd.CommandText="selectdnamefromdeptwheredeptno="+textBox1.Text;//C#

运转使用程序。在deptno输出10,测试使用程序。输出一个有效的deptno,从头测试使用程序。使用程序将加入。



修正代码以避免在输出有效的deptno时呈现毛病。让我们回忆一下,ExecuteReader办法实践前往一个工具。

Ifdr.Read()ThenVB.NETLabel1.Text=dr.Item("dname")ElseLabel1.Text="deptnonotfound"EndIfif(dr.Read())//C#{label1.Text=dr.Item("dname");}Else{label1.Text="deptnonotfound";}

输出不存在的deptno数字,测试使用程序。如今使用程序不再加入。输出字母A取代数字,然后单击按钮。使用程序加入。很分明,我们的使用程序必要更好的办法以处置毛病。

大概有人会指出,使用程序应该不充许用户举行将招致毛病的有效输出,但终极使用程序必需增加健旺的毛病处置功效。不是一切的毛病都是可防备的,因而必需实行毛病处置。





上机操纵3:使用DataReader检索多行和多列

如今检索了单个值,下一步就是使用DataReader检索多行和多列。增加一个ListBox控件到表单中,以显现了局。



增加一个ListBox控件到表单中。从头调剂控件的巨细,以填满表单的年夜部分宽度









从查询中删除where子句,并增加以以下:

cmd.CommandText="selectdeptno,dname,locfromdept"VB.NETcmd.CommandText="selectdeptno,dname,locfromdept";//C#

修正VB.NET代码,终极了局以下:

DimoradbAsString="DataSource=(DESCRIPTION=(ADDRESS_LIST="_+"(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))"_+"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"_+"UserId=scott;Password=tiger;"DimconnAsNewOracleConnection(oradb)VB.NETconn.Open()DimcmdAsNewOracleCommandcmd.Connection=conncmd.CommandText="selectdeptno,dname,locfromdept"cmd.CommandType=CommandType.TextDimdrAsOracleDataReader=cmd.ExecuteReader()Whiledr.Read()ListBox1.Items.Add("The"+dr.Item(1)+_"departmentisin"+dr.Item("loc"))EndWhileconn.Dispose()

修正您的C#代码,终极了局以下:

stringoradb="DataSource=(DESCRIPTION=(ADDRESS_LIST="+"(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))"+"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));"+"UserId=scott;Password=tiger;";OracleConnectionconn=newOracleConnection(oradb);//C#conn.Open();OracleCommandcmd=newOracleCommand();cmd.Connection=conn;cmd.CommandText="selectdnamefromdeptwheredeptno=10";cmd.CommandType=CommandType.Text;OracleDataReaderdr=cmd.ExecuteReader();while(dr.Read()){ListBox1.Items.Add("The"+dr.Item(1)+"departmentisin"+dr.GetString(0));}conn.Dispose();

供应代码下载中已实行了毛病处置。就安全性而言,Java已经远远低于VB.NET,更无法与安全性著称的C#相比。

谁可相欹 发表于 2015-1-19 16:51:24

ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。

冷月葬花魂 发表于 2015-1-24 15:45:44

可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。

分手快乐 发表于 2015-2-2 05:41:33

主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。

兰色精灵 发表于 2015-2-7 16:34:12

CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。

飘飘悠悠 发表于 2015-2-22 16:20:41

但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。

变相怪杰 发表于 2015-3-7 00:54:08

PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。

再现理想 发表于 2015-3-13 23:45:44

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

愤怒的大鸟 发表于 2015-3-20 22:40:02

主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
页: [1]
查看完整版本: ASP.NET网页编程之在Oracle上构建 .NET 使用程序