OracleHelper.cs
上传用户:simon2hong
上传日期:2021-11-18
资源大小:16746k
文件大小:9k
源码类别:

OA系统

开发平台:

C#

  1. using System;
  2. using System.Data;
  3. using System.Data.Common;
  4. using System.Text;
  5. using System.Data.OracleClient;
  6. namespace DBUtility
  7. {
  8.     /// <summary>
  9.     /// 数据库操作基类(for Oracle)
  10.     /// </summary>
  11.     internal class OracleHelper : IDBHelper
  12.     {
  13.         /// <summary>
  14.         /// 获取分页SQL
  15.         /// </summary>
  16.         /// <param name="tblName">表名</param>
  17.         /// <param name="pageSize">每页显示条数</param>
  18.         /// <param name="pageIndex">第几页</param>
  19.         /// <param name="fldSort">排序字段(最后一个不需要填写正序还是倒序,例如:id asc, name)</param>
  20.         /// <param name="fldDir">最后一个排序字段的正序或倒序(true为倒序,false为正序)</param>
  21.         /// <param name="condition">条件</param>
  22.         /// <returns>返回用于分页的SQL语句</returns>
  23.         private string GetPagerSQL(string tblName, int pageSize, int pageIndex, string fldSort, bool fldDir, string condition)
  24.         {
  25.             string strDir = fldDir ? " ASC" : " DESC";
  26.             StringBuilder strSql = new StringBuilder("select X.* from(");
  27.             strSql.AppendFormat(" select row_number() over(order by {0} {1}) as ROW_NO, * from {2}", fldSort, strDir, tblName);
  28.             if (!string.IsNullOrEmpty(condition))
  29.             {
  30.                 strSql.AppendFormat(" where {0}) X", condition);
  31.             }
  32.             else
  33.             {
  34.                 strSql.AppendFormat(") X");
  35.             }
  36.             strSql.AppendFormat(" where X.ROW_NO <= {0} and X.ROW_NO >= {1}", pageSize * pageIndex, pageSize * (pageIndex - 1) + 1);
  37.             return strSql.ToString();
  38.         }
  39.         /// <summary>
  40.         /// 分页获取数据
  41.         /// </summary>
  42.         /// <param name="connectionString">连接字符串</param>
  43.         /// <param name="tblName">表名</param>
  44.         /// <param name="fldName">字段名</param>
  45.         /// <param name="pageSize">页大小</param>
  46.         /// <param name="pageIndex">第几页</param>
  47.         /// <param name="fldSort">排序字段</param>
  48.         /// <param name="fldDir">升序{False}/降序(True)</param>
  49.         /// <param name="condition">条件(不需要where)</param>
  50.         public DbDataReader GetPageList(string connectionString, string tblName, int pageSize,
  51.             int pageIndex, string fldSort, bool fldDir, string condition)
  52.         {
  53.             string sql = GetPagerSQL(tblName, pageSize, pageIndex, fldSort, fldDir, condition);
  54.             return ExecuteReader(connectionString, CommandType.Text, sql, null);
  55.         }
  56.         /// <summary>
  57.         /// 得到数据条数
  58.         /// </summary>
  59.         public int GetCount(string connectionString, string tblName, string condition)
  60.         {
  61.             StringBuilder sql = new StringBuilder("select count(*) from " + tblName);
  62.             if (!string.IsNullOrEmpty(condition))
  63.                 sql.Append(" where " + condition);
  64.             object count = ExecuteScalar(connectionString, CommandType.Text, sql.ToString(), null);
  65.             return int.Parse(count.ToString());
  66.         }
  67.         /// <summary>
  68.         /// 执行查询,返回DataSet
  69.         /// </summary>
  70.         public DataSet ExecuteQuery(string connectionString, CommandType cmdType, string cmdText,
  71.             params DbParameter[] cmdParms)
  72.         {
  73.             using (OracleConnection conn = new OracleConnection(connectionString))
  74.             {
  75.                 using (OracleCommand cmd = new OracleCommand())
  76.                 {
  77.                     PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
  78.                     using (OracleDataAdapter da = new OracleDataAdapter(cmd))
  79.                     {
  80.                         DataSet ds = new DataSet();
  81.                         da.Fill(ds, "ds");
  82.                         cmd.Parameters.Clear();
  83.                         return ds;
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.         /// <summary>
  89.         /// 在事务中执行查询,返回DataSet
  90.         /// </summary>
  91.         public DataSet ExecuteQuery(DbTransaction trans, CommandType cmdType, string cmdText,
  92.             params DbParameter[] cmdParms)
  93.         {
  94.             OracleCommand cmd = new OracleCommand();
  95.             PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
  96.             OracleDataAdapter da = new OracleDataAdapter(cmd);
  97.             DataSet ds = new DataSet();
  98.             da.Fill(ds, "ds");
  99.             cmd.Parameters.Clear();
  100.             return ds;
  101.         }
  102.         /// <summary>
  103.         /// 执行 Transact-SQL 语句并返回受影响的行数。
  104.         /// </summary>
  105.         public int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText,
  106.             params DbParameter[] cmdParms)
  107.         {
  108.             OracleCommand cmd = new OracleCommand();
  109.             using (OracleConnection conn = new OracleConnection(connectionString))
  110.             {
  111.                 PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
  112.                 int val = cmd.ExecuteNonQuery();
  113.                 cmd.Parameters.Clear();
  114.                 return val;
  115.             }
  116.         }
  117.         /// <summary>
  118.         /// 在事务中执行 Transact-SQL 语句并返回受影响的行数。
  119.         /// </summary>
  120.         public int ExecuteNonQuery(DbTransaction trans, CommandType cmdType, string cmdText,
  121.             params DbParameter[] cmdParms)
  122.         {
  123.             OracleCommand cmd = new OracleCommand();
  124.             PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
  125.             int val = cmd.ExecuteNonQuery();
  126.             cmd.Parameters.Clear();
  127.             return val;
  128.         }
  129.         /// <summary>
  130.         /// 执行查询,返回DataReader
  131.         /// </summary>
  132.         public DbDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText,
  133.             params DbParameter[] cmdParms)
  134.         {
  135.             OracleCommand cmd = new OracleCommand();
  136.             OracleConnection conn = new OracleConnection(connectionString);
  137.             try
  138.             {
  139.                 PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
  140.                 OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  141.                 cmd.Parameters.Clear();
  142.                 return rdr;
  143.             }
  144.             catch
  145.             {
  146.                 conn.Close();
  147.                 throw;
  148.             }
  149.         }
  150.         /// <summary>
  151.         /// 在事务中执行查询,返回DataReader
  152.         /// </summary>
  153.         public DbDataReader ExecuteReader(DbTransaction trans, CommandType cmdType, string cmdText,
  154.             params DbParameter[] cmdParms)
  155.         {
  156.             OracleCommand cmd = new OracleCommand();
  157.             PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
  158.             OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  159.             cmd.Parameters.Clear();
  160.             return rdr;
  161.         }
  162.         /// <summary>
  163.         /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
  164.         /// </summary>
  165.         public object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText,
  166.             params DbParameter[] cmdParms)
  167.         {
  168.             OracleCommand cmd = new OracleCommand();
  169.             using (OracleConnection connection = new OracleConnection(connectionString))
  170.             {
  171.                 PrepareCommand(cmd, connection, null, cmdType, cmdText, cmdParms);
  172.                 object val = cmd.ExecuteScalar();
  173.                 cmd.Parameters.Clear();
  174.                 return val;
  175.             }
  176.         }
  177.         /// <summary>
  178.         /// 在事务中执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
  179.         /// </summary>
  180.         public object ExecuteScalar(DbTransaction trans, CommandType cmdType, string cmdText,
  181.             params DbParameter[] cmdParms)
  182.         {
  183.             OracleCommand cmd = new OracleCommand();
  184.             PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
  185.             object val = cmd.ExecuteScalar();
  186.             cmd.Parameters.Clear();
  187.             return val;
  188.         }
  189.         /// <summary>
  190.         /// 生成要执行的命令
  191.         /// </summary>
  192.         private static void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, CommandType cmdType,
  193.             string cmdText, DbParameter[] cmdParms)
  194.         {
  195.             // 如果存在参数,则表示用户是用参数形式的SQL语句,可以替换
  196.             if (cmdParms != null && cmdParms.Length > 0)
  197.                 cmdText = cmdText.Replace("@", ":").Replace("?", ":");
  198.             if (conn.State != ConnectionState.Open)
  199.                 conn.Open();
  200.             cmd.Connection = conn;
  201.             cmd.CommandText = cmdText;
  202.             if (trans != null)
  203.                 cmd.Transaction = trans;
  204.             cmd.CommandType = cmdType;
  205.             if (cmdParms != null)
  206.             {
  207.                 foreach (OracleParameter parm in cmdParms)
  208.                 {
  209.                     parm.ParameterName = parm.ParameterName.Replace("@", ":").Replace("?", ":");
  210.                     cmd.Parameters.Add(parm);
  211.                 }
  212.             }
  213.         }
  214.     }
  215. }