热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

c#实现的操作oracle通用类

这篇文章主要介绍了c#实现的操作oracle通用类,用来操作oracle数据库十分的方便,需要的朋友可以参考下

修改整理的一个通用类,用来操作oracle数据库 十分的方便,支持直接操作sql语句和Hash表操作.现在修补MIS我都用这个类,节约了大 量的代码与工作良!在老孙的指点下,偶将操作oracle,sql server ,access三种数据库的通用类集成在一起写了个数据抽象工厂,同时支持三种数据库无缝切换...以后整理出来.

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
  // =====================================
  // =========内部调用函数完====================
  // ====================================
 }
 }

推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
幸福的肖巍
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有