在Oracle上构建 .NET 应用程序

oracle|程序

了解构建使用 Oracle 数据库的 .NET 应用程序所涉及到的基本但不可或缺的过程

本文涉及的下载

· 示例代码

· Oracle Data Provider for .NET (ODP.NET)

随着 Microsoft 的 .NET 框架的逐渐流行,许多开发人员迫切想了解关于将 .NET 应用程序与 Oracle 集成的最好的方式的信息 — 不仅在基本的连通性方面,还包括与使用 Visual Studio.NET (VS.NET) 进行有效的应用程序开发的关系。

在本文中,我将说明构建使用 Oracle 数据库的 .NET 应用程序所涉及到的基本但不可或缺的过程,包括:

如何添加工程引用,以在您的 .NET 工程中支持 Oracle 类

如何创建 Oracle 数据库连接字符串

如何使用 Connection、Command 和 DataReader 对象。

您将有机会应用您在三个上机操作实践中学到的内容,难度范围从比较容易到更复杂。

.NET Data Provider

除了基本的 Oracle 客户端连通性软件,.NET 应用程序还需要使用称为 managed data provider(其中 "managed" 指的是代码由 .NET 框架管理)的工具。 数据供应程序是 .NET 应用程序代码和 Oracle 客户端连通性软件之间的层。 在几乎所有情况下,最优的性能都是通过使用为特定数据库平台优化了的供应程序而不是一般的 .NET OLE DB 数据供应程序实现的。

Oracle、Microsoft 和第三方供应商都提供了针对 Oracle 产品进行了优化的数据供应程序。 Oracle 和 Microsoft 免费提供其 Oracle 数据供应程序。 (Microsoft 为 .NET 框架的 1.1 版提供的供应程序包含在该框架中,不需要单独下载或安装。) 一些第三方数据供应程序支持 Oracle 的较早的版本,或者不需要安装 Oracle 客户端软件。 在本文中,我们假设使用 Oracle Data Provider for .NET (ODP.NET),并单独提供下载。

当安装了 ODP.NET 和所有要求的 Oracle 客户端连通性软件时,就可以开始使用 Visual Studio.NET 进行应用程序开发了。 在开始开发前,请先确认客户端连通性。 如果您在 VS.NET 所在的计算机上使用 SQL*Plus 能够与 Oracle 连接,那么证明您已经正确地安装和配置了 Oracle 客户端软件。

如果您刚接触 Oracle,那么请参阅 Oracle Data Provider for .NET 开发人员指南 10g 版本 1 (10.1) 中的“与 Oracle 数据库连接”部分,以了解 ODP.NET 的背景信息,或参阅 Oracle 数据库管理员指南 10g 版本 1 (10.1),以了解关于管理 Oracle 数据库的通用信息。 您还可以查阅“使用 ODP.NET 与 Oracle 数据库连接”示例代码“方法”文档。

在 Visual Studio.NET 中创建工程

在启动 VS.NET 之后,第一个任务是创建一个工程。 您可以单击 New Project 按钮或选择 File | New | Project...。

出现一个 New Project 对话框。 在对话框左侧的 Project Types 下,选择您的编程语言。 在这个例子中,我们选择 VB.NET。 在右侧的 Templates 下,选择一个工程模板。 为简单起见,这里选择 Windows Application。

您将需要为工程(我们使用 OtnWinApp)和解决方案(我们使用 OtnSamples)指定有意义的名称。 一个解决方案包含一个或多个工程。 当一个解决方案仅包含一个工程时,许多人对二者使用相同的名称。

添加引用

因为我们的工程必须与 Oracle 数据库连接,因此必须添加一个到包含我们选择的数据供应程序的 dll 的引用。 在 Solution Explorer 内,选择 References 节点,右键单击并选择 Add Reference。 或者,您可以转至菜单栏并选择 Project,然后选择 Add Reference。

出现 Add Reference 对话框。

从列表中选择 Oracle.DataAccess.dll,然后单击 Select 按钮,最后单击 OK 按钮,使您的工程能够找到 ODP.NET 数据供应程序。

VB.NET/C# 语句

在添加引用之后,标准的做法是要添加 VB.NET Imports 语句、C# using 语句或 J# import 语句。 从技术上说这些语句不是必要的,但是使用它们可以让您不需用冗长且完整名称来引用数据库对象。

按照惯例,这些语句出现在代码文件的顶部或顶部附近,在命名空间或类声明之前。

Imports System.Data ' VB.NETImports Oracle.DataAccess.Client ' ODP.NET Oracle managed providerusing System.Data; // C#using Oracle.DataAccess.Client; // ODP.NET Oracle managed providerimport System.Data.*; // J#import Oracle.DataAccess.Client; // ODP.NET Oracle managed provider

连接字符串和对象

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 别名,您需要使用以下语法:

Dim oradb As String = "Data Source=OraDb;User Id=scott;Password=tiger;" ' VB.NETstring oradb = "Data Source=OraDb;User Id=scott;Password=tiger;"; // C#

不过,您可以修改连接字符串,这样就不需用 tnsnames.ora 文件。 只需用在 tnsnames.ora 文件中定义别名的语句替换别名即可。

' VB.NET Dim oradb As String = "Data Source=(DESCRIPTION=" _ + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" _ + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ + "User Id=scott;Password=tiger;"string oradb = "Data Source=(DESCRIPTION=" // C# + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" + "User Id=scott;Password=tiger;";

正如您在上面看到的那样,用户名和口令是以不加密的文本形式嵌入到连接字符串中的。 这是创建连接字符串的最简单的方法。 然而,从安全的角度而言不加密文本的方法是不可取的。 而且,您需要了解编译的 .NET 应用程序代码仅比不加密文本形式的源代码文件稍微安全一点。 可以非常简便的反编译 .NET dll 和 exe 文件,进而查看原始的不加密文本形式的内容。 (加密实际上是正确的解决方案,但这个主题与我们这里的讨论相差太远。)

接下来,您必须从连接类中完成一个连接对象的实例化。 连接字符串必须与连接对象关联。

Dim conn As New OracleConnection(oradb) ' VB.NETOracleConnection conn = new OracleConnection(oradb); // C#

注意,通过将连接字符串传递给连接对象的构造器(该构造器进行了重载),连接字符串与连接对象建立关联。 构造函数的其他重载允许以下这些替代的语法:

Dim conn As New OracleConnection() ' VB.NETconn.ConnectionString = oradbOracleConnection conn = new OracleConnection(); // C#conn.ConnectionString = oradb;

在连接字符串与连接对象建立关联之后,使用 Open 方法来创建实际的连接。

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

我们将在稍后介绍错误处理。

Command 对象

Command 对象用于指定执行的 SQL 命令文本 — SQL 字符串或存储过程。 类似于 Connection 对象,它必须从完成其类的实例化,并且它拥有一个重载的构造函数。

Dim sql As String = "select dname from dept where deptno = 10" ' VB.NETDim cmd As New OracleCommand(sql, conn)cmd.CommandType = CommandType.Textstring sql = "select dname from dept where deptno = 10"; // C#OracleCommand cmd = new OracleCommand(sql, conn);cmd.CommandType = CommandType.Text;

不同的重载,语法的结构稍微有点不同。 Command 对象有用于执行命令文本的方法。 不同的方法适用于不同类型的 SQL 命令。

检索标量值

从数据库中检索数据可以通过实例化一个 DataReader 对象并使用 ExecuteReader 方法(它返回一个 OracleDataReader 对象)来实现。 通过将列名称或以零为基数的列序号传递给项属性 B.NET 开发人员可以访问返回的数据。 另一种选择是使用存取程序类型方法来返回列数据。

Dim dr As OracleDataReader = cmd.ExecuteReader() ' VB.NETdr.Read()Label1.Text = dr.Item("dname") ' retrieve by column nameLabel1.Text = dr.Item(0) ' retrieve the first column in the select listLabel1.Text = dr.GetString(0) ' retrieve the first column in the select list

C# 开发人员必须使用存取器方法来检索数据。 有适当类型的存取程序用于返回 .NET 本地数据类型,其他的存取程序用于返回本地 Oracle 数据类型。 以零为基数的序号被传递给存取程序,以指定返回哪一列。

OracleDataReader dr = cmd.ExecuteReader(); // C#dr.Read();label1.Text = dr.GetString(0); // C# retrieve the first column in the select list

在这个简化的例子中,dname 的返回值是一个字符串,它用来设置标签控件的文本的属性值(也是一个字符串)。 但如果检索的是 deptno,而不是字符串,那么将出现数据类型不匹配的情况。 当源数据类型与目标数据类型不匹配时,.NET 运行时将尝试隐式地转换数据类型。 有时数据类型不兼容,则隐式转换将失败,并跳出一个异常警报。 但即使可以进行隐式转换,使用显式数据类型转换仍比用隐式数据类型转换好。

到整型的显式转换显示如下:

Label1.Text = CStr(dr.Item("deptno")) ' VB.NET integer to string cast

在隐式转换上,C# 的容错能力不如 VB.NET。 您必须自己执行显式转换:

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

您可以显式地转换标量值以及数组。

关闭并清除

可以调用连接对象的 Close 方法或 Dispose 方法来关闭到数据库的连接。 Dispose 方法调用 Close 方法。

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

作为可选项,C# 提供了一种在连接超出范围时自动清除连接的特殊语法。 使用 using 关键字可启用这一特性。

using (OracleConnection conn = new OracleConnection(oradb)){conn.Open();OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "select dname from dept where deptno = 10";cmd.CommandType = CommandType.Text; OracleDataReader dr = cmd.ExecuteReader(); dr.Read(); label1.Text = dr.GetString(0);}

您可以试验在上机操作 1(从数据库中检索数据)和上机操作 2(增加交互性)中学到的一些概念。

错误处理

Try-Catch-Finally 结构的错误处理是 .NET 语言的一部分。 下面是使用 Try-Catch-Finally 语法的一个相对最小的例子:

Dim conn As New OracleConnection(oradb) ' VB.NETTry conn.Open() Dim cmd As New OracleCommand cmd.Connection = conn cmd.CommandText = "select dname from dept where deptno = " + TextBox1.Textcmd.CommandType = CommandType.Text If dr.Read() Then Label1.Text = dr.Item("dname") ' or use dr.Item(0) End IfCatch ex As Exception ' catches any error MessageBox.Show(ex.Message.ToString())Finally conn.Dispose()End TryOracleConnection conn = new OracleConnection(oradb); // C#try{conn.Open();OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "select dname from dept where deptno = " + textBox1.Text;cmd.CommandType = CommandType.Text; if (dr.Read()) // C# { label1.Text = dr.GetString(0); }}catch (Exception ex) // catches any error{ MessageBox.Show(ex.Message.ToString());}finally{ conn.Dispose();}

虽然这种方法将适当地捕获尝试从数据库中获取数据时发生的任何错误,但这种方法对用户却不友好。

Oracle DBA 或开发人员很清楚 ORA-12545 的意义,但是最终用户不清楚。 一种更好的解决方案是添加一条额外的 Catch 语句来捕获最常见的数据库错误并显示对用户友好的消息。

Catch ex As OracleException ' catches only Oracle errors If InStr(1, ex.Message.ToString(), "ORA-1:", CompareMethod.Text) Then MessageBox.Show("Error attempting to insert duplicate data.") ElseIf InStr(1, ex.Message.ToString(), "ORA-12545:", CompareMethod.Text) Then MessageBox.Show("The database is unavailable.") Else MessageBox.Show("Database error: " + ex.Message.ToString()) End IfCatch ex As Exception ' catches any error MessageBox.Show(ex.Message.ToString())catch (OracleException ex) // catches only Oracle errors{ switch (ex.Number) {case 1: MessageBox.Show("Error attempting to insert duplicate data."); break; case 12545: MessageBox.Show("The database is unavailable."); break; default: MessageBox.Show("Database error:" + ex.Message.ToString()); break; }}catch (Exception ex) // catches any error{ 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 可以检索多列和多行的值。 首先进行多行、单列的查询:

select deptno, dname, loc from dept where deptno = 10

要获取列的值,可以使用以零为基数的序号或列名。 序号与查询中的顺序相关。 因而,可以在 VB.NET 中通过使用 dr.Item(2) 或 dr.Item("loc") 来查询 loc 列的值。

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

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

现在我们进行返回多行的查询:

select deptno, dname, loc from dept

要处理从 DataReader 中返回的多行,需要某种类型的循环结构。 此外,需要一个可以显示多行的控件。 DataReader 是一个仅正向的只读游标,因此不能将其与可更新或完全可滚动的控件(如 Windows Forms DataGrid 控件)捆绑在一起。 DataReader 与 ListBox 控件兼容,如以下代码段所示:

While dr.Read() ' VB.NET ListBox1.Items.Add("The " + dr.Item(1) + " department is in " + dr.Item("loc")) End Whilewhile (dr.Read()) // C#{ listBox1.Items.Add("The " + dr.GetString(1) + " department is in " + dr.GetString(2);}

上机操作 3(利用 DataReader 检索多列和多行)重点介绍了这些概念中的一部分。

总结

本文向您介绍了使用 VS.NET 编程语言访问 Oracle 数据库的过程。 您现在应该能够连接数据库并检索多列和多行。

John Paul Cook (johnpaulcook@email.com) 是居住在休斯顿的一位数据库和 .NET 顾问。 他撰写了许多关于 .NET、Oracle 和其他主题的文章,并从 1986 年以来一直开发关系数据库应用程序。他目前的兴趣包括 Visual Studio 2005 和 Oracle 10g。 他是 Oracle 认证 DBA 和 Microsoft MCSD for .NET。

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

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

添加代码,它们用于从 Oracle 数据库中检索数据并在表单上显示结果。 将代码放在按钮的单击事件处理程序中。 开始这项任务的最容易的方式是双击该按钮,因为它将为事件处理程序创建一个 stub。

在 Public Class 声明之前添加 VB.NET Imports 语句,或在命名空间声明之前添加 C# using 语句。

Imports System.Data ' VB.NETImports Oracle.DataAccess.Client ' ODP.NET Oracle managed providerusing System.Data; // C#using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider

在 Private Sub 和 End Sub 语句之间添加 VB.NET 版本 事件语句代码(确保用您的服务器的主机名称替代 OTNSRVR):

Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _ + "(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" _ + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ + "User Id=scott;Password=tiger;"Dim conn As New OracleConnection(oradb) ' VB.NETconn.Open()Dim cmd As New OracleCommandcmd.Connection = conncmd.CommandText = "select dname from dept where deptno = 10"cmd.CommandType = CommandType.TextDim dr As OracleDataReader = cmd.ExecuteReader()dr.Read()Label1.Text = dr.Item("dname") ' or dr.Item(0)conn.Dispose()

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

string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" + "(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" + "User Id=scott;Password=tiger;";OracleConnection conn = new OracleConnection(oradb); // C#conn.Open();OracleCommand cmd = new OracleCommand();cmd.Connection = conn;cmd.CommandText = "select dname from dept where deptno = 10";cmd.CommandType = CommandType.Text;OracleDataReader dr = cmd.ExecuteReader();dr.Read();label1.Text = dr.GetString(0);conn.Dispose();

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

上机操作 2: 增加交互性

现在在代码中实施了数据库访问的基础,下一步是为应用程序增加交互性。 可以添加一个文本框来接收用户输入的部门号码 (deptno),而不是运行硬编码的查询。

向表单中添加一个文本框控件和另一个标签控件: 将 Label2 控件的文本属性设为 Enter Deptno: 并确保没有将 TextBox1 的 Text 属性设为任何东西。

修改定义选择字符串的代码:

cmd.CommandText = "select dname from dept where deptno = " + TextBox1.Text 'VB.NETcmd.CommandText = "select dname from dept where deptno = " + textBox1.Text; // C#

运行应用程序。 在 deptno 输入 10,测试应用程序。 输入一个无效的 deptno,重新测试应用程序。 应用程序将退出。

修改代码以防止在输入无效的 deptno 时出现错误。 让我们回顾一下,ExecuteReader 方法实际返回一个对象。

If dr.Read() Then ' VB.NET Label1.Text = dr.Item("dname")Else Label1.Text = "deptno not found"End Ifif (dr.Read()) // C#{ label1.Text = dr.Item("dname");}Else{ label1.Text = "deptno not found";}

输入不存在的 deptno 数字,测试应用程序。 现在应用程序不再退出。 输入字母 A 代替数字,然后单击按钮。 应用程序退出。 很明显,我们的应用程序需要更好的方法以处理错误。

可能有人会指出,应用程序应当不充许用户进行将导致错误的无效输入,但最终应用程序必须添加强健的错误处理功能。 不是所有的错误都是可预防的,因此必须实施错误处理。

上机操作 3: 利用 DataReader 检索多行和多列

现在检索了单个值,下一步就是利用 DataReader 检索多行和多列。 添加一个 ListBox 控件到表单中,以显示结果。

添加一个 ListBox 控件到表单中。 重新调整控件的大小,以填满表单的大部分宽度

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

cmd.CommandText = "select deptno, dname, loc from dept" ' VB.NETcmd.CommandText = "select deptno, dname, loc from dept"; // C#

修改 VB.NET 代码,最终结果如下:

Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _ + "(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" _ + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _ + "User Id=scott;Password=tiger;"Dim conn As New OracleConnection(oradb) ' VB.NETconn.Open()Dim cmd As New OracleCommandcmd.Connection = conncmd.CommandText = "select deptno, dname, loc from dept" cmd.CommandType = CommandType.TextDim dr As OracleDataReader = cmd.ExecuteReader()While dr.Read() ListBox1.Items.Add("The " + dr.Item(1) + _" department is in " + dr.Item("loc"))End Whileconn.Dispose()

修改您的 C# 代码,最终结果如下:

string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" + "(ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" + "User Id=scott;Password=tiger;";OracleConnection conn = new OracleConnection(oradb); // C#conn.Open();OracleCommand cmd = new OracleCommand();cmd.Connection = conn;cmd.CommandText = "select dname from dept where deptno = 10";cmd.CommandType = CommandType.Text;OracleDataReader dr = cmd.ExecuteReader();while (dr.Read()){ ListBox1.Items.Add("The " + dr.Item(1) + " department is in " + dr.GetString(0));}conn.Dispose();

提供代码下载中已经实施了错误处理。

时间: 2024-07-30 10:52:40

在Oracle上构建 .NET 应用程序的相关文章

在PaaS上构建SaaS应用程序需要注意什么

遗留系统含有成千上万个执行一大批业务功能的服务组件.比如说,假设贵企业运行的一个内部遗留系统中的一套组件向企业高管提供一份统计报告.为了赶在截至日之前获得这份每周提交的报告,该高管应该考虑将必要的组件迁移到新的软件即服务(SaaS)应用程序. 如果经济可行性研究表明这种迁移是明智的决策,他应该与其他高管以及由开发人员.系统工程师和业务分析人员组成的一个团队合作,将遗留系统细分成多个组件,然后着手开发那个应用程序. 1.识别遗留系统资产 开发团队.高管和遗留系统负责人需要识别遗留系统的资产.这些资

在Oracle数据库上构建.NET应用程序

oracle|程序|数据|数据库 随着 Microsoft 的 .NET 框架的逐渐流行,许多开发人员迫切想了解关于将 .NET 应用程序与 Oracle 集成的最好的方式的信息 - 不仅在基本的连通性方面,还包括与使用 Visual Studio.NET (VS.NET) 进行有效的应用程序开发的关系. 在本文中,我将说明构建使用 Oracle 数据库的 .NET 应用程序所涉及到的基本但不可或缺的过程,包括: 如何添加工程引用,以在您的 .NET 工程中支持 Oracle 类 如何创建 Or

在Google App Engine Java版上构建电子书分享网站

简介:"云计算"是目前热门的技术方向,本文从 Google 的云计算平台 App Engine 入手,简单介 绍了 Google 面向 Java 开发人员的云计算平台.从一个实际的电子书分享应用构建出发,讲述了如何在 Google App Engine 平台上构建这个应用程序. "云计算"基本概念的介绍 根据维基百科上的定义,云计算是一种动态易扩展,而且通常是通过互联网提供的虚拟化的资源计算 方式,用户不需要了解云内部的细节,也不必具有云内部的专业知识,或者直接控制

在J2ME平台上构建你的邮件程序

程序 在J2ME平台上构建你的邮件程序Jacky Pan Table of Contents1. 教程的介绍和程序的安装 2. 程序的结构 3. 界面的设计 4. 账户的管理 5. MIDlet和Servlet的网络连接 6. Servlet和JavaMail 7. 简单的XML 8. 小结 1.教程的介绍和程序的安装 本教程讲述了如何在J2ME平台上编写一个简单的邮件应用程序,包括界面的设计,邮件的发送/接受,邮件账户的创建/修改/删除,后台Servlet的编写. 为了运行本教程所带的演示程序

如何在linux上构建objective-c程序

    swfit目前还是os x独占,以后会不会扩展到其他系统还未可知,但objective-c并不只存在于os x,在linux下gcc和clang都支持obj-c哦,下面简单把如何在ubuntu上构建obj-c做一下说明: 1 安装obj-c或obj-c++(如果需要的话)所需库:   * build-essential     * gobjc     * gobjc++     * gnustep-devel  直接用apt-get install 搞定吧 :) 2 用经典的hello

JDeveloper构建Struts应用程序

内置的Struts支持提高了Oracle Java集成开发环境的生产力. Jakarta Struts是一个由Apache software foundation支持的开放源码项目.Struts提供了一个使用标准J2EE(Java 2 Platform,Enterprise Edition)组件(如JavaServer Pagers(JSP).servlet和JavaBean)构建Model 2--模型-视图-控制器(Model-View-Controller,MVC)应用设计范例的一个变体--

用Ext JS构建Ajax应用程序:一种用于富因特网应用程序开发的JavaScript框架

简介:Ext JS 是一种强大的 JavaScript 库,它通过使用可重用的对象和部件简化了 Asynchronous JavaScript + XML(Ajax)开发.本文介绍 Ext JS,概述它背后的面向对象 JavaScript 设计概念,解释如何使用 Ext JS 框架开发富因特网应用程序的用户界面元素. 当今有许许多多的 Web 开发框架,开发人员很难判断哪些框架值得花时间去学习.Ext JS 是一种 JavaScript 开发框架,这种强大的 JavaScript 库通过使用可重

使用Grails构建富Internet应用程序,第1部分:使用Grails和Flex构建Web应用程序

简介:富 Internet 应用程序(Rich Internet Applications,RIA)通过浏览器保证桌面应用程序 的动态性和功能.RIA 的主要特征之一就是将表示层移动到客户机,并使用服务器上健壮的 RESTful 服 务层支持它.这种想法借助 SOUI(Service Oriented User Interface)和 SOFEA(Service Oriented Front End Architecture)之类的热门词汇得到传播. 关于本系列 这个系列探索一些应 用程序架构,

用开源工具创建BlackBerry应用程序,第3部分 构建社交网络应用程序

在数字时代,社交网络应用程序对消费者和业务市场的影响是最有吸引力的 奇迹之一.营销专家改变了与潜在客户打交道的方式,具有相同志趣的群体能够 快速组建起来,这都与社交网络分不开.2008 年秋季的美国总统竞选表明,社 交网络已经成为成功的政治竞选的一部分.社交网络与流行的.强大的 BlackBerry 平台的结合将是一个充满活力的组合.本教程是"用开源工具 创建 BlackBerry 应用程序"系列的第 3 部分,它探索了为何 BlackBerry 是编写和部署社交网络应用程序的强大移动