专注于网站技术与网络营销的博客

赞助商链接

« PowerDesigner导入SQL生成数据模型夏季的阳光,懒惰的季节! »

在Oracle数据库上构建.Net应用开发

        这几天的工作主要是完成一个公司合作推广的项目,前端采用.NET,后端数据库为Oracle9i;于是将之前写过的MySqlHelper重新改写了一下写成了OracleHelper来进行数据库的操作.方便了自己之外不敢独享,分享于此,大家共用;如有更好的方法或者性能优化敬请给我留言。

1 、下载Oracle Data Provider for .NET (ODP.NET)。
虽然微软也开发了Oracle数据库的.Net访问接口,但是年代已经久远,很久未曾更新了,于是从Oracle官方下载了ODP.NET,大家可以去访问一下Oracle官方中文网站,上面还是有不少关于Oracle的.Net开发资料(而且是中文的)

Oracle Data Provider for .NET (ODP.NET)下载地址

下载之后双击会解压生成两个目录,解压完成之后,运行DISK1中的Setup.exe会出现OUI界面,点击下一步至“可用产品”选择Oracle Data Provider for .NET 9.2.0.70。

 

2、构建项目添加ODP.NET引用

 安装完成之后接下来就是我们可以用来进行.Net开发了。首先需要将ODP.NET在Visual Studio 2003项目中引用。引用方法如下图

 

3、数据库操作类SqlHelper.cs

using System;
using System.Data;
using Oracle.DataAccess.Client;

namespace MMS_Deliver

{
 /// <summary>
 /// ORASqlHelper 的摘要说明。
 /// </summary>
 public class ORASqlHelper
 {

  public static readonly string CONN_STR = "Data Source=HNCE;User Id=hedy;Password=123456;";

  public ORASqlHelper()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  /// <summary>
  /// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
  /// </summary>
  /// <param name="connectionString">OracleConnection有效的SQL连接字符串</param>
  /// <param name="commandType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="commandText">SQL语句或存储过程</param>
  /// <param name="commandParameters">SqlParameter[]参数数组</param>
  /// <returns>SqlDataReader:执行结果的记录集</returns>
  public static OracleDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
  {
   OracleCommand cmd = new OracleCommand();
   OracleConnection conn = new OracleConnection(connString);

   // 我们在这里用 try/catch 是因为如果这个方法抛出异常,我们目的是关闭数据库连接,再抛出异常,
   // 因为这时不会有DataReader存在,此后commandBehaviour.CloseConnection将不会工作。
   try
   {
    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
    OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    cmd.Parameters.Clear();
    return rdr;
   }
   catch
   {
    conn.Close();
    throw;
   }
  }

  /// <summary>
  /// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
  /// </summary>
  /// <param name="connectionString">OracleConnection有效的SQL连接字符串</param>
  /// <param name="commandType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="commandText">SQL语句或存储过程</param>
  /// <returns>SqlDataReader:执行结果的记录集</returns>
  public static OracleDataReader ExecuteReader(string connString, CommandType cmdType,string cmdText)
  {
   return ExecuteReader(connString,cmdType,cmdText,(OracleParameter[])null);
  }

  /// <summary>
  /// 用提供的方法,执行带参数的SQL命令,返回值为该命令所影响的行数
  /// </summary>
  /// <param name="connString">OracleConnection有效的SQL连接字符串</param>
  /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="cmdText">SQL语句或存储过程</param>
  /// <param name="cmdParameters">SQL语句所带的参数集</param>
  /// <returns>int:该命令所影响的行数</returns>
  public static int ExecuteNonQuery(string connString,CommandType cmdType,string cmdText, params OracleParameter[] cmdParameters)
  {
   
   OracleCommand cmd = new OracleCommand();

   using (OracleConnection conn = new OracleConnection(connString))
   {
    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
    int val = cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    return val;
   }
  }


  /// <summary>
  /// 用提供的方法,执行SQL命令,返回值为该命令所影响的行数
  /// </summary>
  /// <param name="connString">OracleConnection有效的SQL连接字符串</param>
  /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="cmdText">SQL语句或存储过程</param>
  /// <returns>int:该命令所影响的行数</returns>
  public static int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText)
  {
   return ExecuteNonQuery(connString, cmdType, cmdText, (OracleParameter[])null);
  }
  

  /// <summary>
  /// 用提供的方法,执行带参数的SQL命令,返回值为结果集中第一行的第一列或空引用(如果结果集为空)。
  /// </summary>
  /// <param name="connString">OracleConnection有效的SQL连接字符串</param>
  /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="cmdText">SQL语句或存储过程</param>
  /// <param name="cmdParameters">SQL语句所带的参数集</param>
  /// <returns></returns>
  public static string ExecuteScalar(string connString,CommandType cmdType,string cmdText,params OracleParameter[] cmdParameters)
  {
   OracleCommand cmd = new OracleCommand();
   using(OracleConnection conn = new OracleConnection(connString))
   {
    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
    return cmd.ExecuteScalar().ToString();
   }
   
  }


  /// <summary>
  /// 用提供的方法,执行SQL命令,返回值为结果集中第一行的第一列或空引用(如果结果集为空)。
  /// </summary>
  /// <param name="connString">OracleConnection有效的SQL连接字符串</param>
  /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="cmdText">SQL语句或存储过程</param>
  /// <returns></returns>
  public static string ExecuteScalar(string connString,CommandType cmdType,string cmdText)
  {
   return ExecuteScalar(connString,cmdType,cmdText,(OracleParameter[])null);
  }

 

  /// <summary>
  /// 用提供的方法,执行带参数的SQL命令,返回值为DataSet数据集
  /// </summary>
  /// <param name="connString">OracleConnection有效的SQL连接字符串</param>
  /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="cmdText">SQL语句或存储过程</param>
  /// <param name="cmdParameters">SQL语句所带的参数集</param>
  /// <returns>Datat:该命令的结果集</returns>
  public static DataSet ExecuteDataSet(string connString,CommandType cmdType,string cmdText,params OracleParameter[] cmdParameters)
  {
   OracleCommand cmd = new OracleCommand();
   
   using(OracleConnection conn = new OracleConnection(connString))
   {
   
    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
    OracleDataAdapter ada = new OracleDataAdapter(cmd);
    DataSet ds = new DataSet();
    ada.Fill(ds);
    cmd.Parameters.Clear();
    return ds;
   }
  }


  /// <summary>
  /// 用提供的方法,执行SQL命令,返回值为DataSet数据集
  /// </summary>
  /// <param name="connString">OracleConnection有效的SQL连接字符串</param>
  /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="cmdText">SQL语句或存储过程</param>
  /// <returns>Datat:该命令的结果集</returns>
  public static DataSet ExecuteDataSet(string connString,CommandType cmdType,string cmdText)
  {
   return ExecuteDataSet(connString,cmdType,cmdText,(OracleParameter[])null);
  }


  /// <summary>
  /// 为执行命令做好准备:打开数据库连接,命令语句,设置命令类型(SQL语句或存储过程),函数语取。
  /// </summary>
  /// <param name="cmd">SqlCommand 组件</param>
  /// <param name="conn">OracleConnection 组件</param>
  /// <param name="cmdType">语句类型:CommandType.Text、CommandType.StoredProcedure</param>
  /// <param name="cmdText">SQL语句,可以为存储过程</param>
  /// <param name="cmdParms">SQL参数数组 private</param>
  public static void PrepareCommand(OracleCommand cmd, OracleConnection conn, CommandType cmdType, string cmdText, OracleParameter[] cmdParms)
  {

   if (conn.State != ConnectionState.Open)
    conn.Open();

   cmd.Connection = conn;
   cmd.CommandText = cmdText;
 

   cmd.CommandType = cmdType;

   if (cmdParms != null)
   {
    foreach (OracleParameter parm in cmdParms)
     cmd.Parameters.Add(parm);
   }
  }
 }
}

进行Oracle参数化查询的时候在SQL SERVER的参数符号是@,在Oracle中变成了:  这次在不同的数据库之间操作现在将他们的参数符号列表一下:

@                SQL SERVER

?                  MySQL

:                   Oracle

在此次开发的过程之中,Oracle官网上的几篇文章给了我很大的帮助,现将其链接于此,供大家查阅。

在 Oracle 数据库上构建 .NET 应用程序   作者:John Paul Cook

基于 Oracle 数据库开发安全的 .NET 应用程序 作者:John Paul Cook

以上仅是我对于一个暂时应用项目的一个简单应用,其中并没有充分考虑过大的负载和性能问题;最基本的C#操作数据库过程,希望能对各位看官有所帮助。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-Blog 1.8 Spirit Build 80710

Copyright 2005 - 2008, 完美生活(专注于网站技术与网络营销的博客). Some Rights Reserved.