技术开发 频道

基于Oracle构建.NET应用

  连接字符串和对象

  Oracle 连接字符串和 Oracle 名称解析是不可分的。假定我们在 tnsnames.ora 文件中定义了一个数据库别名 OraDb,如下:

  OraDb=

  (DESCRIPTION=

  (ADDRESS_LIST=

  (ADDRESS=(PROTOCOL=TCP)(HOST=OTNSRVR)(PORT=1521))

  )

  (CONNECT_DATA=

  (SERVER=DEDICATED)

  (SERVICE_NAME=ORCL)

  )

  )

  OraDb 别名定义客户端的数据库地址连接信息。要使用上面所述的在 tnsnames.ora 文件中定义的 OraDb 别名,您需要使用以下语法:

  Dim oradb As String = "Data Source=OraDb;User Id=scott;Password=tiger;" ' VB.NET

  string 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;"

  // C#

  string oradb = "Data Source=(DESCRIPTION="

  + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(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.NET

  OracleConnection conn = new OracleConnection(oradb); // C#

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

  Dim conn As New OracleConnection() ' VB.NET

  conn.ConnectionString = oradb

  OracleConnection conn = new OracleConnection(); // C#

  conn.ConnectionString = oradb;

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

  conn.Open() ' VB.NET

  conn.Open(); // C#

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

  Command 对象

  Command 对象用于指定执行的 SQL 命令文本 — SQL 字符串或存储过程。类似于 Connection 对象,它必须从完成其类的实例化,并且它拥有一个重载的构造函数。在本示例中,ODP.NET 将执行一个 SQL 查询,返回部门表 (DEPT) 中部门编号 (DEPTNO) 为 10 的部门名称 (DNAME)。

  Dim sql As String = "select dname from dept where deptno = 10" ' VB.NET

  Dim cmd As New OracleCommand(sql, conn)

  cmd.CommandType = CommandType.Text

  string sql = "select dname from dept where deptno = 10"; // C#

  OracleCommand cmd = new OracleCommand(sql, conn);

  cmd.CommandType = CommandType.Text;

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

  检索标量值

  从数据库中检索数据可以通过实例化一个 OracleDataReader 对象并使用 ExecuteReader 方法(它返回一个 OracleDataReader 对象)来实现。可以通过将列名或以零为基数的列序号传递给 OracleDataReader 来访问返回的数据。

  Dim dr As OracleDataReader = cmd.ExecuteReader() ' Visual Basic

  dr.Read()

  Label1.Text = dr.Item("dname") ' retrieve by column name

  Label1.Text = dr.Item(0) ' retrieve the first column in the select list

  Label1.Text = dr.GetString(0) ' return a .NET data type

  Label1.Text = dr.GetOracleString(0) ' return an Oracle data type

  某些类型的存取程序用于返回 .NET 原生数据类型,其他的存取程序用于返回 Oracle 原生数据类型。所有这些存取程序都提供 C#、Visual Basic 或任何其他 .NET 语言版本。以零为基数的序号被传递给存取程序,以指定返回哪一列。

  OracleDataReader dr = cmd.ExecuteReader(); // C#

  dr.Read();

  label1.Text = dr["dname"].ToString(); // C# retrieve by column name

  label1.Text = dr.GetString(0).ToString(); // return a .NET data type

  label1.Text = dr.GetOracleString(0).ToString(); // return an Oracle data type

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

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

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

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

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

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

  关闭并清除

  当不在需要到数据库的连接时,可以调用连接对象的 Close 方法或 Dispose 方法来关闭此连接。Dispose 方法调用 Close 方法。

  conn.Close() ' Visual Basic

  conn.Dispose() ' Visual Basic

  conn.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);

  }

  此外,OracleCommand 包括 Dispose 方法;OracleDataReader 包括 Close 方法和 Dispose 方法。关闭并删除 .NET 对象可以释放系统资源,从而确保高效的应用程序性能,这在高负载情况下尤为重要。您可以试验在上机操作 1(从数据库中检索数据)和上机操作 2(增加交互性)中学到的一些概念。

0
相关文章