OracleDBTransaction.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:OracleDBTransaction.cs
  5. * 2.功能描述:Oracle数据库带有事物的操作类
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 张国印 2014/09/01 1.00 新建
  9. *******************************************************************************/
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Data;
  13. using System.IO;
  14. using System.Linq;
  15. using System.Text;
  16. using Oracle.ManagedDataAccess.Client;
  17. namespace Dongke.IBOSS.PRD.Basics.DataAccess
  18. {
  19. public class OracleDBTransaction : IDBTransaction
  20. {
  21. ///// <summary>
  22. ///// SQL执行超时设置 30分钟(30*60=1800s)
  23. ///// </summary>
  24. //public const int CommandTimeout = 1800;
  25. /// <summary>
  26. /// SQL执行超时设置 0分钟(不限制)
  27. /// </summary>
  28. public const int CommandTimeout = 0;
  29. /// <summary>
  30. /// 数据库OracleConnection对象
  31. /// </summary>
  32. private OracleConnection m_DbConnection;
  33. /// <summary>
  34. /// 数据库OracleTransaction对象
  35. /// </summary>
  36. private OracleTransaction m_OracleTransaction;
  37. /// <summary>
  38. /// 数据库连接状态
  39. /// </summary>
  40. private ConnectionState m_ConnState;
  41. /// <summary>
  42. /// 数据库连接串
  43. /// </summary>
  44. private string m_connStr;
  45. /// <summary>
  46. /// 事务是否自动提交
  47. /// </summary>
  48. public bool m_AutoCommit = false;
  49. /// <summary>
  50. /// 不忽略大小写,效率高
  51. /// </summary>
  52. private bool m_IgnoreCase = false;
  53. private bool m_IsCommandTimeout = true;
  54. /// <summary>
  55. /// 说明:构造函数初始化
  56. /// </summary>
  57. public OracleDBTransaction(string m_strConn)
  58. {
  59. try
  60. {
  61. m_connStr = m_strConn;
  62. }
  63. catch (Exception ex)
  64. {
  65. string strError = ex.Message + ex.Source;
  66. throw new Exception(strError, ex);
  67. }
  68. }
  69. #region IDBTransaction 成员
  70. /// <summary>
  71. /// 所属工程:数据访问层
  72. /// 数据库连接串
  73. /// 该属性只读
  74. /// </summary>
  75. public string ConnStr
  76. {
  77. get
  78. {
  79. return m_connStr;
  80. }
  81. }
  82. /// <summary>
  83. /// 所属工程:数据访问层
  84. /// 数据库连接状态。
  85. /// 该属性为读写
  86. /// </summary>
  87. public ConnectionState ConnState
  88. {
  89. get
  90. {
  91. return m_ConnState;
  92. }
  93. }
  94. /// <summary>
  95. /// 所属工程:数据访问层
  96. /// 事务是否自动提交
  97. /// 该属性为读写
  98. /// </summary>
  99. public bool AutoCommit
  100. {
  101. get
  102. {
  103. return m_AutoCommit;
  104. }
  105. set
  106. {
  107. m_AutoCommit = value;
  108. }
  109. }
  110. /// <summary>
  111. /// 连接对象
  112. /// </summary>
  113. public IDbConnection DbConnection
  114. {
  115. get
  116. {
  117. return m_DbConnection;
  118. }
  119. set
  120. {
  121. m_DbConnection = (value as OracleConnection);
  122. }
  123. }
  124. /// <summary>
  125. /// 忽略大小写
  126. /// </summary>
  127. public bool IgnoreCase
  128. {
  129. get
  130. {
  131. return m_IgnoreCase;
  132. }
  133. set
  134. {
  135. m_IgnoreCase = value;
  136. }
  137. }
  138. /// <summary>
  139. /// 执行限定超时
  140. /// </summary>
  141. public bool IsCommandTimeout
  142. {
  143. get
  144. {
  145. return m_IsCommandTimeout;
  146. }
  147. set
  148. {
  149. m_IsCommandTimeout = value;
  150. }
  151. }
  152. public System.Data.ConnectionState Connect()
  153. {
  154. try
  155. {
  156. // 初始化连接
  157. m_DbConnection = new OracleConnection(m_connStr);
  158. m_DbConnection.Open();
  159. if (this.IgnoreCase)
  160. {
  161. //using (OracleCommand oraCmd = new OracleCommand("ALTER SESSION SET NLS_SORT=BINARY_CI", m_DbConnection))
  162. //{
  163. // oraCmd.ExecuteNonQuery();
  164. //}
  165. //using (OracleCommand oraCmd = new OracleCommand("ALTER SESSION SET NLS_COMP=LINGUISTIC", m_DbConnection))
  166. //{
  167. // oraCmd.ExecuteNonQuery();
  168. //}
  169. using (OracleCommand oraCmd = m_DbConnection.CreateCommand())
  170. {
  171. oraCmd.CommandText = "ALTER SESSION SET NLS_SORT=BINARY_CI";
  172. oraCmd.ExecuteNonQuery();
  173. oraCmd.CommandText = "ALTER SESSION SET NLS_COMP=LINGUISTIC";
  174. oraCmd.ExecuteNonQuery();
  175. }
  176. }
  177. else
  178. {
  179. using (OracleCommand oraCmd = m_DbConnection.CreateCommand())
  180. {
  181. oraCmd.CommandText = "ALTER SESSION SET NLS_SORT=BINARY";
  182. oraCmd.ExecuteNonQuery();
  183. oraCmd.CommandText = "ALTER SESSION SET NLS_COMP=BINARY";
  184. oraCmd.ExecuteNonQuery();
  185. }
  186. }
  187. m_ConnState = m_DbConnection.State;
  188. m_OracleTransaction = m_DbConnection.BeginTransaction(IsolationLevel.ReadCommitted);
  189. }
  190. catch (Exception ex)
  191. {
  192. m_ConnState = ConnectionState.Closed;
  193. string strError = ex.Message + ex.Source;
  194. throw new Exception(strError, ex);
  195. }
  196. return m_ConnState;
  197. }
  198. public bool CreateTransaction()
  199. {
  200. bool blSucess = false;
  201. try
  202. {
  203. if (m_ConnState != ConnectionState.Open)
  204. Connect();
  205. m_OracleTransaction = m_DbConnection.BeginTransaction(IsolationLevel.ReadCommitted);
  206. blSucess = true;
  207. }
  208. catch (Exception ex)
  209. {
  210. string strError = ex.Message + ex.Source;
  211. throw new Exception(strError, ex);
  212. }
  213. return blSucess;
  214. }
  215. public System.Data.ConnectionState Disconnect()
  216. {
  217. try
  218. {
  219. if (m_ConnState == ConnectionState.Open)
  220. m_DbConnection.Close();
  221. m_ConnState = m_DbConnection.State;
  222. }
  223. catch (Exception ex)
  224. {
  225. m_ConnState = ConnectionState.Closed;
  226. string strError = ex.Message + ex.Source;
  227. throw new Exception(strError, ex);
  228. }
  229. return m_ConnState;
  230. }
  231. public System.Data.ConnectionState Close()
  232. {
  233. return Disconnect();
  234. }
  235. public void Commit()
  236. {
  237. try
  238. {
  239. m_OracleTransaction.Commit();
  240. }
  241. catch (Exception ex)
  242. {
  243. string strError = ex.Message + ex.Source;
  244. throw new Exception(strError, ex);
  245. }
  246. }
  247. public void Rollback()
  248. {
  249. try
  250. {
  251. m_OracleTransaction.Rollback();
  252. }
  253. catch (Exception ex)
  254. {
  255. string strError = ex.Message + ex.Source;
  256. throw new Exception(strError, ex);
  257. }
  258. }
  259. public void RollbackTo(string p_strcheckPoint)
  260. {
  261. //try
  262. //{
  263. // m_OracleTransaction.Rollback();
  264. //}
  265. //catch (Exception ex)
  266. //{
  267. // string strError = ex.Message + ex.Source;
  268. // throw new Exception(strError, ex);
  269. //}
  270. m_OracleTransaction.Rollback(p_strcheckPoint);
  271. }
  272. public void SavePoint(string p_strcheckPoint)
  273. {
  274. //throw new Exception("不支持此方法!");
  275. m_OracleTransaction.Save(p_strcheckPoint);
  276. }
  277. public int ExecuteNonQuery(string p_strCommand, IDataParameter[] p_Parameter)
  278. {
  279. return ExecuteNonQuery(p_strCommand, false, p_Parameter);
  280. }
  281. public int ExecuteNonQuery(string p_strCommand, bool p_procedure, IDataParameter[] p_Parameter)
  282. {
  283. int blReturn = 0;
  284. if (m_ConnState != ConnectionState.Open)
  285. Connect();
  286. try
  287. {
  288. using (OracleCommand myCommand = new OracleCommand(p_strCommand, m_DbConnection))
  289. {
  290. if (p_Parameter != null)
  291. {
  292. myCommand.Parameters.AddRange(p_Parameter);
  293. myCommand.BindByName = true;
  294. }
  295. if (m_IsCommandTimeout)
  296. {
  297. myCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  298. }
  299. //2009-05-24增加
  300. myCommand.Transaction = m_OracleTransaction;
  301. if (p_procedure)
  302. {
  303. myCommand.CommandType = CommandType.StoredProcedure;
  304. }
  305. else
  306. {
  307. myCommand.CommandType = CommandType.Text;
  308. }
  309. blReturn = myCommand.ExecuteNonQuery();
  310. if (m_AutoCommit)
  311. Commit();
  312. }
  313. }
  314. catch (Exception ex)
  315. {
  316. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  317. throw new Exception(strError, ex);
  318. }
  319. return blReturn;
  320. }
  321. public int UpdateBlob(string p_strTable, string p_strColumn, byte[] p_blobData, string p_strWhere)
  322. {
  323. int intReturn = 0;
  324. string strCommand = "UPDATE " + p_strTable + " SET " + p_strColumn + " =:blobValue where " + p_strWhere;
  325. //if (m_DbConnection.State != ConnectionState.Open)
  326. // Connect();
  327. if (m_ConnState != ConnectionState.Open)
  328. Connect();
  329. try
  330. {
  331. using (OracleCommand myCommand = new OracleCommand(strCommand, m_DbConnection))
  332. {
  333. //2009-05-24增加
  334. myCommand.Transaction = m_OracleTransaction;
  335. OracleParameter oraParam = new OracleParameter("blobValue", OracleDbType.Blob);
  336. oraParam.Direction = ParameterDirection.InputOutput;
  337. oraParam.Value = p_blobData;
  338. myCommand.Parameters.Add(oraParam);
  339. intReturn = myCommand.ExecuteNonQuery();
  340. if (m_AutoCommit)
  341. Commit();
  342. intReturn = 1;
  343. }
  344. }
  345. catch (Exception ex)
  346. {
  347. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + strCommand;
  348. throw new Exception(strError, ex);
  349. }
  350. return intReturn;
  351. }
  352. /// <summary>
  353. /// 说明:获取语句的返回结果集
  354. /// </summary>
  355. /// <param name="p_strCommand">数据操作语句</param>
  356. /// <returns>
  357. /// DataSet对象
  358. /// </returns>
  359. public DataSet GetSqlResultToDs(string p_strCommand, IDataParameter[] p_Parameter)
  360. {
  361. DataSet myDs = new DataSet();
  362. //if (m_DbConnection.State != ConnectionState.Open)
  363. // Connect();
  364. if (m_ConnState != ConnectionState.Open)
  365. Connect();
  366. try
  367. {
  368. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  369. {
  370. if (p_Parameter != null)
  371. {
  372. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  373. dataAdapter.SelectCommand.BindByName = true;
  374. }
  375. if (m_IsCommandTimeout)
  376. {
  377. dataAdapter.SelectCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  378. }
  379. dataAdapter.SelectCommand.Transaction = m_OracleTransaction;
  380. dataAdapter.Fill(myDs);
  381. }
  382. }
  383. catch (Exception ex)
  384. {
  385. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  386. throw new Exception(strError, ex);
  387. }
  388. return myDs;
  389. }
  390. /// <summary>
  391. /// 说明:获取语句的返回结果集
  392. /// </summary>
  393. /// <param name="p_strCommand">数据操作语句</param>
  394. /// <param name="p_strName">返回结果集的名称</param>
  395. /// <returns>
  396. /// DataSet对象
  397. /// </returns>
  398. public DataSet GetSqlResultToDs(string p_strCommand, string p_strName, IDataParameter[] p_Parameter)
  399. {
  400. DataSet myDs = new DataSet();
  401. //if (m_DbConnection.State != ConnectionState.Open)
  402. // Connect();
  403. if (m_ConnState != ConnectionState.Open)
  404. Connect();
  405. try
  406. {
  407. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  408. {
  409. if (p_Parameter != null)
  410. {
  411. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  412. dataAdapter.SelectCommand.BindByName = true;
  413. }
  414. if (m_IsCommandTimeout)
  415. {
  416. dataAdapter.SelectCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  417. }
  418. //2009-05-24增加
  419. dataAdapter.SelectCommand.Transaction = m_OracleTransaction;
  420. dataAdapter.Fill(myDs, p_strName);
  421. }
  422. }
  423. catch (Exception ex)
  424. {
  425. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  426. throw new Exception(strError, ex);
  427. }
  428. return myDs;
  429. }
  430. /// <summary>
  431. /// 说明:获取语句的返回结果集
  432. /// </summary>
  433. /// <param name="p_strCommand">为数据操作语句</param>
  434. /// <returns>
  435. /// DataTable对象
  436. /// </returns>
  437. public DataTable GetSqlResultToDt(string p_strCommand, IDataParameter[] p_Parameter)
  438. {
  439. //初始化结果集(DT)
  440. DataTable myDt = new DataTable();
  441. //if (m_DbConnection.State != ConnectionState.Open)
  442. // Connect();
  443. if (m_ConnState != ConnectionState.Open)
  444. Connect();
  445. try
  446. {
  447. //dataAdapte实例化
  448. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  449. {
  450. if (p_Parameter != null)
  451. {
  452. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  453. dataAdapter.SelectCommand.BindByName = true;
  454. }
  455. if (m_IsCommandTimeout)
  456. {
  457. dataAdapter.SelectCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  458. }
  459. //2009-05-24增加
  460. dataAdapter.SelectCommand.Transaction = m_OracleTransaction;
  461. //填充数据集(DT)
  462. dataAdapter.Fill(myDt);
  463. }
  464. }
  465. catch (Exception ex)
  466. {
  467. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  468. throw new Exception(strError, ex);
  469. }
  470. //返回数据集
  471. return myDt;
  472. }
  473. /// <summary>
  474. /// 说明:获取语句的单个字符串返回结果
  475. /// </summary>
  476. /// <param name="p_strCommand">为数据操作语句</param>
  477. /// <returns>
  478. /// string:单个查询结果
  479. /// </returns>
  480. public string GetSqlResultToStr(string p_strCommand, IDataParameter[] p_Parameter)
  481. {
  482. string strResult = "";
  483. object retValue = null;
  484. if (m_ConnState != ConnectionState.Open)
  485. Connect();
  486. try
  487. {
  488. using (OracleCommand oraCmd = new OracleCommand(p_strCommand, m_DbConnection))
  489. {
  490. if (p_Parameter != null)
  491. {
  492. oraCmd.Parameters.AddRange(p_Parameter);
  493. oraCmd.BindByName = true;
  494. }
  495. if (m_IsCommandTimeout)
  496. {
  497. oraCmd.CommandTimeout = OracleDBTransaction.CommandTimeout;
  498. }
  499. //2009-05-24增加
  500. oraCmd.Transaction = m_OracleTransaction;
  501. retValue = oraCmd.ExecuteScalar();
  502. if (retValue != null)
  503. strResult = retValue.ToString();
  504. else
  505. strResult = String.Empty;
  506. }
  507. }
  508. catch (Exception ex)
  509. {
  510. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  511. throw new Exception(strError, ex);
  512. }
  513. return strResult;
  514. }
  515. /// <summary>
  516. /// 说明:获取语句的单个字符串返回结果
  517. /// </summary>
  518. /// <param name="p_strCommand">为数据操作语句</param>
  519. /// <returns>
  520. /// object:单个查询结果
  521. /// </returns>
  522. public object GetSqlResultToObj(string p_strCommand, IDataParameter[] p_Parameter)
  523. {
  524. object retValue = null;
  525. if (m_ConnState != ConnectionState.Open)
  526. Connect();
  527. try
  528. {
  529. using (OracleCommand oraCmd = new OracleCommand(p_strCommand, m_DbConnection))
  530. {
  531. if (p_Parameter != null)
  532. {
  533. oraCmd.Parameters.AddRange(p_Parameter);
  534. oraCmd.BindByName = true;
  535. }
  536. if (m_IsCommandTimeout)
  537. {
  538. oraCmd.CommandTimeout = OracleDBTransaction.CommandTimeout;
  539. }
  540. //2009-05-24增加
  541. oraCmd.Transaction = m_OracleTransaction;
  542. retValue = oraCmd.ExecuteScalar();
  543. }
  544. }
  545. catch (Exception ex)
  546. {
  547. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  548. throw new Exception(strError, ex);
  549. }
  550. return retValue;
  551. }
  552. /// <summary>
  553. /// 说明: 获取语句的单个byte[]类型返回结果
  554. /// </summary>
  555. /// <param name="p_strCommand">为数据操作语句</param>
  556. /// <returns>
  557. /// byte[]对象
  558. /// </returns>
  559. public byte[] GetSqlResultToBt(string p_strCommand, IDataParameter[] p_Parameter)
  560. {
  561. int bufferSize = 100;
  562. byte[] bytData = new byte[bufferSize];
  563. byte[] bytResult = null;
  564. int retval;
  565. int startIndex = 0;
  566. //if (m_DbConnection.State != ConnectionState.Open)
  567. // Connect();
  568. if (m_ConnState != ConnectionState.Open)
  569. Connect();
  570. try
  571. {
  572. using (OracleCommand oraCommand = new OracleCommand(p_strCommand, m_DbConnection))
  573. {
  574. if (p_Parameter != null)
  575. {
  576. oraCommand.Parameters.AddRange(p_Parameter);
  577. oraCommand.BindByName = true;
  578. }
  579. if (m_IsCommandTimeout)
  580. {
  581. oraCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  582. }
  583. //2009-05-24增加
  584. oraCommand.Transaction = m_OracleTransaction;
  585. using (OracleDataReader myReader = oraCommand.ExecuteReader(CommandBehavior.SequentialAccess))
  586. {
  587. //创建内存流,用于将byte[]数组写入到流中
  588. using (MemoryStream ms = new MemoryStream())
  589. {
  590. while (myReader.Read())
  591. {
  592. //读取blob列数据到bytData中
  593. retval = Convert.ToInt32(myReader.GetBytes(0, startIndex, bytData, 0, bufferSize));
  594. //将bytData写入到流中
  595. ms.Write(bytData, 0, retval);
  596. while (retval == bufferSize)
  597. {
  598. // 重新设置读取bytData数据后缓冲读取位置的开始索引
  599. startIndex += bufferSize;
  600. retval = Convert.ToInt32(myReader.GetBytes(0, startIndex, bytData, 0, bufferSize));
  601. ms.Write(bytData, 0, retval);
  602. }
  603. }
  604. bytResult = ms.ToArray();
  605. }
  606. }
  607. //ms.Close();
  608. //myReader.Close();
  609. }
  610. }
  611. catch (Exception ex)
  612. {
  613. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  614. throw new Exception(strError, ex);
  615. }
  616. return bytResult;
  617. }
  618. /// <summary>
  619. /// 执行存储过程
  620. /// </summary>
  621. /// <param name="p_strCommand">存储过程名称</param>
  622. /// <param name="p_Parameter">IDataParameter类型 参数集合</param>
  623. /// <returns></returns>
  624. public DataSet ExecStoredProcedure(string p_strCommand, IDataParameter[] p_Parameter)
  625. {
  626. DataSet myDs = new DataSet();
  627. //if (m_DbConnection.State != ConnectionState.Open)
  628. // Connect();
  629. if (m_ConnState != ConnectionState.Open)
  630. Connect();
  631. try
  632. {
  633. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  634. {
  635. if (p_Parameter != null)
  636. {
  637. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  638. dataAdapter.SelectCommand.BindByName = true;
  639. }
  640. if (m_IsCommandTimeout)
  641. {
  642. dataAdapter.SelectCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  643. }
  644. dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
  645. dataAdapter.SelectCommand.Transaction = m_OracleTransaction;
  646. dataAdapter.Fill(myDs);
  647. }
  648. }
  649. catch (Exception ex)
  650. {
  651. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSqlProcedure(p_strCommand, p_Parameter);
  652. throw new Exception(strError, ex);
  653. }
  654. return myDs;
  655. }
  656. #endregion
  657. /// <summary>
  658. /// SQL语句转换类
  659. /// </summary>
  660. /// <param name="p_strSql">SQL语句</param>
  661. /// <param name="p_Parameter">参数集合</param>
  662. /// <returns></returns>
  663. private string CovnertToSql(string p_strSql, IDataParameter[] p_Parameter)
  664. {
  665. if (p_Parameter == null)
  666. return p_strSql;
  667. foreach (var itemPara in p_Parameter)
  668. {
  669. string strDbType = itemPara.DbType.ToString().ToUpper();
  670. string paraValue = null;
  671. if (strDbType.StartsWith("INT") || strDbType.StartsWith("DECIMAL"))
  672. {
  673. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  674. {
  675. paraValue = "NULL";
  676. }
  677. else
  678. {
  679. paraValue = itemPara.Value.ToString();
  680. }
  681. }
  682. else if (strDbType.StartsWith("DATE"))
  683. {
  684. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  685. {
  686. paraValue = "NULL";
  687. }
  688. else
  689. {
  690. paraValue = "to_date('" + itemPara.Value + "', 'yyyy-mm-dd hh24:mi:ss')";
  691. }
  692. }
  693. else
  694. {
  695. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  696. {
  697. paraValue = "NULL";
  698. }
  699. else
  700. {
  701. paraValue = "'" + itemPara.Value + "'";
  702. }
  703. }
  704. p_strSql = p_strSql.Replace(itemPara.ParameterName, paraValue);
  705. }
  706. return p_strSql;
  707. }
  708. private string CovnertToSqlProcedure(string p_strSql, IDataParameter[] p_Parameter)
  709. {
  710. if (p_Parameter == null)
  711. return p_strSql;
  712. p_strSql += "(";
  713. foreach (var itemPara in p_Parameter)
  714. {
  715. if (itemPara.Direction == ParameterDirection.Output ||
  716. itemPara.Direction == ParameterDirection.InputOutput)
  717. {
  718. p_strSql += itemPara.ParameterName + " => :" + itemPara.ParameterName + ",";
  719. continue;
  720. }
  721. string strDbType = itemPara.DbType.ToString().ToUpper();
  722. string paraValue = null;
  723. if (strDbType.StartsWith("INT") || strDbType.StartsWith("DECIMAL"))
  724. {
  725. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  726. {
  727. paraValue = "NULL";
  728. }
  729. else
  730. {
  731. paraValue = itemPara.Value.ToString();
  732. }
  733. }
  734. else if (strDbType.StartsWith("DATE"))
  735. {
  736. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  737. {
  738. paraValue = "NULL";
  739. }
  740. else
  741. {
  742. paraValue = "to_date('" + itemPara.Value + "', 'yyyy-mm-dd hh24:mi:ss')";
  743. }
  744. }
  745. else
  746. {
  747. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  748. {
  749. paraValue = "NULL";
  750. }
  751. else
  752. {
  753. paraValue = "'" + itemPara.Value + "'";
  754. }
  755. }
  756. p_strSql += itemPara.ParameterName + " => " + paraValue + ",";
  757. }
  758. p_strSql += ");";
  759. return p_strSql;
  760. }
  761. }
  762. }