OracleDB.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. /*******************************************************************************
  2. * Copyright(c) 2019 dongke All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:OracleDB.cs
  5. * 2.功能描述:操作oracle的简易ORM,提高编写效率,提高代码可读性
  6. * 3.依赖:IDBConnection.cs,IDBTransaction.cs
  7. * 编辑履历:
  8. * 作者 日期 版本 修改内容
  9. * 徐伟 2019-09-02 1.00 新建
  10. *******************************************************************************/
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Data;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Collections;
  17. using Dongke.IBOSS.PRD.WCF.DataModels;
  18. using Dongke.IBOSS.PRD.Basics.BaseResources;
  19. using Oracle.ManagedDataAccess.Client;
  20. namespace Dongke.IBOSS.PRD.Basics.DataAccess
  21. {
  22. public static class OracleDB
  23. {
  24. public static IDBTransaction GetConn()
  25. {
  26. return ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString);
  27. }
  28. /// <summary>
  29. /// 通用SQL语句执行方法;
  30. /// 不指定数据连接时,默认执行单条语句,执行完毕直接提交;
  31. /// 指定数据连接时,可执行多条语句,默认不提交,通过指定commit提交事务;
  32. /// </summary>
  33. /// <param name="sqlStr">SQL语句</param>
  34. /// <param name="sqlPara">SQL参数</param>
  35. /// <param name="conn">数据连接</param>
  36. /// <param name="commit">是否提交</param>
  37. /// <returns></returns>
  38. public static int ExecuteNonQuery(string sqlStr, IDataParameter[] sqlPara = null, IDBTransaction conn = null, bool commit = false)
  39. {
  40. int result = 0;
  41. try
  42. {
  43. if (conn == null) conn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString);
  44. if (conn.ConnState == ConnectionState.Closed) conn.Connect();
  45. result = conn.ExecuteNonQuery(sqlStr, sqlPara);
  46. if (conn == null || commit) conn.Commit();
  47. }
  48. catch (Exception e)
  49. {
  50. if (conn == null || commit) conn.Rollback();
  51. throw e;
  52. }
  53. finally
  54. {
  55. if (conn == null || commit)
  56. if (conn.ConnState == ConnectionState.Open) conn.Disconnect();
  57. }
  58. return result;
  59. }
  60. public static int ExecuteNonQuery(string sqlStr, ClientRequestEntity cre, IDBTransaction conn = null, bool commit = false)
  61. {
  62. return ExecuteNonQuery(sqlStr, GetParameter(cre), conn, commit);
  63. }
  64. /// <summary>
  65. /// 通用SQL语句执行方法,ServiceResultEntity格式;
  66. /// 不指定数据连接时,默认执行单条语句,执行完毕直接提交;
  67. /// 指定数据连接时,可执行多条语句,默认不提交,通过指定commit提交事务;
  68. /// </summary>
  69. /// <param name="sqlStr">SQL语句</param>
  70. /// <param name="sqlPara">SQL参数</param>
  71. /// <param name="conn">数据连接</param>
  72. /// <param name="commit">是否提交</param>
  73. /// <returns></returns>
  74. public static ServiceResultEntity ExecuteNonQuerySRE(string sqlStr, IDataParameter[] sqlPara = null, IDBTransaction conn = null, bool commit = false)
  75. {
  76. ServiceResultEntity result = new ServiceResultEntity();
  77. try
  78. {
  79. bool finish = (conn == null || commit) ? true : false;
  80. if (conn == null) conn = ClsDbFactory.CreateDBTransaction(DataBaseType.ORACLE, DataManager.ConnectionString);
  81. if (conn.ConnState == ConnectionState.Closed) conn.Connect();
  82. result.Result = conn.ExecuteNonQuery(sqlStr, sqlPara);
  83. result.Status = Constant.ServiceResultStatus.Success;
  84. result.Message = "操作成功!";
  85. if (finish) conn.Commit();
  86. }
  87. catch (Exception e)
  88. {
  89. if (conn == null || commit) conn.Rollback();
  90. //result.Status = Constant.ServiceResultStatus.SystemError;
  91. //result.Status = "操作失败!";
  92. //return result;
  93. throw e;
  94. }
  95. finally
  96. {
  97. if (conn.ConnState == ConnectionState.Open) conn.Disconnect();
  98. }
  99. return result;
  100. }
  101. public static ServiceResultEntity ExecuteNonQuerySRE(string sqlStr, ClientRequestEntity cre, IDBTransaction conn = null, bool commit = false)
  102. {
  103. return ExecuteNonQuerySRE(sqlStr, GetParameter(cre), conn, commit);
  104. }
  105. /// <summary>
  106. /// 通用SQL语句执行方法,ServiceResultEntity格式;
  107. /// 不指定数据连接时,默认执行单条语句,执行完毕直接提交;
  108. /// 指定数据连接时,可执行多条语句,默认不提交,通过指定commit提交事务;
  109. /// </summary>
  110. /// <param name="tableName">表名</param>
  111. /// <param name="opt">操作:insert,update,delete</param>
  112. /// <param name="fields">字段键值对</param>
  113. /// <param name="conn">数据连接</param>
  114. /// <param name="commit">是否提交</param>
  115. /// <returns></returns>
  116. public static ServiceResultEntity ExecuteNonQuerySRE(string tableName, string opt, IDataParameter[] sqlPara, IDBTransaction conn = null, bool commit = false)
  117. {
  118. string sqlStr = MakeSql(tableName, opt, sqlPara);
  119. return ExecuteNonQuerySRE(sqlStr, sqlPara, conn, commit);
  120. }
  121. public static ServiceResultEntity ExecuteNonQuerySRE(string tableName, string opt, ClientRequestEntity cre, IDBTransaction conn = null, bool commit = false)
  122. {
  123. string sqlStr = MakeSql(tableName, opt, GetParameter(cre));
  124. return ExecuteNonQuerySRE(sqlStr, GetParameter(cre), conn, commit);
  125. }
  126. /// <summary>
  127. /// 通用SQL语句执行获取DataSet方法,ServiceResultEntity格式;
  128. /// </summary>
  129. /// <param name="sqlStr">SQL语句</param>
  130. /// <param name="sqlPara">SQL参数</param>
  131. /// <returns></returns>
  132. public static ServiceResultEntity ExecuteDataSetSRE(string sqlStr, IDataParameter[] sqlPara = null)
  133. {
  134. IDBConnection conn = null;
  135. ServiceResultEntity result = new ServiceResultEntity();
  136. try
  137. {
  138. conn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString);
  139. conn.Open();
  140. result.Data = conn.GetSqlResultToDs(sqlStr, sqlPara);
  141. if (result.Data.Tables[0].Rows.Count == 0)
  142. result.Status = Constant.ServiceResultStatus.NoSearchResults;
  143. else
  144. result.Status = Constant.ServiceResultStatus.Success;
  145. result.Message = "操作成功!";
  146. return result;
  147. }
  148. catch (Exception e)
  149. {
  150. //result.Status = Constant.ServiceResultStatus.SystemError;
  151. //result.Message = "操作失败!";
  152. //return result;
  153. throw e;
  154. }
  155. finally
  156. {
  157. if (conn.ConnState == ConnectionState.Open) conn.Close();
  158. }
  159. }
  160. public static ServiceResultEntity ExecuteDataSetSRE(string sqlStr, ClientRequestEntity cre)
  161. {
  162. return ExecuteDataSetSRE(sqlStr, GetParameter(cre));
  163. }
  164. /// <summary>
  165. /// 通用SQL语句执行获取DataSet方法,ServiceResultEntity格式;
  166. /// </summary>
  167. /// <param name="sqlStr">SQL语句</param>
  168. /// <param name="sqlPara">SQL参数</param>
  169. /// <returns></returns>
  170. public static ServiceResultEntity ExecuteDataSetSRE(string tableName, string opt, IDataParameter[] sqlPara, string orderBy = "")
  171. {
  172. string sqlStr = MakeSql(tableName, opt, sqlPara, orderBy);
  173. return ExecuteDataSetSRE(sqlStr, sqlPara);
  174. }
  175. public static ServiceResultEntity ExecuteDataSetSRE(string tableName, string opt, ClientRequestEntity cre, string orderBy = "")
  176. {
  177. string sqlStr = MakeSql(tableName, opt, GetParameter(cre), orderBy);
  178. return ExecuteDataSetSRE(sqlStr, GetParameter(cre));
  179. }
  180. /// <summary>
  181. /// 通用SQL语句执行获取DataSet方法;
  182. /// </summary>
  183. /// <param name="sqlStr">SQL语句</param>
  184. /// <param name="sqlPara">SQL参数</param>
  185. /// <returns></returns>
  186. public static DataSet ExecuteDataSet(string sqlStr, IDataParameter[] sqlPara = null)
  187. {
  188. IDBConnection conn = null;
  189. try
  190. {
  191. conn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString);
  192. conn.Open();
  193. return conn.GetSqlResultToDs(sqlStr, sqlPara);
  194. }
  195. catch (Exception e)
  196. {
  197. throw e;
  198. }
  199. finally
  200. {
  201. if (conn.ConnState == ConnectionState.Open) conn.Close();
  202. }
  203. }
  204. public static DataSet ExecuteDataSet(string sqlStr,ClientRequestEntity cre)
  205. {
  206. return ExecuteDataSet(sqlStr, GetParameter(cre));
  207. }
  208. /// <summary>
  209. /// 通用SQL语句执行获取DataTable方法;
  210. /// </summary>
  211. /// <param name="sqlStr">SQL语句</param>
  212. /// <param name="sqlPara">SQL参数</param>
  213. /// <returns></returns>
  214. public static DataTable ExecuteDataTable(string sqlStr, IDataParameter[] sqlPara = null)
  215. {
  216. IDBConnection conn = null;
  217. try
  218. {
  219. conn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString);
  220. conn.Open();
  221. return conn.GetSqlResultToDt(sqlStr, sqlPara);
  222. }
  223. catch (Exception e)
  224. {
  225. throw e;
  226. }
  227. finally
  228. {
  229. if (conn.ConnState == ConnectionState.Open) conn.Close();
  230. }
  231. }
  232. public static DataTable ExecuteDataTable(string sqlStr, ClientRequestEntity cre)
  233. {
  234. return ExecuteDataTable(sqlStr, GetParameter(cre));
  235. }
  236. /// <summary>
  237. /// 通用SQL语句执行获取单行单列值方法;
  238. /// </summary>
  239. /// <param name="sqlStr">SQL语句</param>
  240. /// <param name="sqlPara">SQL参数</param>
  241. /// <returns></returns>
  242. public static object ExecuteScalar(string sqlStr, IDataParameter[] sqlPara = null)
  243. {
  244. IDBConnection conn = null;
  245. try
  246. {
  247. conn = ClsDbFactory.CreateDBConnection(DataBaseType.ORACLE, DataManager.ConnectionString);
  248. conn.Open();
  249. return conn.GetSqlResultToObj(sqlStr, sqlPara);
  250. }
  251. catch (Exception e)
  252. {
  253. throw e;
  254. }
  255. finally
  256. {
  257. if (conn.ConnState == ConnectionState.Open) conn.Close();
  258. }
  259. }
  260. public static object ExecuteScalar(string sqlStr, ClientRequestEntity cre)
  261. {
  262. return ExecuteScalar(sqlStr, GetParameter(cre));
  263. }
  264. /// <summary>
  265. /// 按IDataParameter定义的字段,生成sql语句,不支持多表关联,可用视图代替
  266. /// </summary>
  267. /// <param name="tableName">表名</param>
  268. /// <param name="opt">操作:insert、update、delete</param>
  269. /// <param name="fields">字段键值对</param>
  270. /// <returns></returns>
  271. public static string MakeSql(string tableName, string opt, IDataParameter[] sqlPara,string orderBy = "")
  272. {
  273. string sqlStr = "";
  274. //生成插入语句
  275. if (opt.ToLower() == "insert")
  276. {
  277. string insertField = "";
  278. string insertValue = "";
  279. for(int i=0;i<sqlPara.Length;i++)
  280. {
  281. if (insertField != "") insertField += ",";
  282. insertField += sqlPara[i].ParameterName.ToString().Replace(":", "");
  283. if (insertValue != "") insertValue += ",";
  284. insertValue += sqlPara[i].ParameterName.ToString();
  285. }
  286. sqlStr = "insert into " + tableName + "(" + insertField + ") values (" + insertValue + ")";
  287. }
  288. //生成更新语句
  289. if (opt.ToLower() == "update")
  290. {
  291. string updateStr = "";
  292. string keyStr = GetKey(tableName);
  293. for (int i = 0; i < sqlPara.Length; i++)
  294. {
  295. if (updateStr != "") updateStr += ",";
  296. updateStr += sqlPara[i].ParameterName.ToString().Replace(":", "") + " = " + sqlPara[i].ParameterName;
  297. }
  298. sqlStr = "update " + tableName + " set " + updateStr;
  299. sqlStr += " where " + keyStr + " = :" + keyStr;
  300. }
  301. //生成删除语句
  302. if (opt.ToLower() == "delete")
  303. {
  304. string deleteStr = "";
  305. for (int i = 0; i < sqlPara.Length; i++)
  306. {
  307. if (deleteStr != "") deleteStr += " and ";
  308. deleteStr += sqlPara[i].ParameterName.ToString().Replace(":", "") + " = " + sqlPara[i].ParameterName;
  309. }
  310. sqlStr = "delete " + tableName + " where " + deleteStr;
  311. }
  312. //生成搜索语句
  313. if(opt.ToLower() == "search")
  314. {
  315. sqlStr = "select * from " + tableName;
  316. if(sqlPara!=null)
  317. {
  318. string searchStr = "";
  319. for (int i = 0; i < sqlPara.Length; i++)
  320. {
  321. if (searchStr != "") searchStr += " and ";
  322. //如果定义最小值或最大值
  323. if (sqlPara[i].ParameterName.ToLower().IndexOf("min") + 3 == sqlPara[i].ParameterName.Length)
  324. {
  325. searchStr += sqlPara[i].ParameterName.Replace(":", "").Substring(0, sqlPara[i].ParameterName.Length - 4)
  326. + " >= " + sqlPara[i].ParameterName;
  327. }
  328. else if (sqlPara[i].ParameterName.ToLower().IndexOf("max") + 3 == sqlPara[i].ParameterName.Length)
  329. {
  330. searchStr += sqlPara[i].ParameterName.ToString().Replace(":", "").Substring(0, sqlPara[i].ParameterName.Length - 4)
  331. + " <= " + sqlPara[i].ParameterName;
  332. }
  333. else
  334. {
  335. if (sqlPara[i].DbType == DbType.String)
  336. //字符串类型处理
  337. searchStr += sqlPara[i].ParameterName.ToString().Replace(":", "") + " like '%' || " + sqlPara[i].ParameterName + " || '%'";
  338. else
  339. //数值和bool类型处理
  340. searchStr += sqlPara[i].ParameterName.ToString().Replace(":", "") + " = " + sqlPara[i].ParameterName;
  341. }
  342. }
  343. sqlStr += " where " + searchStr;
  344. }
  345. if (orderBy != "") sqlStr += " order by " + orderBy;
  346. }
  347. return sqlStr;
  348. }
  349. /// <summary>
  350. /// 将cre.Properties转换为IDataParameter[]
  351. /// </summary>
  352. /// <param name="cre">ClientRequestEntity</param>
  353. /// <returns>IDataParameter[]</returns>
  354. public static IDataParameter[] GetParameter(ClientRequestEntity cre)
  355. {
  356. if (cre.Properties.Count>0)
  357. {
  358. List<OracleParameter> para = new List<OracleParameter>();
  359. foreach (var item in cre.Properties)
  360. {
  361. para.Add(new OracleParameter(":" + item.Key.ToString(), item.Value));
  362. }
  363. return para.ToArray();
  364. }
  365. else
  366. return null;
  367. }
  368. /// <summary>
  369. /// 获取表主键列名
  370. /// </summary>
  371. /// <param name="tableName">表名</param>
  372. /// <returns>主键列名</returns>
  373. public static string GetKey(string tableName)
  374. {
  375. object key = ExecuteScalar($@"SELECT column_name
  376. FROM user_cons_columns
  377. WHERE constraint_name = ( SELECT constraint_name
  378. FROM user_constraints
  379. WHERE table_name = '{tableName}'
  380. AND constraint_type = 'P' )");
  381. return key is object ? key.ToString() : "";
  382. }
  383. }
  384. }