OracleDBConnection.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:OracleDBConnection.cs
  5. * 2.功能描述:Oracle数据库不带有事物的操作类
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 张国印 2014/09/01 1.00 新建
  9. *******************************************************************************/
  10. using System;
  11. using System.Collections;
  12. using System.Data;
  13. using System.IO;
  14. using Oracle.ManagedDataAccess.Client;
  15. namespace Dongke.IBOSS.PRD.Basics.DataAccess
  16. {
  17. /// <summary>
  18. /// Oracle数据库不带有事物的操作类
  19. /// </summary>
  20. public class OracleDBConnection : IDBConnection
  21. {
  22. ///// <summary>
  23. ///// SQL执行超时设置 30分钟(30*60=1800s)
  24. ///// </summary>
  25. //public const int CommandTimeout = 1800;
  26. /// <summary>
  27. /// SQL执行超时设置 0分钟(不限制)
  28. /// </summary>
  29. public const int CommandTimeout = 0;
  30. private static ArrayList m_Pool = new ArrayList();
  31. private ConnectionState m_ConnState = ConnectionState.Closed;//数据库连接状态
  32. private OracleConnection m_DbConnection; //数据连接
  33. private string m_connStr = ""; //数据库连接串
  34. /// <summary>
  35. /// 不忽略大小写,效率高
  36. /// </summary>
  37. private bool m_IgnoreCase = false;
  38. private bool m_IsCommandTimeout = true;
  39. /// <summary>
  40. /// 说明:构造函数初始化
  41. /// </summary>
  42. public OracleDBConnection(string m_strConn)
  43. {
  44. try
  45. {
  46. m_connStr = m_strConn;
  47. }
  48. catch (Exception ex)
  49. {
  50. string strError = ex.Message + ex.Source;
  51. throw new Exception(strError, ex);
  52. }
  53. }
  54. #region IDBConnection 成员
  55. public int PoolSize
  56. {
  57. get
  58. {
  59. return m_Pool.Count;
  60. }
  61. }
  62. /// <summary>
  63. /// 所属工程:数据访问层
  64. /// 数据库连接串
  65. /// 该属性只读
  66. /// </summary>
  67. public string ConnStr
  68. {
  69. get
  70. {
  71. return m_connStr;
  72. }
  73. }
  74. /// <summary>
  75. /// 连接对象
  76. /// </summary>
  77. public IDbConnection DbConnection
  78. {
  79. get
  80. {
  81. return m_DbConnection;
  82. }
  83. set
  84. {
  85. m_DbConnection = (value as OracleConnection);
  86. }
  87. }
  88. /// <summary>
  89. /// 忽略大小写
  90. /// </summary>
  91. public bool IgnoreCase
  92. {
  93. get
  94. {
  95. return m_IgnoreCase;
  96. }
  97. set
  98. {
  99. m_IgnoreCase = value;
  100. }
  101. }
  102. /// <summary>
  103. /// 执行限定超时
  104. /// </summary>
  105. public bool IsCommandTimeout
  106. {
  107. get
  108. {
  109. return m_IsCommandTimeout;
  110. }
  111. set
  112. {
  113. m_IsCommandTimeout = value;
  114. }
  115. }
  116. /// <summary>
  117. /// 所属工程:数据访问层
  118. /// 数据库连接状态
  119. /// 该属性可读写
  120. /// </summary>
  121. public ConnectionState ConnState
  122. {
  123. get
  124. {
  125. return m_ConnState;
  126. }
  127. }
  128. /// <summary>
  129. /// 说明: 打开创建数据库连接
  130. /// </summary>
  131. /// <returns>ConnectionState类型</returns>
  132. public ConnectionState Open()
  133. {
  134. try
  135. {
  136. // 初始化连接
  137. m_DbConnection = new OracleConnection(m_connStr);
  138. m_DbConnection.Open();
  139. if (this.IgnoreCase)
  140. {
  141. //using (OracleCommand oraCmd = new OracleCommand("ALTER SESSION SET NLS_SORT=BINARY_CI", m_DbConnection))
  142. //{
  143. // oraCmd.ExecuteNonQuery();
  144. //}
  145. //using (OracleCommand oraCmd = new OracleCommand("ALTER SESSION SET NLS_COMP=LINGUISTIC", m_DbConnection))
  146. //{
  147. // oraCmd.ExecuteNonQuery();
  148. //}
  149. using (OracleCommand oraCmd = m_DbConnection.CreateCommand())
  150. {
  151. oraCmd.CommandText = "ALTER SESSION SET NLS_SORT=BINARY_CI";
  152. oraCmd.ExecuteNonQuery();
  153. oraCmd.CommandText = "ALTER SESSION SET NLS_COMP=LINGUISTIC";
  154. oraCmd.ExecuteNonQuery();
  155. }
  156. }
  157. else
  158. {
  159. using (OracleCommand oraCmd = m_DbConnection.CreateCommand())
  160. {
  161. oraCmd.CommandText = "ALTER SESSION SET NLS_SORT=BINARY";
  162. oraCmd.ExecuteNonQuery();
  163. oraCmd.CommandText = "ALTER SESSION SET NLS_COMP=BINARY";
  164. oraCmd.ExecuteNonQuery();
  165. }
  166. }
  167. m_ConnState = m_DbConnection.State;
  168. //m_Pool.Add(m_DbConnection);
  169. //return m_ConnState;
  170. }
  171. catch (Exception ex)
  172. {
  173. m_ConnState = ConnectionState.Closed;
  174. string strError = ex.Message + ex.Source;
  175. throw new Exception(strError, ex);
  176. }
  177. return m_ConnState;
  178. }
  179. /// <summary>
  180. /// 说明:断开数据库连接
  181. /// </summary>
  182. /// <returns>ConnectionState类型</returns>
  183. ///
  184. public ConnectionState Close()
  185. {
  186. try
  187. {
  188. if (m_DbConnection != null)
  189. {
  190. if (m_ConnState == ConnectionState.Open)
  191. m_DbConnection.Close();
  192. m_ConnState = m_DbConnection.State;
  193. //if (m_Pool.Contains(m_DbConnection))
  194. //{
  195. // m_Pool.Remove(m_DbConnection);
  196. //}
  197. }
  198. }
  199. catch (Exception ex)
  200. {
  201. m_ConnState = ConnectionState.Closed;
  202. string strError = ex.Message + ex.Source;
  203. throw new Exception(strError, ex);
  204. }
  205. return m_ConnState;
  206. }
  207. /// <summary>
  208. /// 说明:获取语句的返回结果集
  209. /// </summary>
  210. /// <param name="p_strCommand">数据操作语句</param>
  211. /// <returns>
  212. /// DataSet对象
  213. /// </returns>
  214. public DataSet GetSqlResultToDs(string p_strCommand, IDataParameter[] p_Parameter)
  215. {
  216. DataSet myDs = new DataSet();
  217. if (m_DbConnection == null || m_DbConnection.State != ConnectionState.Open)
  218. Open();
  219. try
  220. {
  221. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  222. {
  223. if (p_Parameter != null)
  224. {
  225. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  226. dataAdapter.SelectCommand.BindByName = true;
  227. }
  228. if (m_IsCommandTimeout)
  229. {
  230. dataAdapter.SelectCommand.CommandTimeout = OracleDBConnection.CommandTimeout;
  231. }
  232. //dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  233. dataAdapter.Fill(myDs);
  234. }
  235. }
  236. catch (Exception ex)
  237. {
  238. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  239. throw new Exception(strError, ex);
  240. }
  241. return myDs;
  242. }
  243. /// <summary>
  244. /// 说明:获取语句的返回结果集
  245. /// </summary>
  246. /// <param name="p_strCommand">数据操作语句</param>
  247. /// <param name="p_strName">返回结果集的名称</param>
  248. /// <returns>
  249. /// DataSet对象
  250. /// </returns>
  251. public DataSet GetSqlResultToDs(string p_strCommand, string p_strName, IDataParameter[] p_Parameter)
  252. {
  253. DataSet myDs = new DataSet();
  254. if (m_DbConnection == null || m_DbConnection.State != ConnectionState.Open)
  255. Open();
  256. try
  257. {
  258. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  259. {
  260. if (p_Parameter != null)
  261. {
  262. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  263. dataAdapter.SelectCommand.BindByName = true;
  264. }
  265. if (m_IsCommandTimeout)
  266. {
  267. dataAdapter.SelectCommand.CommandTimeout = OracleDBConnection.CommandTimeout;
  268. }
  269. //dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  270. dataAdapter.Fill(myDs, p_strName);
  271. }
  272. }
  273. catch (Exception ex)
  274. {
  275. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  276. throw new Exception(strError, ex);
  277. }
  278. return myDs;
  279. }
  280. /// <summary>
  281. /// 说明:获取语句的返回结果集
  282. /// </summary>
  283. /// <param name="p_strCommand">为数据操作语句</param>
  284. /// <returns>
  285. /// DataTable对象
  286. /// </returns>
  287. public DataTable GetSqlResultToDt(string p_strCommand, IDataParameter[] p_Parameter)
  288. {
  289. //初始化结果集(DT)
  290. DataTable myDt = new DataTable();
  291. if (m_DbConnection == null || m_DbConnection.State != ConnectionState.Open)
  292. Open();
  293. try
  294. {
  295. //dataAdapte实例化
  296. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  297. {
  298. if (p_Parameter != null)
  299. {
  300. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  301. dataAdapter.SelectCommand.BindByName = true;
  302. }
  303. if (m_IsCommandTimeout)
  304. {
  305. dataAdapter.SelectCommand.CommandTimeout = OracleDBConnection.CommandTimeout;
  306. }
  307. //dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  308. //填充数据集(DT)
  309. dataAdapter.Fill(myDt);
  310. }
  311. }
  312. catch (Exception ex)
  313. {
  314. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  315. throw new Exception(strError, ex);
  316. }
  317. //返回数据集
  318. return myDt;
  319. }
  320. /// <summary>
  321. /// 说明:获取语句的单个字符串返回结果
  322. /// </summary>
  323. /// <param name="p_strCommand">为数据操作语句</param>
  324. /// <returns>
  325. /// string:单个查询结果
  326. /// </returns>
  327. public string GetSqlResultToStr(string p_strCommand, IDataParameter[] p_Parameter)
  328. {
  329. string strResult = "";
  330. object retValue = null;
  331. if (m_DbConnection == null || m_DbConnection.State != ConnectionState.Open)
  332. Open();
  333. try
  334. {
  335. using (OracleCommand oraCmd = new OracleCommand(p_strCommand, m_DbConnection))
  336. {
  337. if (p_Parameter != null)
  338. {
  339. oraCmd.Parameters.AddRange(p_Parameter);
  340. oraCmd.BindByName = true;
  341. }
  342. if (m_IsCommandTimeout)
  343. {
  344. oraCmd.CommandTimeout = OracleDBConnection.CommandTimeout;
  345. }
  346. retValue = oraCmd.ExecuteScalar();
  347. if (retValue != null)
  348. strResult = retValue.ToString();
  349. else
  350. strResult = String.Empty;
  351. }
  352. }
  353. catch (Exception ex)
  354. {
  355. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  356. throw new Exception(strError, ex);
  357. }
  358. return strResult;
  359. }
  360. /// <summary>
  361. /// 说明:获取语句的单个字符串返回结果
  362. /// </summary>
  363. /// <param name="p_strCommand">为数据操作语句</param>
  364. /// <returns>
  365. /// object:单个查询结果
  366. /// </returns>
  367. public object GetSqlResultToObj(string p_strCommand, IDataParameter[] p_Parameter)
  368. {
  369. object retValue = null;
  370. if (m_DbConnection == null || m_DbConnection.State != ConnectionState.Open)
  371. Open();
  372. try
  373. {
  374. using (OracleCommand oraCmd = new OracleCommand(p_strCommand, m_DbConnection))
  375. {
  376. if (p_Parameter != null)
  377. {
  378. oraCmd.Parameters.AddRange(p_Parameter);
  379. oraCmd.BindByName = true;
  380. }
  381. oraCmd.CommandTimeout = OracleDBTransaction.CommandTimeout;
  382. retValue = oraCmd.ExecuteScalar();
  383. }
  384. }
  385. catch (Exception ex)
  386. {
  387. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  388. throw new Exception(strError, ex);
  389. }
  390. return retValue;
  391. }
  392. /// <summary>
  393. /// 说明: 获取语句的单个byte[]类型返回结果
  394. /// </summary>
  395. /// <param name="p_strCommand">为数据操作语句</param>
  396. /// <returns>
  397. /// byte[]对象
  398. /// </returns>
  399. public byte[] GetSqlResultToBt(string p_strCommand, IDataParameter[] p_Parameter)
  400. {
  401. int bufferSize = 100;
  402. byte[] bytData = new byte[bufferSize];
  403. byte[] bytResult = null;
  404. int retval;
  405. int startIndex = 0;
  406. if (m_DbConnection == null || m_DbConnection.State != ConnectionState.Open)
  407. Open();
  408. try
  409. {
  410. using (OracleCommand oraCommand = new OracleCommand(p_strCommand, m_DbConnection))
  411. {
  412. if (p_Parameter != null)
  413. {
  414. oraCommand.Parameters.AddRange(p_Parameter);
  415. oraCommand.BindByName = true;
  416. }
  417. if (m_IsCommandTimeout)
  418. {
  419. oraCommand.CommandTimeout = OracleDBConnection.CommandTimeout;
  420. }
  421. using (OracleDataReader myReader = oraCommand.ExecuteReader(CommandBehavior.SequentialAccess))
  422. {
  423. //创建内存流,用于将byte[]数组写入到流中
  424. using (MemoryStream ms = new MemoryStream())
  425. {
  426. while (myReader.Read())
  427. {
  428. //读取blob列数据到bytData中
  429. retval = Convert.ToInt32(myReader.GetBytes(0, startIndex, bytData, 0, bufferSize));
  430. //将bytData写入到流中
  431. ms.Write(bytData, 0, retval);
  432. while (retval == bufferSize)
  433. {
  434. // 重新设置读取bytData数据后缓冲读取位置的开始索引
  435. startIndex += bufferSize;
  436. retval = Convert.ToInt32(myReader.GetBytes(0, startIndex, bytData, 0, bufferSize));
  437. ms.Write(bytData, 0, retval);
  438. }
  439. }
  440. bytResult = ms.ToArray();
  441. }
  442. }
  443. //ms.Close();
  444. //myReader.Close();
  445. }
  446. }
  447. catch (Exception ex)
  448. {
  449. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  450. throw new Exception(strError, ex);
  451. }
  452. return bytResult;
  453. }
  454. /// <summary>
  455. /// 执行存储过程
  456. /// </summary>
  457. /// <param name="p_strCommand">存储过程名称</param>
  458. /// <param name="p_Parameter">IDataParameter类型 参数集合</param>
  459. /// <returns></returns>
  460. public DataSet ExecStoredProcedure(string p_strCommand, IDataParameter[] p_Parameter)
  461. {
  462. DataSet myDs = new DataSet();
  463. if (m_DbConnection == null || m_DbConnection.State != ConnectionState.Open)
  464. Open();
  465. try
  466. {
  467. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  468. {
  469. if (p_Parameter != null)
  470. {
  471. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  472. dataAdapter.SelectCommand.BindByName = true;
  473. }
  474. if (m_IsCommandTimeout)
  475. {
  476. dataAdapter.SelectCommand.CommandTimeout = OracleDBConnection.CommandTimeout;
  477. }
  478. dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
  479. //dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  480. dataAdapter.Fill(myDs);
  481. }
  482. }
  483. catch (Exception ex)
  484. {
  485. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSqlProcedure(p_strCommand, p_Parameter);
  486. throw new Exception(strError, ex);
  487. }
  488. return myDs;
  489. }
  490. #endregion
  491. /// <summary>
  492. /// SQL语句转换类
  493. /// </summary>
  494. /// <param name="p_strSql">SQL语句</param>
  495. /// <param name="p_Parameter">参数集合</param>
  496. /// <returns></returns>
  497. private string CovnertToSql(string p_strSql, IDataParameter[] p_Parameter)
  498. {
  499. if (p_Parameter == null)
  500. return p_strSql;
  501. foreach (var itemPara in p_Parameter)
  502. {
  503. string strDbType = itemPara.DbType.ToString().ToUpper();
  504. string paraValue = null;
  505. if (strDbType.StartsWith("INT") || strDbType.StartsWith("DECIMAL"))
  506. {
  507. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  508. {
  509. paraValue = "NULL";
  510. }
  511. else
  512. {
  513. paraValue = itemPara.Value.ToString();
  514. }
  515. }
  516. else if (strDbType.StartsWith("DATE"))
  517. {
  518. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  519. {
  520. paraValue = "NULL";
  521. }
  522. else
  523. {
  524. paraValue = "to_date('" + itemPara.Value + "', 'yyyy-mm-dd hh24:mi:ss')";
  525. }
  526. }
  527. else
  528. {
  529. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  530. {
  531. paraValue = "NULL";
  532. }
  533. else
  534. {
  535. paraValue = "'" + itemPara.Value + "'";
  536. }
  537. }
  538. p_strSql = p_strSql.Replace(itemPara.ParameterName, paraValue);
  539. }
  540. return p_strSql;
  541. }
  542. private string CovnertToSqlProcedure(string p_strSql, IDataParameter[] p_Parameter)
  543. {
  544. if (p_Parameter == null)
  545. return p_strSql;
  546. p_strSql += "(";
  547. foreach (var itemPara in p_Parameter)
  548. {
  549. if (itemPara.Direction == ParameterDirection.Output ||
  550. itemPara.Direction == ParameterDirection.InputOutput)
  551. {
  552. p_strSql += itemPara.ParameterName + " => :" + itemPara.ParameterName + ",";
  553. continue;
  554. }
  555. string strDbType = itemPara.DbType.ToString().ToUpper();
  556. string paraValue = null;
  557. if (strDbType.StartsWith("INT") || strDbType.StartsWith("DECIMAL"))
  558. {
  559. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  560. {
  561. paraValue = "NULL";
  562. }
  563. else
  564. {
  565. paraValue = itemPara.Value.ToString();
  566. }
  567. }
  568. else if (strDbType.StartsWith("DATE"))
  569. {
  570. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  571. {
  572. paraValue = "NULL";
  573. }
  574. else
  575. {
  576. paraValue = "to_date('" + itemPara.Value + "', 'yyyy-mm-dd hh24:mi:ss')";
  577. }
  578. }
  579. else
  580. {
  581. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  582. {
  583. paraValue = "NULL";
  584. }
  585. else
  586. {
  587. paraValue = "'" + itemPara.Value + "'";
  588. }
  589. }
  590. p_strSql += itemPara.ParameterName + " => " + paraValue + ",";
  591. }
  592. p_strSql += ");";
  593. return p_strSql;
  594. }
  595. }
  596. }