OracleHelper.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. using Common;
  2. using Npgsql;
  3. using Oracle.ManagedDataAccess.Client;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.Configuration;
  8. using System.Data;
  9. using System.Linq;
  10. using System.Reflection;
  11. using System.Text;
  12. namespace LisPacsDataUpload
  13. {
  14. public class OracleHelper<T> where T : class
  15. {
  16. //数据库连接变量
  17. //private static OracleConnection conn = null;
  18. //数据库事务变量
  19. //private static OracleTransaction transaction = null;
  20. //连接字符串
  21. public static string GetConnStr()
  22. {
  23. return ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
  24. }
  25. //连接字符串
  26. public static string GetPgConnStr()
  27. {
  28. return ConfigurationManager.ConnectionStrings["pgConn"].ConnectionString;
  29. }
  30. /// <summary>
  31. /// 轮询间隔时间
  32. /// </summary>
  33. /// <returns></returns>
  34. public static int Time()
  35. {
  36. return Convert.ToInt32(ConfigurationManager.AppSettings["time"]) * 60 * 1000;
  37. }
  38. /// <summary>
  39. /// 数据上传开始时间
  40. /// </summary>
  41. /// <returns></returns>
  42. public static int StartTime()
  43. {
  44. return Convert.ToInt32(ConfigurationManager.AppSettings["start_time"]);
  45. }
  46. public static int UploadPacs()
  47. {
  48. return Convert.ToInt32(ConfigurationManager.AppSettings["pacs"]);
  49. }
  50. public static int UploadTime()
  51. {
  52. return Convert.ToInt32(ConfigurationManager.AppSettings["upload_time"]);
  53. }
  54. //public static OracleConnection getConnection()
  55. //{
  56. // OracleConnection conn = null;
  57. // if (conn == null || conn.State == ConnectionState.Closed)
  58. // openConnection();
  59. // return conn;
  60. //}
  61. private static object openLock = new object();
  62. //打开数据库连接
  63. private static bool openConnection(OracleConnection conn)
  64. {
  65. lock (openLock)
  66. {
  67. try
  68. {
  69. conn = new OracleConnection(GetConnStr());
  70. conn.Close();
  71. if (conn.State != ConnectionState.Open)
  72. {
  73. conn.Open();
  74. return true;
  75. }
  76. }
  77. catch (Exception ex)
  78. {
  79. LogHelper.Info("打开数据库出错," + ex.Message);
  80. }
  81. finally { }
  82. return false;
  83. }
  84. //lock (openLock)
  85. //{
  86. // try
  87. // {
  88. // //打开连接
  89. // if (conn == null || conn.State == ConnectionState.Closed)
  90. // {
  91. // conn = new OracleConnection(GetConnStr());
  92. // conn.Open();
  93. // }
  94. // }
  95. // catch (Exception ex)
  96. // {
  97. // LogHelper.Error(ex, ex.Message);
  98. // //throw new Exception(ex.Message, ex);
  99. // }
  100. }
  101. private static object closeLock = new object();
  102. //关闭数据库连接
  103. private static void closeConnection()
  104. {
  105. lock (closeLock)
  106. {
  107. OracleConnection conn = null;
  108. if (conn != null)
  109. {
  110. if (conn.State == ConnectionState.Open)
  111. conn.Close();
  112. }
  113. }
  114. //lock(closeLock)
  115. //{
  116. // try
  117. // {
  118. // if (conn != null)
  119. // {
  120. // if (conn.State == ConnectionState.Open)
  121. // conn.Close();
  122. // }
  123. // }
  124. // catch (Exception ex)
  125. // {
  126. // LogHelper.Error(ex, ex.Message);
  127. // //throw new Exception(ex.Message, ex);
  128. // }
  129. //}
  130. }
  131. private static object DSLock = new object();
  132. /// <summary>
  133. /// 查询,返回DataSet
  134. /// </summary>
  135. /// <param name="sql"></param>
  136. /// <returns></returns>
  137. public static DataTable RunQueryDS(string sql)
  138. {
  139. //lock (DSLock)
  140. //{
  141. DataTable dt = new DataTable();
  142. using (OracleConnection conn = new OracleConnection(GetConnStr()))
  143. {
  144. try
  145. {
  146. conn.Open();
  147. OracleDataAdapter oda = new OracleDataAdapter(sql, conn);
  148. //DataSet ds = new DataSet();
  149. oda.Fill(dt);
  150. //dt = ds.Tables[0];
  151. }
  152. catch (Exception ex)
  153. {
  154. LogHelper.Info("查询出错sql:" + sql);
  155. LogHelper.Error(ex, ex.Message);
  156. //throw new Exception(ex.Message);
  157. }
  158. finally
  159. {
  160. //closeConnection();
  161. conn.Close();
  162. }
  163. }
  164. return dt;
  165. //}
  166. }
  167. /// <summary>
  168. /// 查询,返回DataSet
  169. /// </summary>
  170. /// <param name="sql"></param>
  171. /// <returns></returns>
  172. public static DataTable PgQueryDS(string sql)
  173. {
  174. DataTable dataTable = new DataTable();
  175. using (NpgsqlConnection connection = new NpgsqlConnection(GetPgConnStr()))
  176. {
  177. connection.Open();
  178. using (NpgsqlCommand command = new NpgsqlCommand(sql, connection))
  179. {
  180. using (NpgsqlDataReader reader = command.ExecuteReader())
  181. {
  182. dataTable.Load(reader);
  183. }
  184. }
  185. }
  186. return dataTable;
  187. }
  188. /// <summary>
  189. /// 执行存储过程
  190. /// </summary>
  191. /// <param name="procName">存储过程名</param>
  192. /// <param name="commandParameters">参数列表</param>
  193. public static void ExecuteProcedure(string procName, params OracleParameter[] commandParameters)
  194. {
  195. //initConnection();
  196. //initTransaction();
  197. try
  198. {
  199. OracleConnection conn = null;
  200. //执行命令
  201. OracleCommand cmd = new OracleCommand();
  202. cmd.Connection = conn;
  203. cmd.CommandText = procName;
  204. cmd.CommandType = CommandType.StoredProcedure;
  205. // 绑定传入的参数
  206. if (commandParameters != null)
  207. {
  208. foreach (OracleParameter parm in commandParameters)
  209. {
  210. cmd.Parameters.Add(parm);
  211. }
  212. }
  213. cmd.ExecuteNonQuery();
  214. //commitTransaction();
  215. cmd.Parameters.Clear();
  216. }
  217. catch (Exception ex)
  218. {
  219. //rollbackTransaction();
  220. LogHelper.Error(ex, ex.Message);
  221. throw new Exception(ex.Message, ex);
  222. }
  223. finally
  224. {
  225. //关闭数据库连接
  226. closeConnection();
  227. }
  228. }
  229. private static object ExtObjectLock = new object();
  230. /// <summary>
  231. /// 执行一个update,insert,delete,drop等SQL
  232. /// </summary>
  233. /// <param name="cmdText">SQL值</param>
  234. /// <returns>执行是否成功</returns>
  235. public static int ExecuteNonQuery(string sql)
  236. {
  237. //lock (ExtObjectLock)
  238. //{
  239. int val = 0;
  240. //initTransaction();
  241. OracleTransaction tran = null;
  242. using (OracleConnection conn = new OracleConnection(GetConnStr()))
  243. {
  244. //创建连接
  245. try
  246. {
  247. conn.Open();
  248. if (conn.State != ConnectionState.Connecting)
  249. {
  250. bool isb = false;
  251. try
  252. {
  253. tran = conn.BeginTransaction();
  254. isb = true;
  255. }
  256. catch
  257. { }
  258. finally
  259. {
  260. if (isb)
  261. {
  262. //创建一个新的命令
  263. OracleCommand cmd = new OracleCommand();
  264. cmd.CommandType = CommandType.Text;
  265. cmd.Connection = conn;
  266. cmd.Transaction = tran;
  267. //cmd.Connection = tran.Connection;
  268. cmd.CommandText = sql;
  269. //执行命令
  270. val = cmd.ExecuteNonQuery();
  271. tran.Commit();
  272. }
  273. }
  274. }
  275. }
  276. catch (System.Exception ex)
  277. {
  278. val = 0;
  279. //rollbackTransaction();
  280. LogHelper.Info("执行出错sql:" + sql);
  281. LogHelper.Error(ex, ex.Message);
  282. if (tran != null) { tran.Rollback(); tran.Dispose(); tran = null; }
  283. }
  284. finally
  285. {
  286. tran.Dispose();
  287. //关闭数据库连接
  288. //closeConnection();
  289. conn.Close();
  290. }
  291. }
  292. return val;
  293. //}
  294. }
  295. public static int PgExecuteNonQuery(string query)
  296. {
  297. int newId;
  298. try {
  299. using (var conn = new NpgsqlConnection(GetPgConnStr()))
  300. {
  301. using (var command = new NpgsqlCommand(query, conn))
  302. {
  303. conn.Open();
  304. newId = Convert.ToInt32(command.ExecuteScalar());
  305. }
  306. }
  307. }
  308. catch (Exception e) {
  309. LogHelper.Info(e.Message + e.InnerException);
  310. return 0;
  311. }
  312. //, params object[] parameters 这是入参 暂时不用
  313. return newId;
  314. }
  315. /// <summary>
  316. /// 将DataSet转换为泛型集合List
  317. /// </summary>
  318. /// <param name="ds">要转换的DataSet数据集</param>
  319. /// <returns>转换之后的泛型集合</returns>
  320. private static List<T> DataSetToList(DataSet ds)
  321. {
  322. List<T> list = new List<T>();
  323. try
  324. {
  325. // 根据数据量进行遍历
  326. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  327. {
  328. // 通过类型创建该类型的实例
  329. T _t = (T)Activator.CreateInstance(typeof(T));
  330. // 通过创建的实例获取该实例下的所有公共字段
  331. PropertyInfo[] propertys = _t.GetType().GetProperties();
  332. // 使用嵌套循环遍历数据列,匹配数据列名称与获取的公共字段名称,对符合的字段进行赋值
  333. foreach (PropertyInfo pi in propertys)
  334. {
  335. for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
  336. {
  337. if (pi.Name.Equals(ds.Tables[0].Columns[j].ColumnName))
  338. {
  339. //LogHelper.Info("666:" + ds.Tables[0].Columns[j].ColumnName);
  340. if (ds.Tables[0].Rows[i][j] != DBNull.Value)
  341. pi.SetValue(_t, ds.Tables[0].Rows[i][j], null);
  342. else
  343. // 对于数据库中的Null值需要进行单独处理
  344. pi.SetValue(_t, "", null);
  345. }
  346. }
  347. }
  348. list.Add(_t);
  349. }
  350. }
  351. catch (Exception ex)
  352. {
  353. // 抛出异常,上层进行异常捕获和处理并记录错误日志
  354. throw new Exception(ex.Message);
  355. }
  356. return list;
  357. }
  358. private static object ListLock = new object();
  359. /// <summary>
  360. /// 查询操作(返回泛型集合)当有查询操作时,应优先考虑使用RunQueryList方法
  361. /// </summary>
  362. /// <param name="sql">要执行的查询语句</param>
  363. /// <returns>对应数据实体的泛型集合</returns>
  364. public static List<T> RunQueryList(string sql)
  365. {
  366. //lock (ListLock)
  367. //{
  368. List<T> list = new List<T>();
  369. using (OracleConnection conn = new OracleConnection(GetConnStr()))
  370. {
  371. try
  372. {
  373. conn.Open();
  374. DataSet ds = new DataSet();
  375. OracleDataAdapter oda = new OracleDataAdapter(sql, conn);
  376. oda.Fill(ds);
  377. // 若没有查询到任何数据,则返回空
  378. if (ds == null || ds.Tables.Count < 0)
  379. return null;
  380. // 调用DataSet转List的转换方法
  381. list = DataSetToList(ds);
  382. }
  383. catch (Exception ex)
  384. {
  385. //conn.Close();
  386. LogHelper.Error(ex, ex.Message);
  387. LogHelper.Info("查询出错sql:" + sql);
  388. //throw new Exception(ex.Message);
  389. }
  390. finally
  391. {
  392. conn.Close();
  393. //closeConnection();
  394. }
  395. }
  396. return list;
  397. //}
  398. }
  399. public static List<T> PgRunQueryList(string sql)
  400. {
  401. List<T> ts = new List<T>();
  402. try
  403. {
  404. using (var conn = new NpgsqlConnection(GetPgConnStr()))
  405. {
  406. if (conn.State != ConnectionState.Open)
  407. {
  408. conn.Open();
  409. }
  410. T t = default(T);
  411. using (var nda = new NpgsqlDataAdapter(sql, conn))
  412. {
  413. DataTable dt = new DataTable();
  414. nda.Fill(dt);
  415. // 获得此模型的类型
  416. // Type type = typeof(McDevice);
  417. string tempName = "";
  418. foreach (DataRow dr in dt.Rows)
  419. {
  420. t = Activator.CreateInstance<T>();
  421. // 获得此模型的公共属性
  422. PropertyInfo[] propertys = t.GetType().GetProperties();
  423. foreach (PropertyInfo pi in propertys)
  424. {
  425. tempName = pi.Name; // 检查DataTable是否包含此列
  426. if (dt.Columns.Contains(tempName))
  427. {
  428. // 判断此属性是否有Setter
  429. if (!pi.CanWrite) continue;
  430. object value = dr[tempName];
  431. if (value != DBNull.Value)
  432. pi.SetValue(t, value, null);
  433. }
  434. }
  435. ts.Add(t);
  436. }
  437. }
  438. }
  439. }
  440. catch (Exception ex) { LogHelper.Info("查询pg数据返回lis集合异常" + ex.Message); }
  441. return ts;
  442. }
  443. }
  444. }