OracleDBTransaction.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  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.DataAccess.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 void Commit()
  232. {
  233. try
  234. {
  235. m_OracleTransaction.Commit();
  236. }
  237. catch (Exception ex)
  238. {
  239. string strError = ex.Message + ex.Source;
  240. throw new Exception(strError, ex);
  241. }
  242. }
  243. public void Rollback()
  244. {
  245. try
  246. {
  247. m_OracleTransaction.Rollback();
  248. }
  249. catch (Exception ex)
  250. {
  251. string strError = ex.Message + ex.Source;
  252. throw new Exception(strError, ex);
  253. }
  254. }
  255. public void RollbackTo(string p_strcheckPoint)
  256. {
  257. //try
  258. //{
  259. // m_OracleTransaction.Rollback();
  260. //}
  261. //catch (Exception ex)
  262. //{
  263. // string strError = ex.Message + ex.Source;
  264. // throw new Exception(strError, ex);
  265. //}
  266. m_OracleTransaction.Rollback(p_strcheckPoint);
  267. }
  268. public void SavePoint(string p_strcheckPoint)
  269. {
  270. //throw new Exception("不支持此方法!");
  271. m_OracleTransaction.Save(p_strcheckPoint);
  272. }
  273. public int ExecuteNonQuery(string p_strCommand, IDataParameter[] p_Parameter)
  274. {
  275. return ExecuteNonQuery(p_strCommand, false, p_Parameter);
  276. }
  277. public int ExecuteNonQuery(string p_strCommand, bool p_procedure, IDataParameter[] p_Parameter)
  278. {
  279. int blReturn = 0;
  280. if (m_ConnState != ConnectionState.Open)
  281. Connect();
  282. try
  283. {
  284. using (OracleCommand myCommand = new OracleCommand(p_strCommand, m_DbConnection))
  285. {
  286. if (p_Parameter != null)
  287. {
  288. myCommand.Parameters.AddRange(p_Parameter);
  289. myCommand.BindByName = true;
  290. }
  291. if (m_IsCommandTimeout)
  292. {
  293. myCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  294. }
  295. //2009-05-24增加
  296. myCommand.Transaction = m_OracleTransaction;
  297. if (p_procedure)
  298. {
  299. myCommand.CommandType = CommandType.StoredProcedure;
  300. }
  301. else
  302. {
  303. myCommand.CommandType = CommandType.Text;
  304. }
  305. blReturn = myCommand.ExecuteNonQuery();
  306. if (m_AutoCommit)
  307. Commit();
  308. }
  309. }
  310. catch (Exception ex)
  311. {
  312. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  313. throw new Exception(strError, ex);
  314. }
  315. return blReturn;
  316. }
  317. public int UpdateBlob(string p_strTable, string p_strColumn, byte[] p_blobData, string p_strWhere)
  318. {
  319. int intReturn = 0;
  320. string strCommand = "UPDATE " + p_strTable + " SET " + p_strColumn + " =:blobValue where " + p_strWhere;
  321. //if (m_DbConnection.State != ConnectionState.Open)
  322. // Connect();
  323. if (m_ConnState != ConnectionState.Open)
  324. Connect();
  325. try
  326. {
  327. using (OracleCommand myCommand = new OracleCommand(strCommand, m_DbConnection))
  328. {
  329. //2009-05-24增加
  330. myCommand.Transaction = m_OracleTransaction;
  331. OracleParameter oraParam = new OracleParameter("blobValue", OracleDbType.Blob);
  332. oraParam.Direction = ParameterDirection.InputOutput;
  333. oraParam.Value = p_blobData;
  334. myCommand.Parameters.Add(oraParam);
  335. intReturn = myCommand.ExecuteNonQuery();
  336. if (m_AutoCommit)
  337. Commit();
  338. intReturn = 1;
  339. }
  340. }
  341. catch (Exception ex)
  342. {
  343. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + strCommand;
  344. throw new Exception(strError, ex);
  345. }
  346. return intReturn;
  347. }
  348. /// <summary>
  349. /// 说明:获取语句的返回结果集
  350. /// </summary>
  351. /// <param name="p_strCommand">数据操作语句</param>
  352. /// <returns>
  353. /// DataSet对象
  354. /// </returns>
  355. public DataSet GetSqlResultToDs(string p_strCommand, IDataParameter[] p_Parameter)
  356. {
  357. DataSet myDs = new DataSet();
  358. //if (m_DbConnection.State != ConnectionState.Open)
  359. // Connect();
  360. if (m_ConnState != ConnectionState.Open)
  361. Connect();
  362. try
  363. {
  364. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  365. {
  366. if (p_Parameter != null)
  367. {
  368. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  369. dataAdapter.SelectCommand.BindByName = true;
  370. }
  371. if (m_IsCommandTimeout)
  372. {
  373. dataAdapter.SelectCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  374. }
  375. dataAdapter.SelectCommand.Transaction = m_OracleTransaction;
  376. dataAdapter.Fill(myDs);
  377. }
  378. }
  379. catch (Exception ex)
  380. {
  381. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  382. throw new Exception(strError, ex);
  383. }
  384. return myDs;
  385. }
  386. /// <summary>
  387. /// 说明:获取语句的返回结果集
  388. /// </summary>
  389. /// <param name="p_strCommand">数据操作语句</param>
  390. /// <param name="p_strName">返回结果集的名称</param>
  391. /// <returns>
  392. /// DataSet对象
  393. /// </returns>
  394. public DataSet GetSqlResultToDs(string p_strCommand, string p_strName, IDataParameter[] p_Parameter)
  395. {
  396. DataSet myDs = new DataSet();
  397. //if (m_DbConnection.State != ConnectionState.Open)
  398. // Connect();
  399. if (m_ConnState != ConnectionState.Open)
  400. Connect();
  401. try
  402. {
  403. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  404. {
  405. if (p_Parameter != null)
  406. {
  407. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  408. dataAdapter.SelectCommand.BindByName = true;
  409. }
  410. if (m_IsCommandTimeout)
  411. {
  412. dataAdapter.SelectCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  413. }
  414. //2009-05-24增加
  415. dataAdapter.SelectCommand.Transaction = m_OracleTransaction;
  416. dataAdapter.Fill(myDs, p_strName);
  417. }
  418. }
  419. catch (Exception ex)
  420. {
  421. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  422. throw new Exception(strError, ex);
  423. }
  424. return myDs;
  425. }
  426. /// <summary>
  427. /// 说明:获取语句的返回结果集
  428. /// </summary>
  429. /// <param name="p_strCommand">为数据操作语句</param>
  430. /// <returns>
  431. /// DataTable对象
  432. /// </returns>
  433. public DataTable GetSqlResultToDt(string p_strCommand, IDataParameter[] p_Parameter)
  434. {
  435. //初始化结果集(DT)
  436. DataTable myDt = new DataTable();
  437. //if (m_DbConnection.State != ConnectionState.Open)
  438. // Connect();
  439. if (m_ConnState != ConnectionState.Open)
  440. Connect();
  441. try
  442. {
  443. //dataAdapte实例化
  444. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  445. {
  446. if (p_Parameter != null)
  447. {
  448. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  449. dataAdapter.SelectCommand.BindByName = true;
  450. }
  451. if (m_IsCommandTimeout)
  452. {
  453. dataAdapter.SelectCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  454. }
  455. //2009-05-24增加
  456. dataAdapter.SelectCommand.Transaction = m_OracleTransaction;
  457. //填充数据集(DT)
  458. dataAdapter.Fill(myDt);
  459. }
  460. }
  461. catch (Exception ex)
  462. {
  463. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  464. throw new Exception(strError, ex);
  465. }
  466. //返回数据集
  467. return myDt;
  468. }
  469. /// <summary>
  470. /// 说明:获取语句的单个字符串返回结果
  471. /// </summary>
  472. /// <param name="p_strCommand">为数据操作语句</param>
  473. /// <returns>
  474. /// string:单个查询结果
  475. /// </returns>
  476. public string GetSqlResultToStr(string p_strCommand, IDataParameter[] p_Parameter)
  477. {
  478. string strResult = "";
  479. object retValue = null;
  480. if (m_ConnState != ConnectionState.Open)
  481. Connect();
  482. try
  483. {
  484. using (OracleCommand oraCmd = new OracleCommand(p_strCommand, m_DbConnection))
  485. {
  486. if (p_Parameter != null)
  487. {
  488. oraCmd.Parameters.AddRange(p_Parameter);
  489. oraCmd.BindByName = true;
  490. }
  491. if (m_IsCommandTimeout)
  492. {
  493. oraCmd.CommandTimeout = OracleDBTransaction.CommandTimeout;
  494. }
  495. //2009-05-24增加
  496. oraCmd.Transaction = m_OracleTransaction;
  497. retValue = oraCmd.ExecuteScalar();
  498. if (retValue != null)
  499. strResult = retValue.ToString();
  500. else
  501. strResult = String.Empty;
  502. }
  503. }
  504. catch (Exception ex)
  505. {
  506. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  507. throw new Exception(strError, ex);
  508. }
  509. return strResult;
  510. }
  511. /// <summary>
  512. /// 说明:获取语句的单个字符串返回结果
  513. /// </summary>
  514. /// <param name="p_strCommand">为数据操作语句</param>
  515. /// <returns>
  516. /// object:单个查询结果
  517. /// </returns>
  518. public object GetSqlResultToObj(string p_strCommand, IDataParameter[] p_Parameter)
  519. {
  520. object retValue = null;
  521. if (m_ConnState != ConnectionState.Open)
  522. Connect();
  523. try
  524. {
  525. using (OracleCommand oraCmd = new OracleCommand(p_strCommand, m_DbConnection))
  526. {
  527. if (p_Parameter != null)
  528. {
  529. oraCmd.Parameters.AddRange(p_Parameter);
  530. oraCmd.BindByName = true;
  531. }
  532. if (m_IsCommandTimeout)
  533. {
  534. oraCmd.CommandTimeout = OracleDBTransaction.CommandTimeout;
  535. }
  536. //2009-05-24增加
  537. oraCmd.Transaction = m_OracleTransaction;
  538. retValue = oraCmd.ExecuteScalar();
  539. }
  540. }
  541. catch (Exception ex)
  542. {
  543. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  544. throw new Exception(strError, ex);
  545. }
  546. return retValue;
  547. }
  548. /// <summary>
  549. /// 说明: 获取语句的单个byte[]类型返回结果
  550. /// </summary>
  551. /// <param name="p_strCommand">为数据操作语句</param>
  552. /// <returns>
  553. /// byte[]对象
  554. /// </returns>
  555. public byte[] GetSqlResultToBt(string p_strCommand, IDataParameter[] p_Parameter)
  556. {
  557. int bufferSize = 100;
  558. byte[] bytData = new byte[bufferSize];
  559. byte[] bytResult = null;
  560. int retval;
  561. int startIndex = 0;
  562. //if (m_DbConnection.State != ConnectionState.Open)
  563. // Connect();
  564. if (m_ConnState != ConnectionState.Open)
  565. Connect();
  566. try
  567. {
  568. using (OracleCommand oraCommand = new OracleCommand(p_strCommand, m_DbConnection))
  569. {
  570. if (p_Parameter != null)
  571. {
  572. oraCommand.Parameters.AddRange(p_Parameter);
  573. oraCommand.BindByName = true;
  574. }
  575. if (m_IsCommandTimeout)
  576. {
  577. oraCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  578. }
  579. //2009-05-24增加
  580. oraCommand.Transaction = m_OracleTransaction;
  581. using (OracleDataReader myReader = oraCommand.ExecuteReader(CommandBehavior.SequentialAccess))
  582. {
  583. //创建内存流,用于将byte[]数组写入到流中
  584. using (MemoryStream ms = new MemoryStream())
  585. {
  586. while (myReader.Read())
  587. {
  588. //读取blob列数据到bytData中
  589. retval = Convert.ToInt32(myReader.GetBytes(0, startIndex, bytData, 0, bufferSize));
  590. //将bytData写入到流中
  591. ms.Write(bytData, 0, retval);
  592. while (retval == bufferSize)
  593. {
  594. // 重新设置读取bytData数据后缓冲读取位置的开始索引
  595. startIndex += bufferSize;
  596. retval = Convert.ToInt32(myReader.GetBytes(0, startIndex, bytData, 0, bufferSize));
  597. ms.Write(bytData, 0, retval);
  598. }
  599. }
  600. bytResult = ms.ToArray();
  601. }
  602. }
  603. //ms.Close();
  604. //myReader.Close();
  605. }
  606. }
  607. catch (Exception ex)
  608. {
  609. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSql(p_strCommand, p_Parameter);
  610. throw new Exception(strError, ex);
  611. }
  612. return bytResult;
  613. }
  614. /// <summary>
  615. /// 执行存储过程
  616. /// </summary>
  617. /// <param name="p_strCommand">存储过程名称</param>
  618. /// <param name="p_Parameter">IDataParameter类型 参数集合</param>
  619. /// <returns></returns>
  620. public DataSet ExecStoredProcedure(string p_strCommand, IDataParameter[] p_Parameter)
  621. {
  622. DataSet myDs = new DataSet();
  623. //if (m_DbConnection.State != ConnectionState.Open)
  624. // Connect();
  625. if (m_ConnState != ConnectionState.Open)
  626. Connect();
  627. try
  628. {
  629. using (OracleDataAdapter dataAdapter = new OracleDataAdapter(p_strCommand, m_DbConnection))
  630. {
  631. if (p_Parameter != null)
  632. {
  633. dataAdapter.SelectCommand.Parameters.AddRange(p_Parameter);
  634. dataAdapter.SelectCommand.BindByName = true;
  635. }
  636. if (m_IsCommandTimeout)
  637. {
  638. dataAdapter.SelectCommand.CommandTimeout = OracleDBTransaction.CommandTimeout;
  639. }
  640. dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
  641. dataAdapter.SelectCommand.Transaction = m_OracleTransaction;
  642. dataAdapter.Fill(myDs);
  643. }
  644. }
  645. catch (Exception ex)
  646. {
  647. string strError = ex.Message + ex.Source + " 对应的SQL语句为:" + CovnertToSqlProcedure(p_strCommand, p_Parameter);
  648. throw new Exception(strError, ex);
  649. }
  650. return myDs;
  651. }
  652. #endregion
  653. /// <summary>
  654. /// SQL语句转换类
  655. /// </summary>
  656. /// <param name="p_strSql">SQL语句</param>
  657. /// <param name="p_Parameter">参数集合</param>
  658. /// <returns></returns>
  659. private string CovnertToSql(string p_strSql, IDataParameter[] p_Parameter)
  660. {
  661. if (p_Parameter == null)
  662. return p_strSql;
  663. foreach (var itemPara in p_Parameter)
  664. {
  665. string strDbType = itemPara.DbType.ToString().ToUpper();
  666. string paraValue = null;
  667. if (strDbType.StartsWith("INT") || strDbType.StartsWith("DECIMAL"))
  668. {
  669. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  670. {
  671. paraValue = "NULL";
  672. }
  673. else
  674. {
  675. paraValue = itemPara.Value.ToString();
  676. }
  677. }
  678. else if (strDbType.StartsWith("DATE"))
  679. {
  680. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  681. {
  682. paraValue = "NULL";
  683. }
  684. else
  685. {
  686. paraValue = "to_date('" + itemPara.Value + "', 'yyyy-mm-dd hh24:mi:ss')";
  687. }
  688. }
  689. else
  690. {
  691. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  692. {
  693. paraValue = "NULL";
  694. }
  695. else
  696. {
  697. paraValue = "'" + itemPara.Value + "'";
  698. }
  699. }
  700. p_strSql = p_strSql.Replace(itemPara.ParameterName, paraValue);
  701. }
  702. return p_strSql;
  703. }
  704. private string CovnertToSqlProcedure(string p_strSql, IDataParameter[] p_Parameter)
  705. {
  706. if (p_Parameter == null)
  707. return p_strSql;
  708. p_strSql += "(";
  709. foreach (var itemPara in p_Parameter)
  710. {
  711. if (itemPara.Direction == ParameterDirection.Output ||
  712. itemPara.Direction == ParameterDirection.InputOutput)
  713. {
  714. p_strSql += itemPara.ParameterName + " => :" + itemPara.ParameterName + ",";
  715. continue;
  716. }
  717. string strDbType = itemPara.DbType.ToString().ToUpper();
  718. string paraValue = null;
  719. if (strDbType.StartsWith("INT") || strDbType.StartsWith("DECIMAL"))
  720. {
  721. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  722. {
  723. paraValue = "NULL";
  724. }
  725. else
  726. {
  727. paraValue = itemPara.Value.ToString();
  728. }
  729. }
  730. else if (strDbType.StartsWith("DATE"))
  731. {
  732. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  733. {
  734. paraValue = "NULL";
  735. }
  736. else
  737. {
  738. paraValue = "to_date('" + itemPara.Value + "', 'yyyy-mm-dd hh24:mi:ss')";
  739. }
  740. }
  741. else
  742. {
  743. if (itemPara.Value == null || itemPara.Value == DBNull.Value)
  744. {
  745. paraValue = "NULL";
  746. }
  747. else
  748. {
  749. paraValue = "'" + itemPara.Value + "'";
  750. }
  751. }
  752. p_strSql += itemPara.ParameterName + " => " + paraValue + ",";
  753. }
  754. p_strSql += ");";
  755. return p_strSql;
  756. }
  757. }
  758. }