LeadDbHelperOracle.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. using Oracle.ManagedDataAccess.Client;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace NX_DbClassLibrary
  10. {
  11. /// <summary>
  12. /// Copyright20181102 (C) sunyalong
  13. /// 数据访问抽象基础类(基于Oracle.ManagedDataAccess)
  14. /// 允许修改、添加满足自己项目的需要。
  15. /// 添加、修改后请详细注释。违者会强制删除不予采用。
  16. /// </summary>
  17. public abstract class LeadDbHelperOracle
  18. {
  19. public static string connectionString = LeadConfigureConnectionString.GetConnectionString("LeadOracle");
  20. public LeadDbHelperOracle()
  21. {
  22. }
  23. #region 公用方法
  24. public static int GetMaxID(string FieldName, string TableName)
  25. {
  26. string strsql = "select max(" + FieldName + ")+1 from " + TableName;
  27. object obj = GetSingle(strsql);
  28. if (obj == null)
  29. {
  30. return 1;
  31. }
  32. else
  33. {
  34. return int.Parse(obj.ToString());
  35. }
  36. }
  37. public static bool Exists(string strSql)
  38. {
  39. object obj = GetSingle(strSql);
  40. int cmdresult;
  41. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  42. {
  43. cmdresult = 0;
  44. }
  45. else
  46. {
  47. cmdresult = int.Parse(obj.ToString());
  48. }
  49. if (cmdresult == 0)
  50. {
  51. return false;
  52. }
  53. else
  54. {
  55. return true;
  56. }
  57. }
  58. public static bool Exists(string strSql, params OracleParameter[] cmdParms)
  59. {
  60. object obj = GetSingle(strSql, cmdParms);
  61. int cmdresult;
  62. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  63. {
  64. cmdresult = 0;
  65. }
  66. else
  67. {
  68. cmdresult = int.Parse(obj.ToString());
  69. }
  70. if (cmdresult == 0)
  71. {
  72. return false;
  73. }
  74. else
  75. {
  76. return true;
  77. }
  78. }
  79. #endregion
  80. #region 执行简单SQL语句
  81. /// <summary>
  82. /// 执行SQL语句,返回影响的记录数
  83. /// </summary>
  84. /// <param name="SQLString">SQL语句</param>
  85. /// <returns>影响的记录数</returns>
  86. public static int ExecuteSql(string SQLString)
  87. {
  88. using (OracleConnection connection = new OracleConnection(connectionString))
  89. {
  90. using (OracleCommand cmd = new OracleCommand(SQLString, connection))
  91. {
  92. try
  93. {
  94. connection.Open();
  95. int rows = cmd.ExecuteNonQuery();
  96. return rows;
  97. }
  98. catch (Oracle.ManagedDataAccess.Client.OracleException E)
  99. {
  100. connection.Close();
  101. throw new Exception(E.Message);
  102. }
  103. }
  104. }
  105. }
  106. /// <summary>
  107. /// 执行多条SQL语句,实现数据库事务。
  108. /// </summary>
  109. /// <param name="SQLStringList">多条SQL语句</param>
  110. public static void ExecuteSqlTran(ArrayList SQLStringList)
  111. {
  112. using (OracleConnection conn = new OracleConnection(connectionString))
  113. {
  114. conn.Open();
  115. OracleCommand cmd = new OracleCommand
  116. {
  117. Connection = conn
  118. };
  119. OracleTransaction tx = conn.BeginTransaction();
  120. cmd.Transaction = tx;
  121. try
  122. {
  123. for (int n = 0; n < SQLStringList.Count; n++)
  124. {
  125. string strsql = SQLStringList[n].ToString();
  126. if (strsql.Trim().Length > 1)
  127. {
  128. cmd.CommandText = strsql;
  129. cmd.ExecuteNonQuery();
  130. }
  131. }
  132. tx.Commit();
  133. }
  134. catch (Oracle.ManagedDataAccess.Client.OracleException E)
  135. {
  136. tx.Rollback();
  137. throw new Exception(E.Message);
  138. }
  139. }
  140. }
  141. /// <summary>
  142. /// 执行带一个存储过程参数的的SQL语句。
  143. /// </summary>
  144. /// <param name="SQLString">SQL语句</param>
  145. /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
  146. /// <returns>影响的记录数</returns>
  147. public static int ExecuteSql(string SQLString, string content)
  148. {
  149. using (OracleConnection connection = new OracleConnection(connectionString))
  150. {
  151. OracleCommand cmd = new OracleCommand(SQLString, connection);
  152. OracleParameter myParameter = new OracleParameter("@content", new Object())
  153. {
  154. Value = content
  155. };
  156. cmd.Parameters.Add(myParameter);
  157. try
  158. {
  159. connection.Open();
  160. int rows = cmd.ExecuteNonQuery();
  161. return rows;
  162. }
  163. catch (Oracle.ManagedDataAccess.Client.OracleException E)
  164. {
  165. throw new Exception(E.Message);
  166. }
  167. finally
  168. {
  169. cmd.Dispose();
  170. connection.Close();
  171. }
  172. }
  173. }
  174. /// <summary>
  175. /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
  176. /// </summary>
  177. /// <param name="strSQL">SQL语句</param>
  178. /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
  179. /// <returns>影响的记录数</returns>
  180. public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
  181. {
  182. using (OracleConnection connection = new OracleConnection(connectionString))
  183. {
  184. OracleCommand cmd = new OracleCommand(strSQL, connection);
  185. OracleParameter myParameter = new OracleParameter("@fs", new Object())
  186. {
  187. Value = fs
  188. };
  189. cmd.Parameters.Add(myParameter);
  190. try
  191. {
  192. connection.Open();
  193. int rows = cmd.ExecuteNonQuery();
  194. return rows;
  195. }
  196. catch (Oracle.ManagedDataAccess.Client.OracleException E)
  197. {
  198. throw new Exception(E.Message);
  199. }
  200. finally
  201. {
  202. cmd.Dispose();
  203. connection.Close();
  204. }
  205. }
  206. }
  207. /// <summary>
  208. /// 执行一条计算查询结果语句,返回查询结果(object)。
  209. /// </summary>
  210. /// <param name="SQLString">计算查询结果语句</param>
  211. /// <returns>查询结果(object)</returns>
  212. public static object GetSingle(string SQLString)
  213. {
  214. using (OracleConnection connection = new OracleConnection(connectionString))
  215. {
  216. using (OracleCommand cmd = new OracleCommand(SQLString, connection))
  217. {
  218. try
  219. {
  220. connection.Open();
  221. object obj = cmd.ExecuteScalar();
  222. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  223. {
  224. return null;
  225. }
  226. else
  227. {
  228. return obj;
  229. }
  230. }
  231. catch (Oracle.ManagedDataAccess.Client.OracleException e)
  232. {
  233. connection.Close();
  234. throw new Exception(e.Message);
  235. }
  236. }
  237. }
  238. }
  239. /// <summary>
  240. /// 执行查询语句,返回OracleDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  241. /// </summary>
  242. /// <param name="strSQL">查询语句</param>
  243. /// <returns>OracleDataReader</returns>
  244. public static OracleDataReader ExecuteReader(string strSQL)
  245. {
  246. OracleConnection connection = new OracleConnection(connectionString);
  247. OracleCommand cmd = new OracleCommand(strSQL, connection);
  248. try
  249. {
  250. connection.Open();
  251. OracleDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  252. return myReader;
  253. }
  254. catch (Oracle.ManagedDataAccess.Client.OracleException e)
  255. {
  256. throw new Exception(e.Message);
  257. }
  258. }
  259. /// <summary>
  260. /// 执行查询语句,返回DataSet
  261. /// </summary>
  262. /// <param name="SQLString">查询语句</param>
  263. /// <returns>DataSet</returns>
  264. public static DataSet Query(string SQLString)
  265. {
  266. using (OracleConnection connection = new OracleConnection(connectionString))
  267. {
  268. DataSet ds = new DataSet();
  269. try
  270. {
  271. connection.Open();
  272. OracleDataAdapter command = new OracleDataAdapter(SQLString, connection);
  273. command.Fill(ds, "ds");
  274. }
  275. catch (Oracle.ManagedDataAccess.Client.OracleException ex)
  276. {
  277. throw new Exception(ex.Message);
  278. }
  279. return ds;
  280. }
  281. }
  282. #endregion
  283. #region 执行带参数的SQL语句
  284. /// <summary>
  285. /// 执行SQL语句,返回影响的记录数
  286. /// </summary>
  287. /// <param name="SQLString">SQL语句</param>
  288. /// <returns>影响的记录数</returns>
  289. public static int ExecuteSql(string SQLString, params OracleParameter[] cmdParms)
  290. {
  291. using (OracleConnection connection = new OracleConnection(connectionString))
  292. {
  293. using (OracleCommand cmd = new OracleCommand())
  294. {
  295. try
  296. {
  297. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  298. int rows = cmd.ExecuteNonQuery();
  299. cmd.Parameters.Clear();
  300. return rows;
  301. }
  302. catch (Oracle.ManagedDataAccess.Client.OracleException E)
  303. {
  304. throw new Exception(E.Message);
  305. }
  306. }
  307. }
  308. }
  309. /// <summary>
  310. /// 执行多条SQL语句,实现数据库事务。
  311. /// </summary>
  312. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的OracleParameter[])</param>
  313. public static void ExecuteSqlTran(Hashtable SQLStringList)
  314. {
  315. using (OracleConnection conn = new OracleConnection(connectionString))
  316. {
  317. conn.Open();
  318. using (OracleTransaction trans = conn.BeginTransaction())
  319. {
  320. OracleCommand cmd = new OracleCommand();
  321. try
  322. {
  323. //循环
  324. foreach (DictionaryEntry myDE in SQLStringList)
  325. {
  326. string cmdText = myDE.Key.ToString();
  327. OracleParameter[] cmdParms = (OracleParameter[])myDE.Value;
  328. PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
  329. int val = cmd.ExecuteNonQuery();
  330. cmd.Parameters.Clear();
  331. trans.Commit();
  332. }
  333. }
  334. catch
  335. {
  336. trans.Rollback();
  337. throw;
  338. }
  339. }
  340. }
  341. }
  342. /// <summary>
  343. /// 执行一条计算查询结果语句,返回查询结果(object)。
  344. /// </summary>
  345. /// <param name="SQLString">计算查询结果语句</param>
  346. /// <returns>查询结果(object)</returns>
  347. public static object GetSingle(string SQLString, params OracleParameter[] cmdParms)
  348. {
  349. using (OracleConnection connection = new OracleConnection(connectionString))
  350. {
  351. using (OracleCommand cmd = new OracleCommand())
  352. {
  353. try
  354. {
  355. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  356. object obj = cmd.ExecuteScalar();
  357. cmd.Parameters.Clear();
  358. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  359. {
  360. return null;
  361. }
  362. else
  363. {
  364. return obj;
  365. }
  366. }
  367. catch (Oracle.ManagedDataAccess.Client.OracleException e)
  368. {
  369. throw new Exception(e.Message);
  370. }
  371. }
  372. }
  373. }
  374. /// <summary>
  375. /// 执行查询语句,返回OracleDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  376. /// </summary>
  377. /// <param name="strSQL">查询语句</param>
  378. /// <returns>OracleDataReader</returns>
  379. public static OracleDataReader ExecuteReader(string SQLString, params OracleParameter[] cmdParms)
  380. {
  381. OracleConnection connection = new OracleConnection(connectionString);
  382. OracleCommand cmd = new OracleCommand();
  383. try
  384. {
  385. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  386. OracleDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  387. cmd.Parameters.Clear();
  388. return myReader;
  389. }
  390. catch (Oracle.ManagedDataAccess.Client.OracleException e)
  391. {
  392. throw new Exception(e.Message);
  393. }
  394. }
  395. /// <summary>
  396. /// 执行查询语句,返回DataSet
  397. /// </summary>
  398. /// <param name="SQLString">查询语句</param>
  399. /// <returns>DataSet</returns>
  400. public static DataSet Query(string SQLString, params OracleParameter[] cmdParms)
  401. {
  402. using (OracleConnection connection = new OracleConnection(connectionString))
  403. {
  404. OracleCommand cmd = new OracleCommand();
  405. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  406. using (OracleDataAdapter da = new OracleDataAdapter(cmd))
  407. {
  408. DataSet ds = new DataSet();
  409. try
  410. {
  411. da.Fill(ds, "ds");
  412. cmd.Parameters.Clear();
  413. }
  414. catch (Oracle.ManagedDataAccess.Client.OracleException ex)
  415. {
  416. throw new Exception(ex.Message);
  417. }
  418. return ds;
  419. }
  420. }
  421. }
  422. private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms)
  423. {
  424. if (conn.State != ConnectionState.Open)
  425. conn.Open();
  426. cmd.Connection = conn;
  427. cmd.CommandText = cmdText;
  428. if (trans != null)
  429. cmd.Transaction = trans;
  430. cmd.CommandType = CommandType.Text;//cmdType;
  431. if (cmdParms != null)
  432. {
  433. foreach (OracleParameter parm in cmdParms)
  434. cmd.Parameters.Add(parm);
  435. }
  436. }
  437. #endregion
  438. #region 存储过程操作
  439. /// <summary>
  440. /// 执行存储过程 返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  441. /// </summary>
  442. /// <param name="storedProcName">存储过程名</param>
  443. /// <param name="parameters">存储过程参数</param>
  444. /// <returns>OracleDataReader</returns>
  445. public static OracleDataReader RunProcedure(string storedProcName, IDataParameter[] parameters)
  446. {
  447. using (OracleConnection connection = new OracleConnection(connectionString))
  448. {
  449. OracleDataReader returnReader;
  450. connection.Open();
  451. OracleCommand command = BuildQueryCommand(connection, storedProcName, parameters);
  452. command.CommandType = CommandType.StoredProcedure;
  453. returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
  454. return returnReader;
  455. }
  456. }
  457. /// <summary>
  458. /// 执行存储过程
  459. /// </summary>
  460. /// <param name="storedProcName">存储过程名</param>
  461. /// <param name="parameters">存储过程参数</param>
  462. /// <param name="tableName">DataSet结果中的表名</param>
  463. /// <returns>DataSet</returns>
  464. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
  465. {
  466. using (OracleConnection connection = new OracleConnection(connectionString))
  467. {
  468. DataSet dataSet = new DataSet();
  469. connection.Open();
  470. OracleDataAdapter sqlDA = new OracleDataAdapter
  471. {
  472. SelectCommand = BuildQueryCommand(connection, storedProcName, parameters)
  473. };
  474. sqlDA.Fill(dataSet, tableName);
  475. connection.Close();
  476. return dataSet;
  477. }
  478. }
  479. /// <summary>
  480. /// 执行带参数的存储过程
  481. /// @auther SYL
  482. /// </summary>
  483. /// <param name="pro_name">存储过程名称</param>
  484. /// <param name="par_name">参数名称</param>
  485. public static void NewRunProcedure(string pro_name, string par_name)
  486. {
  487. using (OracleConnection connection = new OracleConnection(connectionString))
  488. {
  489. connection.Open();
  490. OracleCommand dr = new OracleCommand(pro_name, connection)
  491. {
  492. CommandType = CommandType.StoredProcedure //定义连接的是存储过程
  493. }; //连接存储过程
  494. OracleParameter op = dr.Parameters.Add("sql_str", OracleDbType.NVarchar2, 2000); //定义参数
  495. op.Direction = ParameterDirection.Input;
  496. op.Value = par_name;
  497. dr.ExecuteNonQuery();
  498. connection.Close();
  499. }
  500. }
  501. /// <summary>
  502. /// 构建 OracleCommand 对象(用来返回一个结果集,而不是一个整数值)
  503. /// </summary>
  504. /// <param name="connection">数据库连接</param>
  505. /// <param name="storedProcName">存储过程名</param>
  506. /// <param name="parameters">存储过程参数</param>
  507. /// <returns>OracleCommand</returns>
  508. private static OracleCommand BuildQueryCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
  509. {
  510. OracleCommand command = new OracleCommand(storedProcName, connection)
  511. {
  512. CommandType = CommandType.StoredProcedure
  513. };
  514. foreach (OracleParameter parameter in parameters)
  515. {
  516. command.Parameters.Add(parameter);
  517. }
  518. return command;
  519. }
  520. /// <summary>
  521. /// 执行存储过程,返回影响的行数
  522. /// </summary>
  523. /// <param name="storedProcName">存储过程名</param>
  524. /// <param name="parameters">存储过程参数</param>
  525. /// <param name="rowsAffected">影响的行数</param>
  526. /// <returns></returns>
  527. public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
  528. {
  529. using (OracleConnection connection = new OracleConnection(connectionString))
  530. {
  531. int result;
  532. connection.Open();
  533. OracleCommand command = BuildIntCommand(connection, storedProcName, parameters);
  534. rowsAffected = command.ExecuteNonQuery();
  535. result = (int)command.Parameters["ReturnValue"].Value;
  536. //Connection.Close();
  537. return result;
  538. }
  539. }
  540. /// <summary>
  541. /// 创建 OracleCommand 对象实例(用来返回一个整数值)
  542. /// </summary>
  543. /// <param name="storedProcName">存储过程名</param>
  544. /// <param name="parameters">存储过程参数</param>
  545. /// <returns>OracleCommand 对象实例</returns>
  546. private static OracleCommand BuildIntCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
  547. {
  548. OracleCommand command = BuildQueryCommand(connection, storedProcName, parameters);
  549. command.Parameters.Add(new OracleParameter("ReturnValue",
  550. OracleDbType.Int32, 4, ParameterDirection.ReturnValue,
  551. false, 0, 0, string.Empty, DataRowVersion.Default, null));
  552. return command;
  553. }
  554. #endregion
  555. }
  556. }