• 『片段』OracleHelper (支持 多条SQL语句)


    C# 调用 Oracle 是如此尴尬

    >System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废。

    >要链接 Oracle 服务器,必须在 本机安装 Oracle 客户端 —— 而 SQLServer 不需要安装客户端。 

          win32_11gR2_client.zip(652M)

          win64_11gR2_client.zip(587M) 

    >Oracle.DataAccess.dll—— Oracle 官方 提供的.Net 程序集【在安装目录 ODP.NET 中】。

          Oracle.DataAccess.dll  严格区分 x32、x64 —— 程序集 不是 AnyCPU。

          x32 客户端 只包括 x32 的 Oracle.DataAccess.dll。

          x64 客户端 只包括 x64 的 Oracle.DataAccess.dll。

           发布程序的时候,就很容易在这个地方 出现问题。

    >Oracle.ManagedDataAccess.dll —— Oracle 官方 提供的.Net  程序集

           支持 AnyCPU

           不需要安装 600M 的客户端

          Oracle.ManagedDataAccess —— 你值得拥有。

    >Oracle.DataAccess.dll  和  Oracle.ManagedDataAccess.dll  用法完全一样。

          支持的 SQL脚本语法一样。

          SQL 脚本 不能以 分号 结尾。

          一样的:这也不支持,那也不支持。

     

     

      

    C# 调用 Oracle 语法限制

          >Oracle 不支持 自增主键 —— 自增主键 需要使用 触发器。

          >Oracle 表名,字段名 不能超过30个字符。

          >脚本 参数化,    关键符为 : —— SQLServer 关键符为 @

          >脚本 名称区域, 关键符为 "表名"."字段名" —— SQLServer 关键符为 [表名].[字段名]

               警告:脚本中 不建议 将 数据库名、表名、字段名 用 引号括起来 —— 后果很严重。

     

          >支持 多条 修改语句 同时执行:

              BEGIN
    
                 UPDATE TB_Test SET Name='INK';
    
                 DELETE TB_Test WHERE Name='INK';
    
                 INSERT INTO TB_Test(Name) VALUES('INK');
    
              END;

           >不支持 多条 查询语句,得到 DataSet —— 支持 单一查询得到 DataSet。

           >支持 ExecuteScalar —— 但是 执行脚本 必须是 单条脚本。

           >不支持 插入&查询 自增列—— SQLServer 支持 INSERT INTO…. SELECT@@IDENTITY

               警告:即使使用 触发器 实现 自增ID,以下语法也 无法执行

              BEGIN
    
                 INSERT INTO TB_Test(Name) VALUES('INK');   --先执行 插入
    
                 SELECT MAX(ID) FROMTB_Test;                --再执行 查询 最大ID
    
              END

     

    C# 调用 Oracle 的死结 在于:不支持 多条 非影响SQL脚本同时执行。

     

    有鉴于此,自己随手写了一个OracleHelper.cs

           >之前 Oracle 脚本, 自然是 支持的。

           >多条 Oracle 脚本,用 ; 分割 —— 即能支持 多条SQL脚本。

              >避开了 SQLServer 迁移 Oracle 过程中,出现的脚本不兼容。

              >多条SQL脚本将自动开启 数据库事务,确保 绝对正确。

              >支持 多条SELECT返回 多DataTable的 DataSet。

              >支持 插入&查询自增列(触发器实现的 自增列) 

     

    Oracle 全托管程序集 Oracle.ManagedDataAccess.dll  

              >不再需要安装 600M 的客户端,只需要 单纯引用程序集 就行。

              >Oracle.ManagedDataAccess.dll  只是简化了 安装部署,支持 AnyCPU。

              >测试通过,但是 功能和 Oracle.DataAccess.dll 功能一样:

     

                      

     

     

    我这次死定了 

          >近来 公司的项目 SQLServer  要 改写 Oracle。

          >但是 很多 SQLServer 的 语法 移植到 Oracle 很纠结,如果 多条SQL 都转换成 存储过程 —— 这工作量 太大,而且 存储过程数目都会 报表。

          >为了 让 SQLServer 语法 兼容到 Oracle  才在工作中 花了 两小时 写了这个 OracleHelper.cs

          >我只是一个 Oracle 的 采购,我只是 看了 http://www.cnblogs.com/dusmos/p/4451456.html 这篇文章之后,出于 探讨学习 的态度 发出来的 —— 文章也只是用的 很普通的前缀 『片段』

          >这篇文章 上了 博客园的首页,我一点准备都没有 —— 我这浅薄的 Oracle 功底,根本经不起考验,更经不起 博客园园友 潮水般 的 狂批猛踩。

          >这次,我死定了。。。。

             

     

     

    代码如下:

     

      1     public static class OracleHelper
      2     {
      3 
      4 
      5 
      6         public static List<T> ExecuteReaderList<T>(string connString, string cmdText, Func<OracleDataReader, T> funcReader) where T : new()
      7         {
      8             return ExecuteReaderList(connString, cmdText, null, funcReader);
      9         }
     10         public static T ExecuteReaderEntity<T>(string connString, string cmdText, Func<OracleDataReader, T> funcReader) where T : new()
     11         {
     12             return ExecuteReaderEntity(connString, cmdText, null, funcReader);
     13         }
     14         public static int ExecuteNonQuery(string connString, string cmdText)
     15         {
     16             return ExecuteNonQuery(connString, cmdText, null);
     17         }
     18         public static object ExecuteScalar(string connString, string cmdText)
     19         {
     20             return ExecuteScalar(connString, cmdText, null);
     21         }
     22         public static DataSet ExecuteFillDataSet(string connString, string cmdText)
     23         {
     24             return ExecuteFillDataSet(connString, cmdText, null);
     25         }
     26 
     27 
     28         public static List<T> ExecuteReaderList<T>(string connString, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
     29         {
     30             using (OracleConnection conn = new OracleConnection(connString))
     31             {
     32                 TryOpenSqlConnection(conn);
     33                 return ExecuteReaderList<T>(conn, null, cmdText, cmdAction, funcReader);
     34             }
     35         }
     36         public static T ExecuteReaderEntity<T>(string connString, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
     37         {
     38             using (OracleConnection conn = new OracleConnection(connString))
     39             {
     40                 TryOpenSqlConnection(conn);
     41                 return ExecuteReaderEntity<T>(conn, null, cmdText, cmdAction, funcReader);
     42             }
     43         }
     44         public static int ExecuteNonQuery(string connString, string cmdText, Action<OracleCommand> cmdAction)
     45         {
     46             using (OracleConnection conn = new OracleConnection(connString))
     47             {
     48                 TryOpenSqlConnection(conn);
     49                 return ExecuteNonQuery(conn, null, cmdText, cmdAction);
     50             }
     51         }
     52         public static object ExecuteScalar(string connString, string cmdText, Action<OracleCommand> cmdAction)
     53         {
     54             using (OracleConnection conn = new OracleConnection(connString))
     55             {
     56                 TryOpenSqlConnection(conn);
     57                 return ExecuteScalar(conn, null, cmdText, cmdAction);
     58             }
     59         }
     60         public static DataSet ExecuteFillDataSet(string connString, string cmdText, Action<OracleCommand> cmdAction)
     61         {
     62             using (OracleConnection conn = new OracleConnection(connString))
     63             {
     64                 TryOpenSqlConnection(conn);
     65                 return ExecuteFillDataSet(conn, null, cmdText, cmdAction);
     66             }
     67         }
     68 
     69 
     70         public static List<T> ExecuteReaderList<T>(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
     71         {
     72             List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
     73             if (listScript == null || listScript.Count <= 0 || listScript.Count == 1)
     74             {
     75                 return SingleExecuteReaderList<T>(conn, tran, cmdText, cmdAction, funcReader);
     76             }
     77             else
     78             {
     79                 OracleBatchResult<T> result = ExecuteBatchScript<T>(conn, tran, listScript, false, cmdAction, funcReader);
     80                 return result.ExecuteReaderList();
     81             }
     82         }
     83         public static T ExecuteReaderEntity<T>(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
     84         {
     85             List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
     86             if (listScript == null || listScript.Count <= 0 || listScript.Count == 1)
     87             {
     88                 return SingleExecuteReaderEntity<T>(conn, tran, cmdText, cmdAction, funcReader);
     89             }
     90             else
     91             {
     92                 OracleBatchResult<T> result = ExecuteBatchScript<T>(conn, tran, listScript, false, cmdAction, funcReader);
     93                 return result.ExecuteReaderEntity();
     94             }
     95         }
     96         public static int ExecuteNonQuery(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
     97         {
     98             List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
     99             if (listScript == null || listScript.Count <= 0 || listScript.Count == 1)
    100             {
    101                 return SingleExecuteNonQuery(conn, tran, cmdText, cmdAction);
    102             }
    103             else
    104             {
    105                 OracleBatchResult<object> result = ExecuteBatchScript<object>(conn, tran, listScript, false, cmdAction, null);
    106                 return result.ExecuteNonQuery();
    107             }
    108         }
    109         public static object ExecuteScalar(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
    110         {
    111             List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
    112             if (listScript == null || listScript.Count <= 0 || listScript.Count == 1)
    113             {
    114                 return SingleExecuteScalar(conn, tran, cmdText, cmdAction);
    115             }
    116             else
    117             {
    118                 OracleBatchResult<object> result = ExecuteBatchScript<object>(conn, tran, listScript, false, cmdAction, null);
    119                 return result.ExecuteScalar();
    120             }
    121         }
    122         public static DataSet ExecuteFillDataSet(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
    123         {
    124             List<OracleSingleScript> listScript = SplitOracleScript(cmdText);
    125             if (listScript == null || listScript.Count <= 0 || listScript.Count == 1)
    126             {
    127                 DataTable dataTable = SingleExecuteFillDataTable(conn, tran, cmdText, cmdAction);
    128                 DataSet dataSet = new DataSet();
    129                 if (dataTable != null) dataSet.Tables.Add(dataTable);
    130                 return dataSet;
    131             }
    132             else
    133             {
    134                 OracleBatchResult<object> result = ExecuteBatchScript<object>(conn, tran, listScript, true, cmdAction, null);
    135                 return result.ExecuteFillDataSet();
    136             }
    137         }
    138 
    139 
    140 
    141         private static OracleBatchResult<T> ExecuteBatchScript<T>(string connString, IEnumerable<OracleSingleScript> listScript, bool isSelectDataSet, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
    142         {
    143             using (OracleConnection conn = new OracleConnection(connString))
    144             {
    145                 TryOpenSqlConnection(conn);
    146                 using (OracleTransaction tran = conn.BeginTransaction())
    147                 {
    148                     OracleBatchResult<T> result = ExecuteBatchScript(conn, tran, listScript, isSelectDataSet, cmdAction, funcReader);
    149                     return result;
    150                 }
    151             }
    152         }
    153         private static OracleBatchResult<T> ExecuteBatchScript<T>(OracleConnection conn, OracleTransaction tran, IEnumerable<OracleSingleScript> listScript, bool isSelectDataSet, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
    154         {
    155             OracleBatchResult<T> result = new OracleBatchResult<T>();
    156 
    157             bool tranIsNull = tran == null;
    158             if (tranIsNull) tran = conn.BeginTransaction();
    159             try
    160             {
    161                 foreach (OracleSingleScript script in listScript)
    162                 {
    163                     #region  执行查询实体
    164 
    165                     if (script.IsSelect)
    166                     {
    167                         if (isSelectDataSet)
    168                         {
    169                             DataTable dataTable = SingleExecuteFillDataTable(conn, tran, script.SqlScript, cmdAction);
    170                             result.AddDataTable(dataTable);
    171                         }
    172                         else if (typeof(T) == typeof(object) && funcReader == null)
    173                         {
    174                             object scalar = SingleExecuteScalar(conn, tran, script.SqlScript, cmdAction);
    175                             result.AddScalar(scalar);
    176                         }
    177                         else
    178                         {
    179                             List<T> list = SingleExecuteReaderList<T>(conn, tran, script.SqlScript, cmdAction, funcReader);
    180                             result.AddList(list);
    181                         }
    182                     }
    183 
    184                     #endregion
    185                     #region  执行增加修改删除
    186 
    187                     if (script.IsInsert || script.IsUpdate || script.IsDelete)
    188                     {
    189                         int effect = SingleExecuteNonQuery(conn, tran, script.SqlScript, cmdAction);
    190                         result.AddEffect(effect);
    191                     }
    192 
    193                     #endregion
    194                 }
    195                 if (tranIsNull && tran != null) tran.Commit();
    196             }
    197             finally
    198             {
    199                 if (tranIsNull && tran != null) tran.Dispose();
    200             }
    201 
    202             return result;
    203         }
    204 
    205 
    206         #region  执行单条脚本
    207 
    208         //private static List<T> SingleExecuteReaderList<T>(string connString, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
    209         //{
    210         //    using (OracleConnection conn = new OracleConnection(connString))
    211         //    {
    212         //        TryOpenSqlConnection(conn);
    213         //        return SingleExecuteReaderList(conn, null, cmdText, cmdAction, funcReader);
    214         //    }
    215         //}
    216         //private static T SingleExecuteReaderEntity<T>(string connString, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
    217         //{
    218         //    using (OracleConnection conn = new OracleConnection(connString))
    219         //    {
    220         //        TryOpenSqlConnection(conn);
    221         //        return SingleExecuteReaderEntity(conn, null, cmdText, cmdAction, funcReader);
    222         //    }
    223         //}
    224         //private static int SingleExecuteNonQuery(string connString, string cmdText, Action<OracleCommand> cmdAction)
    225         //{
    226         //    using (OracleConnection conn = new OracleConnection(connString))
    227         //    {
    228         //        TryOpenSqlConnection(conn);
    229         //        return SingleExecuteNonQuery(conn, null, cmdText, cmdAction);
    230         //    }
    231         //}
    232         //private static object SingleExecuteScalar(string connString, string cmdText, Action<OracleCommand> cmdAction)
    233         //{
    234         //    using (OracleConnection conn = new OracleConnection(connString))
    235         //    {
    236         //        TryOpenSqlConnection(conn);
    237         //        return SingleExecuteScalar(conn, null, cmdText, cmdAction);
    238         //    }
    239         //}
    240         //private static DataTable SingleExecuteFillDataTable(string connString, string cmdText, Action<OracleCommand> cmdAction)
    241         //{
    242         //    using (OracleConnection conn = new OracleConnection(connString))
    243         //    {
    244         //        TryOpenSqlConnection(conn);
    245         //        return SingleExecuteFillDataTable(conn, null, cmdText, cmdAction);
    246         //    }
    247         //}
    248 
    249 
    250         private static List<T> SingleExecuteReaderList<T>(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
    251         {
    252             List<T> list = new List<T>();
    253             //需要查询的是否是 原生值类型
    254             bool isMetaValue = typeof(T).IsValueType && typeof(T).GetProperties().Length <= 0 && typeof(T).GetFields().Length <= 0;
    255 
    256             using (OracleCommand cmd = conn.CreateCommand())
    257             {
    258                 cmd.CommandText = cmdText;
    259                 cmd.CommandTimeout = int.MaxValue;
    260                 //cmd.Transaction = tran;
    261                 if (cmdAction != null) cmdAction(cmd);
    262 
    263                 using (OracleDataReader reader = cmd.ExecuteReader())
    264                 {
    265                     List<string> listFieldName = new List<string>();
    266                     while (reader.Read())
    267                     {
    268                         if (funcReader != null)
    269                         {
    270                             //通过指定的 函数 创建对象
    271                             T item = funcReader(reader);
    272                             if (!object.Equals(item, default(T))) list.Add(item);
    273                         }
    274                         else
    275                         {
    276                             if (listFieldName.Count <= 0)
    277                                 for (int i = 0; i < reader.FieldCount; i++)
    278                                 {
    279                                     string fieldName = reader.GetName(i).Trim();
    280                                     listFieldName.Add(fieldName);
    281                                 }
    282 
    283                             //通过反射 创建对象
    284                             if (isMetaValue)
    285                             {
    286                                 object value = reader[listFieldName[0]];
    287                                 T item = (T)Tools.ConvertValue(value, typeof(T));
    288                                 if (!object.Equals(item, default(T))) list.Add(item);
    289                             }
    290                             else
    291                             {
    292                                 T item = new T();
    293                                 foreach (string fieldName in listFieldName)
    294                                 {
    295                                     object value = reader[fieldName];
    296                                     //if (value == null || value == DBNull.Value) value = ConstDefine.InvalidValueDoulbe;
    297                                     if (value != null && value != DBNull.Value)
    298                                         Tools.SetValue(item, fieldName, value);
    299                                 }
    300                                 if (!object.Equals(item, default(T))) list.Add(item);
    301                             }
    302                         }
    303                     }
    304                 }
    305             }
    306 
    307             return list;
    308         }
    309         private static T SingleExecuteReaderEntity<T>(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction, Func<OracleDataReader, T> funcReader) where T : new()
    310         {
    311             T result = default(T);
    312             //需要查询的是否是 原生值类型
    313             bool isMetaValue = typeof(T).IsValueType && typeof(T).GetProperties().Length <= 0 && typeof(T).GetFields().Length <= 0;
    314 
    315             using (OracleCommand cmd = conn.CreateCommand())
    316             {
    317                 cmd.CommandText = cmdText;
    318                 cmd.CommandTimeout = int.MaxValue;
    319                 if (cmdAction != null) cmdAction(cmd);
    320 
    321                 using (OracleDataReader reader = cmd.ExecuteReader())
    322                 {
    323                     List<string> listFieldName = new List<string>();
    324                     if (reader.Read())
    325                     {
    326                         if (funcReader != null)
    327                         {
    328                             //通过指定的 函数 创建对象
    329                             T item = funcReader(reader);
    330                             result = item;
    331                         }
    332                         else
    333                         {
    334                             if (listFieldName.Count <= 0)
    335                                 for (int i = 0; i < reader.FieldCount; i++)
    336                                 {
    337                                     string fieldName = reader.GetName(i).Trim();
    338                                     listFieldName.Add(fieldName);
    339                                 }
    340 
    341                             //通过反射 创建对象
    342                             if (isMetaValue)
    343                             {
    344                                 object value = reader[listFieldName[0]];
    345                                 T item = (T)Tools.ConvertValue(value, typeof(T));
    346                                 result = item;
    347                             }
    348                             else
    349                             {
    350                                 T item = new T();
    351                                 foreach (string fieldName in listFieldName)
    352                                     Tools.SetValue(item, fieldName, reader[fieldName]);
    353                                 result = item;
    354                             }
    355                         }
    356                     }
    357                 }
    358             }
    359 
    360             return result;
    361         }
    362         private static int SingleExecuteNonQuery(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
    363         {
    364             int result = 0;
    365 
    366             using (OracleCommand cmd = conn.CreateCommand())
    367             {
    368                 cmd.CommandText = cmdText;
    369                 cmd.CommandTimeout = int.MaxValue;
    370                 if (cmdAction != null) cmdAction(cmd);
    371 
    372                 result = cmd.ExecuteNonQuery();
    373             }
    374 
    375             return result;
    376         }
    377         private static object SingleExecuteScalar(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
    378         {
    379             object result = null;
    380 
    381             using (OracleCommand cmd = conn.CreateCommand())
    382             {
    383                 cmd.CommandText = cmdText;
    384                 cmd.CommandTimeout = int.MaxValue;
    385                 if (cmdAction != null) cmdAction(cmd);
    386 
    387                 result = cmd.ExecuteScalar();
    388             }
    389 
    390             return result;
    391 
    392         }
    393         private static DataTable SingleExecuteFillDataTable(OracleConnection conn, OracleTransaction tran, string cmdText, Action<OracleCommand> cmdAction)
    394         {
    395             DataTable dataTable = new DataTable();
    396 
    397             using (OracleCommand cmd = conn.CreateCommand())
    398             {
    399                 cmd.CommandText = cmdText;
    400                 cmd.CommandTimeout = int.MaxValue;
    401                 if (cmdAction != null) cmdAction(cmd);
    402 
    403                 using (OracleDataAdapter adapter = new OracleDataAdapter(cmd))
    404                 {
    405                     adapter.Fill(dataTable);
    406                 }
    407             }
    408 
    409             return dataTable;
    410         }
    411 
    412         #endregion
    413 
    414 
    415 
    416         /// <summary>
    417         /// 用指定的 脚本开启一个事务, 并且 打开数据库链接
    418         /// </summary>
    419         public static void DoTransaction(string connString, Action<OracleTransaction, OracleConnection> tranAction)
    420         {
    421             using (OracleConnection conn = new OracleConnection(connString))
    422             {
    423                 TryOpenSqlConnection(conn);
    424                 using (OracleTransaction tran = conn.BeginTransaction())
    425                 {
    426                     if (tranAction == null) throw new Exception("OracleHelper.DoTransaction(string, Action) 必须提供 有效的 回调委托!");
    427                     if (tranAction != null) tranAction(tran, conn);
    428                 }
    429             }
    430         }
    431         /// <summary>
    432         /// 尝试 打开 指定的 数据库链接
    433         /// </summary>
    434         public static void TryOpenSqlConnection(OracleConnection conn)
    435         {
    436             TryOpenSqlConnection(conn, 50);
    437         }
    438         /// <summary>
    439         /// 尝试 打开 指定的 数据库链接
    440         /// </summary>
    441         public static void TryOpenSqlConnection(OracleConnection conn, int reTryCount)
    442         {
    443             if (conn == null) return;
    444             int expCount = 0;
    445             do
    446             {
    447                 try
    448                 {
    449                     conn.Open();
    450                     break;
    451                 }
    452                 catch (Exception exp)
    453                 {
    454                     if (exp is InvalidOperationException || exp is OracleException)
    455                     {
    456                         expCount++;
    457                         if (expCount >= reTryCount) throw;          //重试reTryCount次都失败, 则不再重试, 抛出异常
    458                         Thread.Sleep(5);                            //打开失败时, 休眠 5毫秒, 再重试打开 
    459                     }
    460                     else throw;
    461                 }
    462 
    463             } while (true);
    464         }
    465 
    466 
    467 
    468         /// <summary>
    469         /// Oracle 不支持 多条脚本 同时执行, 这里按照 ; 拆分脚本, 分次执行
    470         /// </summary>
    471         private static List<OracleSingleScript> SplitOracleScript(string cmdText)
    472         {
    473             List<OracleSingleScript> listScript = new List<OracleSingleScript>();
    474             if (string.IsNullOrWhiteSpace(cmdText)) return listScript;
    475             if (!cmdText.Contains(";"))
    476             {
    477                 OracleSingleScript singleScript = OracleSingleScript.Create(cmdText);
    478                 if (singleScript != null) listScript.Add(singleScript);
    479                 return listScript;
    480             }
    481 
    482             string cmdTextTrim = cmdText.Trim().Trim(';').Trim();
    483             if (cmdTextTrim.StartsWith("BEGIN", StringComparison.CurrentCultureIgnoreCase))
    484                 cmdTextTrim = cmdTextTrim.Substring("BEGIN".Length);
    485             if (cmdTextTrim.EndsWith("END", StringComparison.CurrentCultureIgnoreCase))
    486                 cmdTextTrim = cmdTextTrim.Substring(0, cmdTextTrim.Length - "END".Length);
    487 
    488 
    489             string[] splitTemp = cmdTextTrim.Split(new[] { ';' }, StringSplitOptions.None);
    490 
    491             List<string> listGroup = new List<string>();
    492             foreach (string temp in splitTemp)
    493             {
    494                 string tempTrim = temp.Trim();
    495 
    496                 //可以作为开头的 脚本
    497                 if (tempTrim.StartsWith("SELECT", StringComparison.CurrentCultureIgnoreCase)
    498                     || tempTrim.StartsWith("INSERT", StringComparison.CurrentCultureIgnoreCase)
    499                     || tempTrim.StartsWith("UPDATE", StringComparison.CurrentCultureIgnoreCase)
    500                     || tempTrim.StartsWith("DELETE", StringComparison.CurrentCultureIgnoreCase)
    501                     )
    502                 {
    503                     if (listGroup.Count > 0)
    504                     {
    505                         string script = string.Join(";", listGroup).Trim().Trim(';').Trim();
    506                         OracleSingleScript singleScript = OracleSingleScript.Create(script);
    507                         if (singleScript != null) listScript.Add(singleScript);
    508                         listGroup.Clear();
    509                     }
    510                 }
    511 
    512                 listGroup.Add(temp);
    513             }
    514 
    515             if (listGroup.Count > 0)
    516             {
    517                 string lastScript = string.Join(";", listGroup).Trim().Trim(';').Trim();
    518                 OracleSingleScript singleScript = OracleSingleScript.Create(lastScript);
    519                 if (singleScript != null) listScript.Add(singleScript);
    520                 listGroup.Clear();
    521             }
    522 
    523             return listScript;
    524         }
    525 
    526 
    527 
    528 
    529 
    530         [Serializable]
    531         internal class OracleSingleScript
    532         {
    533             private string sqlScript = string.Empty;
    534 
    535             public bool IsSelect { get; private set; }
    536             public bool IsInsert { get; private set; }
    537             public bool IsUpdate { get; private set; }
    538             public bool IsDelete { get; private set; }
    539             public string SqlScript
    540             {
    541                 get { return sqlScript; }
    542                 set { sqlScript = (value ?? string.Empty).Trim().Trim(';').Trim(); }
    543             }
    544 
    545 
    546             private OracleSingleScript() { }
    547             public override string ToString()
    548             {
    549                 return SqlScript;
    550             }
    551             public static OracleSingleScript Create(string script)
    552             {
    553                 script = (script ?? string.Empty).Trim().Trim(';').Trim();
    554                 if (string.IsNullOrWhiteSpace(script)) return null;
    555 
    556                 OracleSingleScript item = new OracleSingleScript();
    557                 item.SqlScript = script;
    558 
    559                 item.IsSelect = script.StartsWith("SELECT", StringComparison.CurrentCultureIgnoreCase);
    560                 if (!item.IsSelect)
    561                 {
    562                     item.IsInsert = script.StartsWith("INSERT", StringComparison.CurrentCultureIgnoreCase);
    563                     if (!item.IsInsert)
    564                     {
    565                         item.IsUpdate = script.StartsWith("UPDATE", StringComparison.CurrentCultureIgnoreCase);
    566                         if (!item.IsUpdate)
    567                             item.IsDelete = script.StartsWith("DELETE", StringComparison.CurrentCultureIgnoreCase);
    568                     }
    569                 }
    570 
    571                 return item;
    572             }
    573         }
    574 
    575         [Serializable]
    576         internal class OracleBatchResult<T> where T : new()
    577         {
    578             private readonly List<List<T>> list = new List<List<T>>();
    579             private readonly List<int> effect = new List<int>();
    580             private readonly List<object> scalar = new List<object>();
    581             private readonly List<DataTable> dataTable = new List<DataTable>();
    582             private readonly DataSet dataSet = new DataSet();
    583 
    584             public void AddList(List<T> temp) { list.Add(temp); }
    585             public void AddEffect(int temp) { effect.Add(temp); }
    586             public void AddScalar(object temp) { scalar.Add(temp); }
    587             public void AddDataTable(DataTable temp) { dataTable.Add(temp); }
    588 
    589             public List<T> ExecuteReaderList()
    590             {
    591                 return list.Count >= 1 ? list[list.Count - 1] : null;
    592             }
    593             public T ExecuteReaderEntity()
    594             {
    595                 List<T> listT = ExecuteReaderList();
    596                 return (listT != null && listT.Count >= 1) ? listT[0] : default(T);
    597             }
    598             public int ExecuteNonQuery()
    599             {
    600                 return effect.Count >= 1 ? effect[effect.Count - 1] : 0;
    601             }
    602             public object ExecuteScalar()
    603             {
    604                 //如果 scalar 集合 存在数据, 直接返回 最后一个
    605                 //如果 scalar 集合无效, 但是 list 集合有效, 尝试获取 第一个实体, 第一个属性的值
    606                 //如果 scalar、list 集合有效, 但是 dataTable 集合有效, 尝试获取 第一个DataRow, 第一个DataCell的值
    607 
    608                 if (scalar.Count >= 1)
    609                 {
    610                     return scalar[scalar.Count - 1];
    611                 }
    612                 else if (list.Count >= 1)
    613                 {
    614                     #region  尝试从 list 实体集合中 返回 单行单列 值
    615 
    616                     try
    617                     {
    618                         List<T> listT = list[list.Count-1];
    619                         if ((listT != null && listT.Count >= 1))
    620                         {
    621                             T first = listT[0];
    622                             PropertyInfo[] firstProperties = typeof(T).GetProperties();
    623                             if (firstProperties.Length >= 1)
    624                                 return firstProperties[0].GetValue(first, null);
    625                             else
    626                             {
    627                                 FieldInfo[] firstFields = typeof(T).GetFields();
    628                                 if (firstFields.Length >= 1)
    629                                     return firstFields[0].GetValue(first);
    630                             }
    631                         }
    632                     }
    633                     catch(Exception){ }
    634 
    635                     #endregion
    636                 }
    637                 else if (dataTable.Count >= 1)
    638                 {
    639                     #region  尝试从 dataTable 集合中 返回 但行单列 值
    640 
    641                     try
    642                     {
    643                         DataTable table = dataTable[dataTable.Count-1];
    644                         if ((table != null && table.Rows.Count >= 1))
    645                         {
    646                             DataRow first = table.Rows[0];
    647                             if (table.Columns.Count >= 1)
    648                                 return first[0];
    649                         }
    650                     }
    651                     catch (Exception) { }
    652 
    653                     #endregion
    654                 }
    655                 return null;
    656             }
    657             public DataSet ExecuteFillDataSet()
    658             {
    659                 dataSet.Clear();
    660                 dataSet.Tables.AddRange(dataTable.ToArray());
    661                 return dataSet;
    662             }
    663         }
    664    }
    View Code

     

     

  • 相关阅读:
    PHP -----上传文件
    PHP----预定义数组
    PHP-------- 会话控制
    PHP------XML
    PHP----练习-----三级联动
    PHP-------ajax返回值 返回JSON 数据
    PHP----练习----光标离开文本框时变色
    使用ansible安装配置zabbix客户端
    svn+apache安装配置
    rsync+lsyncd实现实时同步
  • 原文地址:https://www.cnblogs.com/shuxiaolong/p/20150424_001.html
Copyright © 2020-2023  润新知