Helper_SQLHelper.cs 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. /*******************************************************************************
  2. * iNethinkCMS - 网站内容管理系统
  3. * Copyright (C) 2012-2013 inethink.com
  4. *
  5. * @author jackyang <69991000@qq.com>
  6. * @website http://cms.inethink.com
  7. * @version 1.3.6.0 (2013-08-14)
  8. *
  9. * This is licensed under the GNU LGPL, version 3.0 or later.
  10. * For details, see: http://www.gnu.org/licenses/gpl-3.0.html
  11. *******************************************************************************/
  12. using System;
  13. using System.Collections;
  14. using System.Collections.Specialized;
  15. using System.Data;
  16. using System.Data.SqlClient;
  17. using System.Configuration;
  18. using System.Data.Common;
  19. using System.Collections.Generic;
  20. namespace iNethinkCMS.Helper
  21. {
  22. /// <summary>
  23. /// 数据访问抽象基础类
  24. /// </summary>
  25. public abstract class SQLHelper
  26. {
  27. public SQLHelper()
  28. {
  29. }
  30. #region 公用方法
  31. /// <summary>
  32. /// 判断是否存在某表的某个字段
  33. /// </summary>
  34. /// <param name="tableName">表名称</param>
  35. /// <param name="columnName">列名称</param>
  36. /// <returns>是否存在</returns>
  37. public static bool ColumnExists(string tableName, string columnName)
  38. {
  39. string sql = "select count(1) from syscolumns where [id]=object_id('" + tableName + "') and [name]='" + columnName + "'";
  40. object res = GetSingle(sql);
  41. if (res == null)
  42. {
  43. return false;
  44. }
  45. return Convert.ToInt32(res) > 0;
  46. }
  47. public static int GetMaxID(string FieldName, string TableName)
  48. {
  49. string strsql = "select max(" + FieldName + ")+1 from " + TableName;
  50. object obj = GetSingle(strsql);
  51. if (obj == null)
  52. {
  53. return 1;
  54. }
  55. else
  56. {
  57. return int.Parse(obj.ToString());
  58. }
  59. }
  60. public static bool Exists(string strSql)
  61. {
  62. object obj = GetSingle(strSql);
  63. int cmdresult;
  64. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  65. {
  66. cmdresult = 0;
  67. }
  68. else
  69. {
  70. cmdresult = int.Parse(obj.ToString());
  71. }
  72. if (cmdresult == 0)
  73. {
  74. return false;
  75. }
  76. else
  77. {
  78. return true;
  79. }
  80. }
  81. /// <summary>
  82. /// 表是否存在
  83. /// </summary>
  84. /// <param name="TableName"></param>
  85. /// <returns></returns>
  86. public static bool TabExists(string TableName)
  87. {
  88. string strsql = "select count(*) from sysobjects where id = object_id(N'[" + TableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1";
  89. //string strsql = "SELECT count(*) FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + TableName + "]') AND type in (N'U')";
  90. object obj = GetSingle(strsql);
  91. int cmdresult;
  92. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  93. {
  94. cmdresult = 0;
  95. }
  96. else
  97. {
  98. cmdresult = int.Parse(obj.ToString());
  99. }
  100. if (cmdresult == 0)
  101. {
  102. return false;
  103. }
  104. else
  105. {
  106. return true;
  107. }
  108. }
  109. public static bool Exists(string strSql, params SqlParameter[] cmdParms)
  110. {
  111. object obj = GetSingle(strSql, cmdParms);
  112. int cmdresult;
  113. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  114. {
  115. cmdresult = 0;
  116. }
  117. else
  118. {
  119. cmdresult = int.Parse(obj.ToString());
  120. }
  121. if (cmdresult == 0)
  122. {
  123. return false;
  124. }
  125. else
  126. {
  127. return true;
  128. }
  129. }
  130. #endregion
  131. #region 执行简单SQL语句
  132. /// <summary>
  133. /// 执行SQL语句,返回影响的记录数
  134. /// </summary>
  135. /// <param name="SQLString">SQL语句</param>
  136. /// <returns>影响的记录数</returns>
  137. public static int ExecuteSql(string SQLString)
  138. {
  139. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  140. {
  141. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  142. {
  143. try
  144. {
  145. connection.Open();
  146. int rows = cmd.ExecuteNonQuery();
  147. return rows;
  148. }
  149. catch (System.Data.SqlClient.SqlException e)
  150. {
  151. connection.Close();
  152. throw e;
  153. }
  154. }
  155. }
  156. }
  157. public static int ExecuteSqlByTime(string SQLString, int Times)
  158. {
  159. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  160. {
  161. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  162. {
  163. try
  164. {
  165. connection.Open();
  166. cmd.CommandTimeout = Times;
  167. int rows = cmd.ExecuteNonQuery();
  168. return rows;
  169. }
  170. catch (System.Data.SqlClient.SqlException e)
  171. {
  172. connection.Close();
  173. throw e;
  174. }
  175. }
  176. }
  177. }
  178. /// <summary>
  179. /// 执行Sql和Oracle滴混合事务
  180. /// </summary>
  181. /// <param name="list">SQL命令行列表</param>
  182. /// <param name="oracleCmdSqlList">Oracle命令行列表</param>
  183. /// <returns>执行结果 0-由于SQL造成事务失败 -1 由于Oracle造成事务失败 1-整体事务执行成功</returns>
  184. public static int ExecuteSqlTran(List<CommandInfo> list, List<CommandInfo> oracleCmdSqlList)
  185. {
  186. using (SqlConnection conn = new SqlConnection(GetConnectionString.iGetConn))
  187. {
  188. conn.Open();
  189. SqlCommand cmd = new SqlCommand();
  190. cmd.Connection = conn;
  191. SqlTransaction tx = conn.BeginTransaction();
  192. cmd.Transaction = tx;
  193. try
  194. {
  195. foreach (CommandInfo myDE in list)
  196. {
  197. string cmdText = myDE.CommandText;
  198. SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
  199. PrepareCommand(cmd, conn, tx, cmdText, cmdParms);
  200. if (myDE.EffentNextType == EffentNextType.SolicitationEvent)
  201. {
  202. if (myDE.CommandText.ToLower().IndexOf("count(") == -1)
  203. {
  204. tx.Rollback();
  205. throw new Exception("违背要求" + myDE.CommandText + "必须符合select count(..的格式");
  206. //return 0;
  207. }
  208. object obj = cmd.ExecuteScalar();
  209. bool isHave = false;
  210. if (obj == null && obj == DBNull.Value)
  211. {
  212. isHave = false;
  213. }
  214. isHave = Convert.ToInt32(obj) > 0;
  215. if (isHave)
  216. {
  217. //引发事件
  218. myDE.OnSolicitationEvent();
  219. }
  220. }
  221. if (myDE.EffentNextType == EffentNextType.WhenHaveContine || myDE.EffentNextType == EffentNextType.WhenNoHaveContine)
  222. {
  223. if (myDE.CommandText.ToLower().IndexOf("count(") == -1)
  224. {
  225. tx.Rollback();
  226. throw new Exception("SQL:违背要求" + myDE.CommandText + "必须符合select count(..的格式");
  227. //return 0;
  228. }
  229. object obj = cmd.ExecuteScalar();
  230. bool isHave = false;
  231. if (obj == null && obj == DBNull.Value)
  232. {
  233. isHave = false;
  234. }
  235. isHave = Convert.ToInt32(obj) > 0;
  236. if (myDE.EffentNextType == EffentNextType.WhenHaveContine && !isHave)
  237. {
  238. tx.Rollback();
  239. throw new Exception("SQL:违背要求" + myDE.CommandText + "返回值必须大于0");
  240. //return 0;
  241. }
  242. if (myDE.EffentNextType == EffentNextType.WhenNoHaveContine && isHave)
  243. {
  244. tx.Rollback();
  245. throw new Exception("SQL:违背要求" + myDE.CommandText + "返回值必须等于0");
  246. //return 0;
  247. }
  248. continue;
  249. }
  250. int val = cmd.ExecuteNonQuery();
  251. if (myDE.EffentNextType == EffentNextType.ExcuteEffectRows && val == 0)
  252. {
  253. tx.Rollback();
  254. throw new Exception("SQL:违背要求" + myDE.CommandText + "必须有影响行");
  255. //return 0;
  256. }
  257. cmd.Parameters.Clear();
  258. }
  259. tx.Commit();
  260. return 1;
  261. }
  262. catch (System.Data.SqlClient.SqlException e)
  263. {
  264. tx.Rollback();
  265. throw e;
  266. }
  267. catch (Exception e)
  268. {
  269. tx.Rollback();
  270. throw e;
  271. }
  272. }
  273. }
  274. /// <summary>
  275. /// 执行多条SQL语句,实现数据库事务。
  276. /// </summary>
  277. /// <param name="SQLStringList">多条SQL语句</param>
  278. public static int ExecuteSqlTran(List<String> SQLStringList)
  279. {
  280. using (SqlConnection conn = new SqlConnection(GetConnectionString.iGetConn))
  281. {
  282. conn.Open();
  283. SqlCommand cmd = new SqlCommand();
  284. cmd.Connection = conn;
  285. SqlTransaction tx = conn.BeginTransaction();
  286. cmd.Transaction = tx;
  287. try
  288. {
  289. int count = 0;
  290. for (int n = 0; n < SQLStringList.Count; n++)
  291. {
  292. string strsql = SQLStringList[n];
  293. if (strsql.Trim().Length > 1)
  294. {
  295. cmd.CommandText = strsql;
  296. count += cmd.ExecuteNonQuery();
  297. }
  298. }
  299. tx.Commit();
  300. return count;
  301. }
  302. catch
  303. {
  304. tx.Rollback();
  305. return 0;
  306. }
  307. }
  308. }
  309. /// <summary>
  310. /// 执行带一个存储过程参数的的SQL语句。
  311. /// </summary>
  312. /// <param name="SQLString">SQL语句</param>
  313. /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
  314. /// <returns>影响的记录数</returns>
  315. public static int ExecuteSql(string SQLString, string content)
  316. {
  317. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  318. {
  319. SqlCommand cmd = new SqlCommand(SQLString, connection);
  320. System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
  321. myParameter.Value = content;
  322. cmd.Parameters.Add(myParameter);
  323. try
  324. {
  325. connection.Open();
  326. int rows = cmd.ExecuteNonQuery();
  327. return rows;
  328. }
  329. catch (System.Data.SqlClient.SqlException e)
  330. {
  331. throw e;
  332. }
  333. finally
  334. {
  335. cmd.Dispose();
  336. connection.Close();
  337. }
  338. }
  339. }
  340. /// <summary>
  341. /// 执行带一个存储过程参数的的SQL语句。
  342. /// </summary>
  343. /// <param name="SQLString">SQL语句</param>
  344. /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
  345. /// <returns>影响的记录数</returns>
  346. public static object ExecuteSqlGet(string SQLString, string content)
  347. {
  348. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  349. {
  350. SqlCommand cmd = new SqlCommand(SQLString, connection);
  351. System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
  352. myParameter.Value = content;
  353. cmd.Parameters.Add(myParameter);
  354. try
  355. {
  356. connection.Open();
  357. object obj = cmd.ExecuteScalar();
  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 (System.Data.SqlClient.SqlException e)
  368. {
  369. throw e;
  370. }
  371. finally
  372. {
  373. cmd.Dispose();
  374. connection.Close();
  375. }
  376. }
  377. }
  378. /// <summary>
  379. /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
  380. /// </summary>
  381. /// <param name="strSQL">SQL语句</param>
  382. /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
  383. /// <returns>影响的记录数</returns>
  384. public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
  385. {
  386. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  387. {
  388. SqlCommand cmd = new SqlCommand(strSQL, connection);
  389. System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@fs", SqlDbType.Image);
  390. myParameter.Value = fs;
  391. cmd.Parameters.Add(myParameter);
  392. try
  393. {
  394. connection.Open();
  395. int rows = cmd.ExecuteNonQuery();
  396. return rows;
  397. }
  398. catch (System.Data.SqlClient.SqlException e)
  399. {
  400. throw e;
  401. }
  402. finally
  403. {
  404. cmd.Dispose();
  405. connection.Close();
  406. }
  407. }
  408. }
  409. /// <summary>
  410. /// 执行一条计算查询结果语句,返回查询结果(object)。
  411. /// </summary>
  412. /// <param name="SQLString">计算查询结果语句</param>
  413. /// <returns>查询结果(object)</returns>
  414. public static object GetSingle(string SQLString)
  415. {
  416. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  417. {
  418. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  419. {
  420. try
  421. {
  422. connection.Open();
  423. object obj = cmd.ExecuteScalar();
  424. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  425. {
  426. return null;
  427. }
  428. else
  429. {
  430. return obj;
  431. }
  432. }
  433. catch (System.Data.SqlClient.SqlException e)
  434. {
  435. connection.Close();
  436. throw e;
  437. }
  438. }
  439. }
  440. }
  441. public static object GetSingle(string SQLString, int Times)
  442. {
  443. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  444. {
  445. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  446. {
  447. try
  448. {
  449. connection.Open();
  450. cmd.CommandTimeout = Times;
  451. object obj = cmd.ExecuteScalar();
  452. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  453. {
  454. return null;
  455. }
  456. else
  457. {
  458. return obj;
  459. }
  460. }
  461. catch (System.Data.SqlClient.SqlException e)
  462. {
  463. connection.Close();
  464. throw e;
  465. }
  466. }
  467. }
  468. }
  469. /// <summary>
  470. /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  471. /// </summary>
  472. /// <param name="strSQL">查询语句</param>
  473. /// <returns>SqlDataReader</returns>
  474. public static SqlDataReader ExecuteReader(string strSQL)
  475. {
  476. SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn);
  477. SqlCommand cmd = new SqlCommand(strSQL, connection);
  478. try
  479. {
  480. connection.Open();
  481. SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  482. return myReader;
  483. }
  484. catch (System.Data.SqlClient.SqlException e)
  485. {
  486. throw e;
  487. }
  488. }
  489. /// <summary>
  490. /// 执行查询语句,返回DataSet
  491. /// </summary>
  492. /// <param name="SQLString">查询语句</param>
  493. /// <returns>DataSet</returns>
  494. public static DataSet Query(string SQLString)
  495. {
  496. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  497. {
  498. DataSet ds = new DataSet();
  499. try
  500. {
  501. connection.Open();
  502. SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
  503. command.Fill(ds, "ds");
  504. }
  505. catch (System.Data.SqlClient.SqlException ex)
  506. {
  507. throw new Exception(ex.Message);
  508. }
  509. return ds;
  510. }
  511. }
  512. public static DataSet Query(string SQLString, int Times)
  513. {
  514. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  515. {
  516. DataSet ds = new DataSet();
  517. try
  518. {
  519. connection.Open();
  520. SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
  521. command.SelectCommand.CommandTimeout = Times;
  522. command.Fill(ds, "ds");
  523. }
  524. catch (System.Data.SqlClient.SqlException ex)
  525. {
  526. throw new Exception(ex.Message);
  527. }
  528. return ds;
  529. }
  530. }
  531. #endregion
  532. #region 执行带参数的SQL语句
  533. /// <summary>
  534. /// 执行SQL语句,返回影响的记录数
  535. /// </summary>
  536. /// <param name="SQLString">SQL语句</param>
  537. /// <returns>影响的记录数</returns>
  538. public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
  539. {
  540. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  541. {
  542. using (SqlCommand cmd = new SqlCommand())
  543. {
  544. try
  545. {
  546. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  547. int rows = cmd.ExecuteNonQuery();
  548. cmd.Parameters.Clear();
  549. return rows;
  550. }
  551. catch (System.Data.SqlClient.SqlException e)
  552. {
  553. throw e;
  554. }
  555. }
  556. }
  557. }
  558. /// <summary>
  559. /// 执行多条SQL语句,实现数据库事务。
  560. /// </summary>
  561. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
  562. public static void ExecuteSqlTran(Hashtable SQLStringList)
  563. {
  564. using (SqlConnection conn = new SqlConnection(GetConnectionString.iGetConn))
  565. {
  566. conn.Open();
  567. using (SqlTransaction trans = conn.BeginTransaction())
  568. {
  569. SqlCommand cmd = new SqlCommand();
  570. try
  571. {
  572. //循环
  573. foreach (DictionaryEntry myDE in SQLStringList)
  574. {
  575. string cmdText = myDE.Key.ToString();
  576. SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
  577. PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
  578. int val = cmd.ExecuteNonQuery();
  579. cmd.Parameters.Clear();
  580. }
  581. trans.Commit();
  582. }
  583. catch
  584. {
  585. trans.Rollback();
  586. throw;
  587. }
  588. }
  589. }
  590. }
  591. /// <summary>
  592. /// 执行多条SQL语句,实现数据库事务。
  593. /// </summary>
  594. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
  595. public static int ExecuteSqlTran(System.Collections.Generic.List<CommandInfo> cmdList)
  596. {
  597. using (SqlConnection conn = new SqlConnection(GetConnectionString.iGetConn))
  598. {
  599. conn.Open();
  600. using (SqlTransaction trans = conn.BeginTransaction())
  601. {
  602. SqlCommand cmd = new SqlCommand();
  603. try
  604. {
  605. int count = 0;
  606. //循环
  607. foreach (CommandInfo myDE in cmdList)
  608. {
  609. string cmdText = myDE.CommandText;
  610. SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
  611. PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
  612. if (myDE.EffentNextType == EffentNextType.WhenHaveContine || myDE.EffentNextType == EffentNextType.WhenNoHaveContine)
  613. {
  614. if (myDE.CommandText.ToLower().IndexOf("count(") == -1)
  615. {
  616. trans.Rollback();
  617. return 0;
  618. }
  619. object obj = cmd.ExecuteScalar();
  620. bool isHave = false;
  621. if (obj == null && obj == DBNull.Value)
  622. {
  623. isHave = false;
  624. }
  625. isHave = Convert.ToInt32(obj) > 0;
  626. if (myDE.EffentNextType == EffentNextType.WhenHaveContine && !isHave)
  627. {
  628. trans.Rollback();
  629. return 0;
  630. }
  631. if (myDE.EffentNextType == EffentNextType.WhenNoHaveContine && isHave)
  632. {
  633. trans.Rollback();
  634. return 0;
  635. }
  636. continue;
  637. }
  638. int val = cmd.ExecuteNonQuery();
  639. count += val;
  640. if (myDE.EffentNextType == EffentNextType.ExcuteEffectRows && val == 0)
  641. {
  642. trans.Rollback();
  643. return 0;
  644. }
  645. cmd.Parameters.Clear();
  646. }
  647. trans.Commit();
  648. return count;
  649. }
  650. catch
  651. {
  652. trans.Rollback();
  653. throw;
  654. }
  655. }
  656. }
  657. }
  658. /// <summary>
  659. /// 执行多条SQL语句,实现数据库事务。
  660. /// </summary>
  661. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
  662. public static void ExecuteSqlTranWithIndentity(System.Collections.Generic.List<CommandInfo> SQLStringList)
  663. {
  664. using (SqlConnection conn = new SqlConnection(GetConnectionString.iGetConn))
  665. {
  666. conn.Open();
  667. using (SqlTransaction trans = conn.BeginTransaction())
  668. {
  669. SqlCommand cmd = new SqlCommand();
  670. try
  671. {
  672. int indentity = 0;
  673. //循环
  674. foreach (CommandInfo myDE in SQLStringList)
  675. {
  676. string cmdText = myDE.CommandText;
  677. SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
  678. foreach (SqlParameter q in cmdParms)
  679. {
  680. if (q.Direction == ParameterDirection.InputOutput)
  681. {
  682. q.Value = indentity;
  683. }
  684. }
  685. PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
  686. int val = cmd.ExecuteNonQuery();
  687. foreach (SqlParameter q in cmdParms)
  688. {
  689. if (q.Direction == ParameterDirection.Output)
  690. {
  691. indentity = Convert.ToInt32(q.Value);
  692. }
  693. }
  694. cmd.Parameters.Clear();
  695. }
  696. trans.Commit();
  697. }
  698. catch
  699. {
  700. trans.Rollback();
  701. throw;
  702. }
  703. }
  704. }
  705. }
  706. /// <summary>
  707. /// 执行多条SQL语句,实现数据库事务。
  708. /// </summary>
  709. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
  710. public static void ExecuteSqlTranWithIndentity(Hashtable SQLStringList)
  711. {
  712. using (SqlConnection conn = new SqlConnection(GetConnectionString.iGetConn))
  713. {
  714. conn.Open();
  715. using (SqlTransaction trans = conn.BeginTransaction())
  716. {
  717. SqlCommand cmd = new SqlCommand();
  718. try
  719. {
  720. int indentity = 0;
  721. //循环
  722. foreach (DictionaryEntry myDE in SQLStringList)
  723. {
  724. string cmdText = myDE.Key.ToString();
  725. SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
  726. foreach (SqlParameter q in cmdParms)
  727. {
  728. if (q.Direction == ParameterDirection.InputOutput)
  729. {
  730. q.Value = indentity;
  731. }
  732. }
  733. PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
  734. int val = cmd.ExecuteNonQuery();
  735. foreach (SqlParameter q in cmdParms)
  736. {
  737. if (q.Direction == ParameterDirection.Output)
  738. {
  739. indentity = Convert.ToInt32(q.Value);
  740. }
  741. }
  742. cmd.Parameters.Clear();
  743. }
  744. trans.Commit();
  745. }
  746. catch
  747. {
  748. trans.Rollback();
  749. throw;
  750. }
  751. }
  752. }
  753. }
  754. /// <summary>
  755. /// 执行一条计算查询结果语句,返回查询结果(object)。
  756. /// </summary>
  757. /// <param name="SQLString">计算查询结果语句</param>
  758. /// <returns>查询结果(object)</returns>
  759. public static object GetSingle(string SQLString, params SqlParameter[] cmdParms)
  760. {
  761. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  762. {
  763. using (SqlCommand cmd = new SqlCommand())
  764. {
  765. try
  766. {
  767. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  768. object obj = cmd.ExecuteScalar();
  769. cmd.Parameters.Clear();
  770. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  771. {
  772. return null;
  773. }
  774. else
  775. {
  776. return obj;
  777. }
  778. }
  779. catch (System.Data.SqlClient.SqlException e)
  780. {
  781. throw e;
  782. }
  783. }
  784. }
  785. }
  786. /// <summary>
  787. /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  788. /// </summary>
  789. /// <param name="strSQL">查询语句</param>
  790. /// <returns>SqlDataReader</returns>
  791. public static SqlDataReader ExecuteReader(string SQLString, params SqlParameter[] cmdParms)
  792. {
  793. SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn);
  794. SqlCommand cmd = new SqlCommand();
  795. try
  796. {
  797. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  798. SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  799. cmd.Parameters.Clear();
  800. return myReader;
  801. }
  802. catch (System.Data.SqlClient.SqlException e)
  803. {
  804. throw e;
  805. }
  806. // finally
  807. // {
  808. // cmd.Dispose();
  809. // connection.Close();
  810. // }
  811. }
  812. /// <summary>
  813. /// 执行查询语句,返回DataSet
  814. /// </summary>
  815. /// <param name="SQLString">查询语句</param>
  816. /// <returns>DataSet</returns>
  817. public static DataSet Query(string SQLString, params SqlParameter[] cmdParms)
  818. {
  819. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  820. {
  821. SqlCommand cmd = new SqlCommand();
  822. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  823. using (SqlDataAdapter da = new SqlDataAdapter(cmd))
  824. {
  825. DataSet ds = new DataSet();
  826. try
  827. {
  828. da.Fill(ds, "ds");
  829. cmd.Parameters.Clear();
  830. }
  831. catch (System.Data.SqlClient.SqlException ex)
  832. {
  833. throw new Exception(ex.Message);
  834. }
  835. return ds;
  836. }
  837. }
  838. }
  839. private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
  840. {
  841. if (conn.State != ConnectionState.Open)
  842. conn.Open();
  843. cmd.Connection = conn;
  844. cmd.CommandText = cmdText;
  845. if (trans != null)
  846. cmd.Transaction = trans;
  847. cmd.CommandType = CommandType.Text;//cmdType;
  848. if (cmdParms != null)
  849. {
  850. foreach (SqlParameter parameter in cmdParms)
  851. {
  852. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  853. (parameter.Value == null))
  854. {
  855. parameter.Value = DBNull.Value;
  856. }
  857. cmd.Parameters.Add(parameter);
  858. }
  859. }
  860. }
  861. #endregion
  862. #region 存储过程操作
  863. /// <summary>
  864. /// 执行存储过程,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  865. /// </summary>
  866. /// <param name="storedProcName">存储过程名</param>
  867. /// <param name="parameters">存储过程参数</param>
  868. /// <returns>SqlDataReader</returns>
  869. public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters)
  870. {
  871. SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn);
  872. SqlDataReader returnReader;
  873. connection.Open();
  874. SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
  875. command.CommandType = CommandType.StoredProcedure;
  876. returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
  877. return returnReader;
  878. }
  879. /// <summary>
  880. /// 执行存储过程
  881. /// </summary>
  882. /// <param name="storedProcName">存储过程名</param>
  883. /// <param name="parameters">存储过程参数</param>
  884. /// <param name="tableName">DataSet结果中的表名</param>
  885. /// <returns>DataSet</returns>
  886. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
  887. {
  888. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  889. {
  890. DataSet dataSet = new DataSet();
  891. connection.Open();
  892. SqlDataAdapter sqlDA = new SqlDataAdapter();
  893. sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
  894. sqlDA.Fill(dataSet, tableName);
  895. connection.Close();
  896. return dataSet;
  897. }
  898. }
  899. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName, int Times)
  900. {
  901. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  902. {
  903. DataSet dataSet = new DataSet();
  904. connection.Open();
  905. SqlDataAdapter sqlDA = new SqlDataAdapter();
  906. sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
  907. sqlDA.SelectCommand.CommandTimeout = Times;
  908. sqlDA.Fill(dataSet, tableName);
  909. connection.Close();
  910. return dataSet;
  911. }
  912. }
  913. /// <summary>
  914. /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
  915. /// </summary>
  916. /// <param name="connection">数据库连接</param>
  917. /// <param name="storedProcName">存储过程名</param>
  918. /// <param name="parameters">存储过程参数</param>
  919. /// <returns>SqlCommand</returns>
  920. private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
  921. {
  922. SqlCommand command = new SqlCommand(storedProcName, connection);
  923. command.CommandType = CommandType.StoredProcedure;
  924. foreach (SqlParameter parameter in parameters)
  925. {
  926. if (parameter != null)
  927. {
  928. // 检查未分配值的输出参数,将其分配以DBNull.Value.
  929. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  930. (parameter.Value == null))
  931. {
  932. parameter.Value = DBNull.Value;
  933. }
  934. command.Parameters.Add(parameter);
  935. }
  936. }
  937. return command;
  938. }
  939. /// <summary>
  940. /// 执行存储过程,返回影响的行数
  941. /// </summary>
  942. /// <param name="storedProcName">存储过程名</param>
  943. /// <param name="parameters">存储过程参数</param>
  944. /// <param name="rowsAffected">影响的行数</param>
  945. /// <returns></returns>
  946. public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
  947. {
  948. using (SqlConnection connection = new SqlConnection(GetConnectionString.iGetConn))
  949. {
  950. int result;
  951. connection.Open();
  952. SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
  953. rowsAffected = command.ExecuteNonQuery();
  954. result = (int)command.Parameters["ReturnValue"].Value;
  955. //Connection.Close();
  956. return result;
  957. }
  958. }
  959. /// <summary>
  960. /// 创建 SqlCommand 对象实例(用来返回一个整数值)
  961. /// </summary>
  962. /// <param name="storedProcName">存储过程名</param>
  963. /// <param name="parameters">存储过程参数</param>
  964. /// <returns>SqlCommand 对象实例</returns>
  965. private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
  966. {
  967. SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
  968. command.Parameters.Add(new SqlParameter("ReturnValue",
  969. SqlDbType.Int, 4, ParameterDirection.ReturnValue,
  970. false, 0, 0, string.Empty, DataRowVersion.Default, null));
  971. return command;
  972. }
  973. #endregion
  974. }
  975. }