C# Oracle数据库操作类实例详解

 更新时间:2020年6月25日 11:36  点击:2025

本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接、关闭连接、输出记录集、执行Sql语句,返回带分页功能的dataset 、取表里字段的类型和长度等,同时还有哈稀表自动插入数据库等高级任务。需要特别指出的是:在执行SQL语句,返回 DataReader之前一定要先用.read()打开,然后才能读到数据,再用hashTable对数据库进行insert,update,del操作,注意此时只能用默认的数据库连接"connstr"。

完整的C# Oracle数据库类实例代码如下:

using System;
using System.Data;
using System.Data.OracleClient;
using System.Collections;
using System.Reflection;
namespace MyOraComm
{
 /// ConnDbForOracle 的摘要说明。
 public class ConnForOracle
 {
  protected OracleConnection Connection;
  private string connectionString;
  public ConnForOracle()
  {
  string connStr;
  connStr = System.Configuration.ConfigurationSettings.AppSettings["connStr"].ToString();
  connectionString = connStr;
  Connection = new OracleConnection(connectionString);
  }
 
  #region 带参数的构造函数 
  /// 带参数的构造函数
  /// 数据库联接字符串
  public ConnForOracle(string ConnString)
  {
  string connStr;
  connStr = System.Configuration.ConfigurationSettings.AppSettings[ConnString].ToString();
  Connection = new OracleConnection(connStr);
  }
  #endregion

  #region 打开数据库 
  /// 打开数据库
  public void OpenConn()
  {
  if(this.Connection.State!=ConnectionState.Open)
   this.Connection.Open();
  }
  #endregion
  #region 关闭数据库联接 
  /// 关闭数据库联接
  public void CloseConn()
  {
  if(Connection.State==ConnectionState.Open)
   Connection.Close();
  }
  #endregion

  #region 执行SQL语句,返回数据到DataSet中
  /// 执行SQL语句,返回数据到DataSet中
  /// sql语句
  /// 自定义返回的DataSet表名
  /// 返回DataSet
  public DataSet ReturnDataSet(string sql,string DataSetName)
  {
  DataSet dataSet=new DataSet();
  OpenConn();
  OracleDataAdapter OraDA=new OracleDataAdapter(sql,Connection);
  OraDA.Fill(dataSet,DataSetName);
  //  CloseConn();
  return dataSet;
  }
  #endregion

  #region 执行Sql语句,返回带分页功能的dataset 
  /// 执行Sql语句,返回带分页功能的dataset
  /// Sql语句
  /// 每页显示记录数
  /// <当前页/param>
  /// 返回dataset表名
  /// 返回DataSet
  public DataSet ReturnDataSet(string sql,int PageSize,int CurrPageIndex,string DataSetName)
  {
  DataSet dataSet=new DataSet();
  OpenConn();
  OracleDataAdapter OraDA=new OracleDataAdapter(sql,Connection);
  OraDA.Fill(dataSet,PageSize * (CurrPageIndex - 1), PageSize,DataSetName);
  //  CloseConn();
  return dataSet;
  }
  #endregion

  #region 执行SQL语句,返回 DataReader,用之前一定要先.read()打开,然后才能读到数据
  /// 执行SQL语句,返回 DataReader,用之前一定要先.read()打开,然后才能读到数据 
  /// sql语句
  /// 返回一个OracleDataReader
  public OracleDataReader ReturnDataReader(String sql)
  {
  OpenConn();
  OracleCommand command = new OracleCommand(sql,Connection);
  return command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
  }
  #endregion

  #region 执行SQL语句,返回记录总数数
  /// 执行SQL语句,返回记录总数数
  /// sql语句
  /// 返回记录总条数
  public int GetRecordCount(string sql)
  {
  int recordCount = 0;
  OpenConn();
  OracleCommand command = new OracleCommand(sql,Connection);
  OracleDataReader dataReader = command.ExecuteReader();
  while(dataReader.Read())
  {
   recordCount++;
  }
  dataReader.Close();
  //CloseConn();
  return recordCount;
  }
  #endregion

  #region 取当前序列,条件为seq.nextval或seq.currval
  /// 
  /// 取当前序列
  public decimal GetSeq(string seqstr)
  {
  decimal seqnum = 0;
  string sql="select "+seqstr+" from dual";
  OpenConn();
  OracleCommand command = new OracleCommand(sql,Connection);
  OracleDataReader dataReader = command.ExecuteReader();
  if(dataReader.Read())
  {
   seqnum=decimal.Parse(dataReader[0].ToString());
  }
  dataReader.Close();
  //  CloseConn();
  return seqnum;
  }
  #endregion
  #region 执行SQL语句,返回所影响的行数
  /// 执行SQL语句,返回所影响的行数
  public int ExecuteSQL(string sql)
  {
  int Cmd=0;
  OpenConn();
  OracleCommand command = new OracleCommand(sql,Connection);
  try
  {
   Cmd =command.ExecuteNonQuery(); 
  }
  catch
  {
  }
  finally
  {
   //CloseConn();
  }
  return Cmd;
  }
  #endregion
 
  //==用hashTable对数据库进行insert,update,del操作,注意此时只能用默认的数据库连接"connstr"
  #region 根据表名及哈稀表自动插入数据库 用法:Insert("test",ht)
  public int Insert(string TableName,Hashtable ht)
  {
  OracleParameter[] Parms=new OracleParameter[ht.Count];
  IDictionaryEnumerator et = ht.GetEnumerator();
  DataTable dt=GetTabType(TableName);
  System.Data.OracleClient.OracleType otype;
  int size=0;
  int i=0;
  while ( et.MoveNext() ) // 作哈希表循环
  {
   GetoType(et.Key.ToString().ToUpper(),dt,out otype,out size);
   System.Data.OracleClient.OracleParameter op=MakeParam(":"+et.Key.ToString(),otype,size,et.Value.ToString());
   Parms[i]=op; // 添加SqlParameter对象
   i=i+1;
  }
  string str_Sql=GetInsertSqlbyHt(TableName,ht); // 获得插入sql语句
  int val=ExecuteNonQuery(str_Sql,Parms);
  return val;
  }
  #endregion
 
  #region 根据相关条件对数据库进行更新操作 用法:Update("test","Id=:Id",ht); 
  public int Update(string TableName,string ht_Where, Hashtable ht)
  {
  OracleParameter[] Parms=new OracleParameter[ht.Count];
  IDictionaryEnumerator et = ht.GetEnumerator();
  DataTable dt=GetTabType(TableName);
  System.Data.OracleClient.OracleType otype;
  int size=0;
  int i=0;
  // 作哈希表循环
  while ( et.MoveNext() )
  {
   GetoType(et.Key.ToString().ToUpper(),dt,out otype,out size);
   System.Data.OracleClient.OracleParameter op=MakeParam(":"+et.Key.ToString(),otype,size,et.Value.ToString());
   Parms[i]=op; // 添加SqlParameter对象
   i=i+1;
  }
  string str_Sql=GetUpdateSqlbyHt(TableName,ht_Where,ht); // 获得插入sql语句
  int val=ExecuteNonQuery(str_Sql,Parms);
  return val;
  }
  #endregion
 
  #region del操作,注意此处条件个数与hash里参数个数应该一致 用法:Del("test","Id=:Id",ht)
  public int Del(string TableName,string ht_Where,Hashtable ht)
  {
  OracleParameter[] Parms=new OracleParameter[ht.Count];
  IDictionaryEnumerator et = ht.GetEnumerator();
  DataTable dt=GetTabType(TableName);
  System.Data.OracleClient.OracleType otype;
  int i=0;
  int size=0;
  // 作哈希表循环
  while ( et.MoveNext() )
  {
   GetoType(et.Key.ToString().ToUpper(),dt,out otype,out size);
   System.Data.OracleClient.OracleParameter op=MakeParam(":"+et.Key.ToString(),et.Value.ToString());
   Parms[i]=op; // 添加SqlParameter对象
   i=i+1;
  }
  string str_Sql=GetDelSqlbyHt(TableName,ht_Where,ht); // 获得删除sql语句
  int val=ExecuteNonQuery(str_Sql,Parms);
  return val;
  }
  #endregion 

  // ========上面三个操作的内部调用函数==================

  #region 根据哈稀表及表名自动生成相应insert语句(参数类型的)
  /// 根据哈稀表及表名自动生成相应insert语句 
  /// 要插入的表名
  /// 哈稀表
  /// 返回sql语句
  public static string GetInsertSqlbyHt(string TableName,Hashtable ht)
  {
  string str_Sql="";
  int i=0;
  int ht_Count=ht.Count; // 哈希表个数
  IDictionaryEnumerator myEnumerator = ht.GetEnumerator();
  string before="";
  string behide="";
  while ( myEnumerator.MoveNext() )
  {
   if (i==0)
   {
   before="("+myEnumerator.Key;
   }
   else if (i+1==ht_Count)
   {
   before=before+","+myEnumerator.Key+")";
   }
   else
   {
   before=before+","+myEnumerator.Key;
   }
   i=i+1;
  }
  behide=" Values"+before.Replace(",",",:").Replace("(","(:");
  str_Sql="Insert into "+TableName+before+behide;
  return str_Sql;
  }
  #endregion

  #region 根据表名,where条件,哈稀表自动生成更新语句(参数类型的)
  public static string GetUpdateSqlbyHt(string Table,string ht_Where,Hashtable ht)
  {
  string str_Sql="";
  int i=0;
  int ht_Count=ht.Count; // 哈希表个数
  IDictionaryEnumerator myEnumerator = ht.GetEnumerator();
  while ( myEnumerator.MoveNext() )
  {
   if (i==0)
   {
   if (ht_Where.ToString().ToLower().IndexOf((myEnumerator.Key+"=:"+myEnumerator.Key).ToLower())==-1)
   {
    str_Sql=myEnumerator.Key+"=:"+myEnumerator.Key;
   }
   }
   else
   {
   if (ht_Where.ToString().ToLower().IndexOf((":"+myEnumerator.Key+" ").ToLower())==-1)
   {
    str_Sql=str_Sql+","+myEnumerator.Key+"=:"+myEnumerator.Key;
   }
   }
   i=i+1;
  }
  if (ht_Where==null || ht_Where.Replace(" ","")=="") // 更新时候没有条件
  {
   str_Sql="update "+Table+" set "+str_Sql;
  }
  else
  {
   str_Sql="update "+Table+" set "+str_Sql+" where "+ht_Where;
  }
  str_Sql=str_Sql.Replace("set ,","set ").Replace("update ,","update ");
  return str_Sql;
  }
  #endregion

  #region 根据表名,where条件,哈稀表自动生成del语句(参数类型的)
  public static string GetDelSqlbyHt(string Table,string ht_Where,Hashtable ht)
  {
  string str_Sql="";
  int i=0;
  
  int ht_Count=ht.Count; // 哈希表个数
  IDictionaryEnumerator myEnumerator = ht.GetEnumerator();
  while ( myEnumerator.MoveNext() )
  {
   if (i==0)
   {
   if (ht_Where.ToString().ToLower().IndexOf((myEnumerator.Key+"=:"+myEnumerator.Key).ToLower())==-1)
   {
    str_Sql=myEnumerator.Key+"=:"+myEnumerator.Key;
   }
   }
   else
   {
   if (ht_Where.ToString().ToLower().IndexOf((":"+myEnumerator.Key+" ").ToLower())==-1)
   {
    str_Sql=str_Sql+","+myEnumerator.Key+"=:"+myEnumerator.Key;
   }
   }
   i=i+1;
  }
  if (ht_Where==null || ht_Where.Replace(" ","")=="") // 更新时候没有条件
  {
   str_Sql="Delete "+Table;
  }
  else
  {
   str_Sql="Delete "+Table+" where "+ht_Where;
  }
  return str_Sql;
  }
  #endregion

  #region 生成oracle参数
  /// 
  /// 生成oracle参数
  /// 字段名
  /// 数据类型
  /// 数据大小
  /// 值
  public static OracleParameter MakeParam(string ParamName,System.Data.OracleClient.OracleType otype,int size,Object Value) 
  {
  OracleParameter para=new OracleParameter(ParamName,Value);
  para.OracleType=otype;
  para.Size=size;
  return para;
  }
  #endregion
  #region 生成oracle参数
  public static OracleParameter MakeParam(string ParamName,string Value) 
  {
  return new OracleParameter(ParamName, Value);
  }
  #endregion
  #region 根据表结构字段的类型和长度拼装oracle sql语句参数
  public static void GetoType(string key,DataTable dt,out System.Data.OracleClient.OracleType otype,out int size)
  {
  DataView dv=dt.DefaultView;
  dv.RowFilter="column_name='"+key+"'";
  string fType=dv[0]["data_type"].ToString().ToUpper();
  switch (fType)
  {
   case "DATE":
   otype= OracleType.DateTime;
   size=int.Parse(dv[0]["data_length"].ToString());
   break;
   case "CHAR":
   otype= OracleType.Char;
   size=int.Parse(dv[0]["data_length"].ToString());
   break;
   case "LONG":
   otype= OracleType.Double;
   size=int.Parse(dv[0]["data_length"].ToString());
   break;
   case "NVARCHAR2":
   otype= OracleType.NVarChar;
   size=int.Parse(dv[0]["data_length"].ToString());
   break;
   case "VARCHAR2":
   otype= OracleType.NVarChar;
   size=int.Parse(dv[0]["data_length"].ToString());
   break;
   default:
   otype= OracleType.NVarChar;
   size=100;
   break;
  }
  }
  #endregion
  #region动态 取表里字段的类型和长度,此处没有动态用到connstr,是默认的!by/文少
  public System.Data.DataTable GetTabType(string tabnale)
  {
  string sql="select column_name,data_type,data_length from all_tab_columns where table_name='"+tabnale.ToUpper()+"'";
  OpenConn();
  return (ReturnDataSet(sql,"dv")).Tables[0];
  }
  #endregion
  #region 执行sql语句 
  public int ExecuteNonQuery(string cmdText, params OracleParameter[] cmdParms) 
  {
  OracleCommand cmd = new OracleCommand();
  OpenConn(); 
  cmd.Connection=Connection;
  cmd.CommandText = cmdText;
  if (cmdParms != null) 
  {
   foreach (OracleParameter parm in cmdParms)
   cmd.Parameters.Add(parm);
  }
  int val = cmd.ExecuteNonQuery();
  cmd.Parameters.Clear();
  //conn.CloseConn();
  return val;
  }
  #endregion
 }
 }

使用时可将上述代码保存成oracle_dbconn.cs文件,再进行调用。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25