这几天的工作主要是完成一个公司合作推广的项目,前端采用.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#操作数据库过程,希望能对各位看官有所帮助。