LeadDbHelperSQLServer.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. using NX_LogClassLibrary;
  2. using NX_ModelClassLibrary.CustomEnum;
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Data.SqlClient;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace NX_DbClassLibrary
  12. {
  13. /// <summary>
  14. /// Copyright20181102 (C) sunyalong
  15. /// 数据访问抽象基础类(基于SQLServer)
  16. /// 允许修改、添加满足自己项目的需要。
  17. /// 添加、修改后请详细注释。违者会强制删除不予采用。
  18. /// </summary>
  19. public abstract class LeadDbHelperSQLServer
  20. {
  21. public static string connectionString = LeadConfigureConnectionString.GetConnectionString("LeadSqlServer");
  22. #region 公用方法
  23. /// <summary>
  24. /// 判断是否存在某表的某个字段
  25. /// </summary>
  26. /// <param name="tableName">表名称</param>
  27. /// <param name="columnName">列名称</param>
  28. /// <returns>是否存在</returns>
  29. public static bool ColumnExists(string tableName, string columnName)
  30. {
  31. string sql = "select count(1) from syscolumns where [id]=object_id('" + tableName + "') and [name]='" + columnName + "'";
  32. object res = GetSingle(sql);
  33. if (res == null)
  34. {
  35. return false;
  36. }
  37. return Convert.ToInt32(res) > 0;
  38. }
  39. /// <summary>
  40. /// 表是否存在
  41. /// </summary>
  42. /// <param name="TableName">数据表名称</param>
  43. /// <returns></returns>
  44. public static bool TabExists(string TableName)
  45. {
  46. string strsql = "select count(*) from sysobjects where id = object_id(N'[" + TableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1";
  47. object obj = GetSingle(strsql);
  48. int cmdresult;
  49. if ((Equals(obj, null)) || (Equals(obj, DBNull.Value)))
  50. {
  51. cmdresult = 0;
  52. }
  53. else
  54. {
  55. cmdresult = int.Parse(obj.ToString());
  56. }
  57. if (cmdresult == 0)
  58. {
  59. return false;
  60. }
  61. else
  62. {
  63. return true;
  64. }
  65. }
  66. #endregion
  67. #region 执行简单SQL语句
  68. /// <summary>
  69. /// 执行SQL语句,返回影响的记录数
  70. /// </summary>
  71. /// <param name="SQLString">SQL语句</param>
  72. /// <returns>影响的记录数</returns>
  73. public static int ExecuteSql(string SQLString)
  74. {
  75. using (SqlConnection connection = new SqlConnection(connectionString))
  76. {
  77. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  78. {
  79. try
  80. {
  81. connection.Open();
  82. int rows = cmd.ExecuteNonQuery();
  83. return rows;
  84. }
  85. catch (SqlException e)
  86. {
  87. connection.Close();
  88. LogHelper.WriteLog($"执行SQL语句发生异常:【{e.Message}】!SQL:【{SQLString}】",LogTypeEnum.DbErr);
  89. return 0;
  90. }
  91. }
  92. }
  93. }
  94. /// <summary>
  95. /// 执行SQL语句,返回影响的记录数。(可配置超时时间)
  96. /// </summary>
  97. /// <param name="SQLString">SQL语句</param>
  98. /// <param name="Times">超时时间设置(单位:秒)默认值30</param>
  99. /// <returns></returns>
  100. public static int ExecuteSqlByTime(string SQLString, int Times)
  101. {
  102. using (SqlConnection connection = new SqlConnection(connectionString))
  103. {
  104. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  105. {
  106. try
  107. {
  108. connection.Open();
  109. cmd.CommandTimeout = Times;
  110. int rows = cmd.ExecuteNonQuery();
  111. return rows;
  112. }
  113. catch (SqlException e)
  114. {
  115. connection.Close();
  116. LogHelper.WriteLog($"执行SQL语句发生异常:【{e.Message}】!SQL:【{SQLString}】超时时间:【{Times}】", LogTypeEnum.DbErr);
  117. return 0;
  118. }
  119. }
  120. }
  121. }
  122. /// <summary>
  123. /// 执行多条SQL语句,实现数据库事务。
  124. /// </summary>
  125. /// <param name="SQLStringList">多条SQL语句List集合</param>
  126. public static int ExecuteSqlTran(List<string> SQLStringList)
  127. {
  128. using (SqlConnection conn = new SqlConnection(connectionString))
  129. {
  130. conn.Open();
  131. using (SqlCommand cmd = new SqlCommand())
  132. {
  133. cmd.Connection = conn;
  134. SqlTransaction tx = conn.BeginTransaction();
  135. cmd.Transaction = tx;
  136. try
  137. {
  138. int count = 0;
  139. for (int n = 0; n < SQLStringList.Count; n++)
  140. {
  141. string strsql = SQLStringList[n];
  142. if (strsql.Trim().Length > 1)
  143. {
  144. cmd.CommandText = strsql;
  145. count += cmd.ExecuteNonQuery();
  146. }
  147. }
  148. tx.Commit();
  149. return count;
  150. }
  151. catch (Exception ex)
  152. {
  153. tx.Rollback();
  154. string errSql = string.Empty;
  155. for (int n = 0; n < SQLStringList.Count; n++)
  156. {
  157. errSql += $"【{SQLStringList[n]}】";
  158. }
  159. LogHelper.WriteLog($"执行SQL语句发生异常:【{ex.Message}】!SQL语句:{errSql}", LogTypeEnum.DbErr);
  160. return 0;
  161. }
  162. }
  163. }
  164. }
  165. /// <summary>
  166. /// 执行带一个特殊参数的的SQL语句。
  167. /// </summary>
  168. /// <param name="SQLString">SQL语句</param>
  169. /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加参数</param>
  170. /// <returns>影响的记录数</returns>
  171. public static int ExecuteSql(string SQLString, string content)
  172. {
  173. using (SqlConnection connection = new SqlConnection(connectionString))
  174. {
  175. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  176. {
  177. SqlParameter myParameter = new SqlParameter("@content", SqlDbType.NText)
  178. {
  179. Value = content
  180. };
  181. cmd.Parameters.Add(myParameter);
  182. try
  183. {
  184. connection.Open();
  185. int rows = cmd.ExecuteNonQuery();
  186. return rows;
  187. }
  188. catch (SqlException e)
  189. {
  190. LogHelper.WriteLog($"执行SQL语句发生异常:【{e.Message}】!SQL:【{SQLString}】特殊参数:【{content}】", LogTypeEnum.DbErr);
  191. return 0;
  192. }
  193. finally
  194. {
  195. cmd.Dispose();
  196. connection.Close();
  197. }
  198. }
  199. }
  200. }
  201. /// <summary>
  202. /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
  203. /// </summary>
  204. /// <param name="strSQL">SQL语句</param>
  205. /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
  206. /// <returns>影响的记录数</returns>
  207. public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
  208. {
  209. using (SqlConnection connection = new SqlConnection(connectionString))
  210. {
  211. using (SqlCommand cmd = new SqlCommand(strSQL, connection))
  212. {
  213. SqlParameter myParameter = new SqlParameter("@fs", SqlDbType.Image)
  214. {
  215. Value = fs
  216. };
  217. cmd.Parameters.Add(myParameter);
  218. try
  219. {
  220. connection.Open();
  221. int rows = cmd.ExecuteNonQuery();
  222. return rows;
  223. }
  224. catch (SqlException e)
  225. {
  226. string bytStr = string.Empty;
  227. foreach (byte item in fs)
  228. {
  229. bytStr += $"【{item}】";
  230. }
  231. LogHelper.WriteLog($"向数据库里插入图像格式的字段发生异常:【{e.Message}】!SQL:【{strSQL}】图像字节:【{bytStr}】", LogTypeEnum.DbErr);
  232. return 0;
  233. }
  234. finally
  235. {
  236. cmd.Dispose();
  237. connection.Close();
  238. }
  239. }
  240. }
  241. }
  242. /// <summary>
  243. /// 执行一条计算查询结果语句,返回查询结果(object)。
  244. /// </summary>
  245. /// <param name="SQLString">计算查询结果sql语句</param>
  246. /// <returns>查询结果(object)</returns>
  247. public static object GetSingle(string SQLString)
  248. {
  249. using (SqlConnection connection = new SqlConnection(connectionString))
  250. {
  251. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  252. {
  253. try
  254. {
  255. connection.Open();
  256. object obj = cmd.ExecuteScalar();
  257. if ((Equals(obj, null)) || (Equals(obj, DBNull.Value)))
  258. {
  259. return null;
  260. }
  261. else
  262. {
  263. return obj;
  264. }
  265. }
  266. catch (SqlException e)
  267. {
  268. connection.Close();
  269. LogHelper.WriteLog($"执行一条计算查询结果的语句发生异常:【{e.Message}】!SQL:【{SQLString}】", LogTypeEnum.DbErr);
  270. return null;
  271. }
  272. }
  273. }
  274. }
  275. /// <summary>
  276. /// 执行一条计算查询结果语句,返回查询结果(object)。
  277. /// </summary>
  278. /// <param name="SQLString">计算查询结果sql语句</param>
  279. /// <param name="Times">超时时间设置(单位:秒)默认值30</param>
  280. /// <returns></returns>
  281. public static object GetSingle(string SQLString, int Times)
  282. {
  283. using (SqlConnection connection = new SqlConnection(connectionString))
  284. {
  285. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  286. {
  287. try
  288. {
  289. connection.Open();
  290. cmd.CommandTimeout = Times;
  291. object obj = cmd.ExecuteScalar();
  292. if ((Equals(obj, null)) || (Equals(obj, DBNull.Value)))
  293. {
  294. return null;
  295. }
  296. else
  297. {
  298. return obj;
  299. }
  300. }
  301. catch (SqlException e)
  302. {
  303. connection.Close();
  304. LogHelper.WriteLog($"执行一条计算查询结果的语句发生异常:【{e.Message}】!SQL:【{SQLString}】超时时间:【{Times}】", LogTypeEnum.DbErr);
  305. return null;
  306. }
  307. }
  308. }
  309. }
  310. /// <summary>
  311. /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  312. /// </summary>
  313. /// <param name="strSQL">查询语句</param>
  314. /// <returns>SqlDataReader</returns>
  315. public static SqlDataReader ExecuteReader(string strSQL)
  316. {
  317. using (SqlConnection connection = new SqlConnection(connectionString))
  318. {
  319. using (SqlCommand cmd = new SqlCommand(strSQL, connection))
  320. {
  321. try
  322. {
  323. connection.Open();
  324. SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  325. return myReader;
  326. }
  327. catch (SqlException e)
  328. {
  329. LogHelper.WriteLog($"执行查询语句,返回SqlDataReader发生异常:【{e.Message}】!SQL:【{strSQL}】", LogTypeEnum.DbErr);
  330. return null;
  331. }
  332. }
  333. }
  334. }
  335. /// <summary>
  336. /// 执行查询语句,返回DataSet
  337. /// </summary>
  338. /// <param name="SQLString">查询sql语句</param>
  339. /// <returns>DataSet</returns>
  340. public static DataSet Query(string SQLString)
  341. {
  342. using (SqlConnection connection = new SqlConnection(connectionString))
  343. {
  344. DataSet ds = new DataSet();
  345. try
  346. {
  347. connection.Open();
  348. SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
  349. command.Fill(ds, "ds");
  350. }
  351. catch (SqlException ex)
  352. {
  353. LogHelper.WriteLog($"执行查询语句,返回DataSet发生异常:【{ex.Message}】!SQL:【{SQLString}】", LogTypeEnum.DbErr);
  354. }
  355. return ds;
  356. }
  357. }
  358. /// <summary>
  359. /// 执行查询语句,返回DataSet
  360. /// </summary>
  361. /// <param name="SQLString">查询sql语句</param>
  362. /// <param name="Times">超时时间设置(单位:秒)默认值30</param>
  363. /// <returns></returns>
  364. public static DataSet Query(string SQLString, int Times)
  365. {
  366. using (SqlConnection connection = new SqlConnection(connectionString))
  367. {
  368. DataSet ds = new DataSet();
  369. try
  370. {
  371. connection.Open();
  372. SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
  373. command.SelectCommand.CommandTimeout = Times;
  374. command.Fill(ds, "ds");
  375. }
  376. catch (SqlException ex)
  377. {
  378. LogHelper.WriteLog($"执行查询语句,返回DataSet发生异常:【{ex.Message}】!SQL:【{SQLString}】超时时间:【{Times}】", LogTypeEnum.DbErr);
  379. }
  380. return ds;
  381. }
  382. }
  383. #endregion
  384. #region 执行带参数的SQL语句
  385. /// <summary>
  386. /// 执行SQL语句,返回影响的记录数
  387. /// </summary>
  388. /// <param name="SQLString">SQL语句</param>
  389. /// <param name="cmdParms">参数集合</param>
  390. /// <returns>影响的记录数</returns>
  391. public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
  392. {
  393. using (SqlConnection connection = new SqlConnection(connectionString))
  394. {
  395. using (SqlCommand cmd = new SqlCommand())
  396. {
  397. string retParmStr = string.Empty;
  398. try
  399. {
  400. retParmStr = PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  401. int rows = cmd.ExecuteNonQuery();
  402. cmd.Parameters.Clear();
  403. return rows;
  404. }
  405. catch (SqlException ex)
  406. {
  407. LogHelper.WriteLog($"执行SQL语句,返回影响的记录数发生异常:【{ex.Message}】!SQL:【{SQLString}】{retParmStr}", LogTypeEnum.DbErr);
  408. return 0;
  409. }
  410. }
  411. }
  412. }
  413. /// <summary>
  414. /// 执行多条SQL语句,实现数据库事务。
  415. /// </summary>
  416. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
  417. /// <returns>影响的记录数</returns>
  418. public static int ExecuteSqlTran(Hashtable SQLStringList)
  419. {
  420. using (SqlConnection conn = new SqlConnection(connectionString))
  421. {
  422. conn.Open();
  423. using (SqlTransaction trans = conn.BeginTransaction())
  424. {
  425. SqlCommand cmd = new SqlCommand();
  426. try
  427. {
  428. int val = 0;
  429. //循环
  430. foreach (DictionaryEntry myDE in SQLStringList)
  431. {
  432. string cmdText = myDE.Key.ToString();
  433. SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
  434. PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
  435. val += cmd.ExecuteNonQuery();
  436. cmd.Parameters.Clear();
  437. }
  438. trans.Commit();
  439. return val;
  440. }
  441. catch(Exception ex)
  442. {
  443. trans.Rollback();
  444. string retStr = string.Empty;
  445. foreach (DictionaryEntry myDE in SQLStringList)
  446. {
  447. string cmdText = myDE.Key.ToString();
  448. SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
  449. if (cmdParms.Length > 0)
  450. {
  451. string paramStr = string.Empty;
  452. foreach (SqlParameter item in cmdParms)
  453. {
  454. paramStr += $"(参数名称:[{item.ParameterName}]参数值:[{item.Value}])";
  455. }
  456. retStr += $"【sql:[{cmdText}] 参数集合:{paramStr}】";
  457. }
  458. else
  459. {
  460. retStr += $"【sql:[{cmdText}]】";
  461. }
  462. }
  463. LogHelper.WriteLog($"执行多条SQL语句,实现数据库事务发生异常:【{ex.Message}】!{retStr}", LogTypeEnum.DbErr);
  464. return 0;
  465. }
  466. }
  467. }
  468. }
  469. /// <summary>
  470. /// 执行一条计算查询结果语句,返回查询结果(object)。
  471. /// </summary>
  472. /// <param name="SQLString">计算查询结果语句</param>
  473. /// <returns>查询结果(object)</returns>
  474. public static object GetSingle(string SQLString, params SqlParameter[] cmdParms)
  475. {
  476. using (SqlConnection connection = new SqlConnection(connectionString))
  477. {
  478. using (SqlCommand cmd = new SqlCommand())
  479. {
  480. string retParmStr = string.Empty;
  481. try
  482. {
  483. retParmStr = PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  484. object obj = cmd.ExecuteScalar();
  485. cmd.Parameters.Clear();
  486. if ((Equals(obj, null)) || (Equals(obj, DBNull.Value)))
  487. {
  488. return null;
  489. }
  490. else
  491. {
  492. return obj;
  493. }
  494. }
  495. catch (SqlException ex)
  496. {
  497. LogHelper.WriteLog($"执行一条计算查询结果语句,返回查询结果(object)发生异常:【{ex.Message}】!SQL:【{SQLString}】{retParmStr}", LogTypeEnum.DbErr);
  498. return 0;
  499. }
  500. }
  501. }
  502. }
  503. /// <summary>
  504. /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  505. /// </summary>
  506. /// <param name="strSQL">查询语句</param>
  507. /// <returns>SqlDataReader</returns>
  508. public static SqlDataReader ExecuteReader(string SQLString, params SqlParameter[] cmdParms)
  509. {
  510. using (SqlConnection connection = new SqlConnection(connectionString))
  511. {
  512. using (SqlCommand cmd = new SqlCommand())
  513. {
  514. string retParmStr = string.Empty;
  515. try
  516. {
  517. retParmStr = PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  518. SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  519. cmd.Parameters.Clear();
  520. return myReader;
  521. }
  522. catch (SqlException ex)
  523. {
  524. LogHelper.WriteLog($"执行查询语句,返回SqlDataReader发生异常:【{ex.Message}】!SQL:【{SQLString}】{retParmStr}", LogTypeEnum.DbErr);
  525. return null;
  526. }
  527. finally
  528. {
  529. cmd.Dispose();
  530. connection.Close();
  531. }
  532. }
  533. }
  534. }
  535. /// <summary>
  536. /// 执行查询语句,返回DataSet
  537. /// </summary>
  538. /// <param name="SQLString">查询语句</param>
  539. /// <param name="cmdParms">参数集合</param>
  540. /// <returns></returns>
  541. public static DataSet Query(string SQLString, params SqlParameter[] cmdParms)
  542. {
  543. using (SqlConnection connection = new SqlConnection(connectionString))
  544. {
  545. using (SqlCommand cmd = new SqlCommand())
  546. {
  547. string paramStr = string.Empty;
  548. paramStr = PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  549. using (SqlDataAdapter da = new SqlDataAdapter(cmd))
  550. {
  551. DataSet ds = new DataSet();
  552. try
  553. {
  554. da.Fill(ds, "ds");
  555. cmd.Parameters.Clear();
  556. }
  557. catch (SqlException ex)
  558. {
  559. LogHelper.WriteLog($"执行查询语句,返回DataSet发生异常:【{ex.Message}】!SQL:【{SQLString}】{paramStr}", LogTypeEnum.DbErr);
  560. }
  561. return ds;
  562. }
  563. }
  564. }
  565. }
  566. private static string PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
  567. {
  568. if (conn.State != ConnectionState.Open)
  569. conn.Open();
  570. cmd.Connection = conn;
  571. cmd.CommandText = cmdText;
  572. if (trans != null)
  573. cmd.Transaction = trans;
  574. cmd.CommandType = CommandType.Text;//cmdType;
  575. if (cmdParms != null)
  576. {
  577. string paramStr = string.Empty;
  578. foreach (SqlParameter parameter in cmdParms)
  579. {
  580. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  581. (parameter.Value == null))
  582. {
  583. parameter.Value = DBNull.Value;
  584. }
  585. cmd.Parameters.Add(parameter);
  586. paramStr += $"【参数名称:[{parameter.ParameterName}]参数值:[{parameter.Value}]】";
  587. }
  588. return paramStr;
  589. }
  590. else
  591. {
  592. return null;
  593. }
  594. }
  595. #endregion
  596. #region 存储过程操作
  597. /// <summary>
  598. /// 执行存储过程,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
  599. /// </summary>
  600. /// <param name="storedProcName">存储过程名</param>
  601. /// <param name="parameters">存储过程参数</param>
  602. /// <returns>SqlDataReader</returns>
  603. public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters)
  604. {
  605. using (SqlConnection connection = new SqlConnection(connectionString))
  606. {
  607. SqlDataReader returnReader;
  608. connection.Open();
  609. using (SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters))
  610. {
  611. try
  612. {
  613. command.CommandType = CommandType.StoredProcedure;
  614. returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
  615. return returnReader;
  616. }
  617. catch (Exception ex)
  618. {
  619. string retParamStr = string.Empty;
  620. foreach (IDataParameter item in parameters)
  621. {
  622. retParamStr += $"【参数名称:[{item.ParameterName}]参数值:[{item.Value}]】";
  623. }
  624. LogHelper.WriteLog($"执行存储过程,返回SqlDataReader发生异常:【{ex.Message}】!存储过程:【{storedProcName}】{retParamStr}", LogTypeEnum.DbErr);
  625. return null;
  626. }
  627. }
  628. }
  629. }
  630. /// <summary>
  631. /// 执行存储过程,返回存储过程结果集DataSet中的某个表。
  632. /// </summary>
  633. /// <param name="storedProcName">存储过程名</param>
  634. /// <param name="parameters">存储过程参数</param>
  635. /// <param name="tableName">DataSet结果中的表名</param>
  636. /// <returns>DataSet</returns>
  637. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
  638. {
  639. using (SqlConnection connection = new SqlConnection(connectionString))
  640. {
  641. DataSet dataSet = new DataSet();
  642. connection.Open();
  643. using (SqlDataAdapter sqlDA = new SqlDataAdapter())
  644. {
  645. try
  646. {
  647. sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
  648. sqlDA.Fill(dataSet, tableName);
  649. connection.Close();
  650. return dataSet;
  651. }
  652. catch (Exception ex)
  653. {
  654. string retParamStr = string.Empty;
  655. foreach (IDataParameter item in parameters)
  656. {
  657. retParamStr += $"【参数名称:[{item.ParameterName}]参数值:[{item.Value}]】";
  658. }
  659. LogHelper.WriteLog($"执行存储过程,返回存储过程结果集DataSet中的某个表发生异常:【{ex.Message}】!存储过程:【{storedProcName}】{retParamStr} 表名称:【{tableName}】", LogTypeEnum.DbErr);
  660. return dataSet;
  661. }
  662. }
  663. }
  664. }
  665. /// <summary>
  666. /// 执行存储过程,返回存储过程结果集DataSet中的某个表。
  667. /// </summary>
  668. /// <param name="storedProcName">存储过程名</param>
  669. /// <param name="parameters">存储过程参数</param>
  670. /// <param name="tableName">DataSet结果中的表名</param>
  671. /// <param name="Times">超时时间设置(单位:秒)默认值30</param>
  672. /// <returns>DataSet</returns>
  673. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName, int Times)
  674. {
  675. using (SqlConnection connection = new SqlConnection(connectionString))
  676. {
  677. DataSet dataSet = new DataSet();
  678. connection.Open();
  679. using (SqlDataAdapter sqlDA = new SqlDataAdapter())
  680. {
  681. try
  682. {
  683. sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
  684. sqlDA.SelectCommand.CommandTimeout = Times;
  685. sqlDA.Fill(dataSet, tableName);
  686. connection.Close();
  687. return dataSet;
  688. }
  689. catch (Exception ex)
  690. {
  691. string retParamStr = string.Empty;
  692. foreach (IDataParameter item in parameters)
  693. {
  694. retParamStr += $"【参数名称:[{item.ParameterName}]参数值:[{item.Value}]】";
  695. }
  696. LogHelper.WriteLog($"执行存储过程,返回存储过程结果集DataSet中的某个表发生异常:【{ex.Message}】!存储过程:【{storedProcName}】{retParamStr} 表名称:【{tableName}】超时时间:【{Times}】", LogTypeEnum.DbErr);
  697. return dataSet;
  698. }
  699. }
  700. }
  701. }
  702. /// <summary>
  703. /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
  704. /// </summary>
  705. /// <param name="connection">数据库连接</param>
  706. /// <param name="storedProcName">存储过程名</param>
  707. /// <param name="parameters">存储过程参数</param>
  708. /// <returns>SqlCommand</returns>
  709. private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
  710. {
  711. SqlCommand command = new SqlCommand(storedProcName, connection)
  712. {
  713. CommandType = CommandType.StoredProcedure
  714. };
  715. foreach (SqlParameter parameter in parameters)
  716. {
  717. if (parameter != null)
  718. {
  719. // 检查未分配值的输出参数,将其分配以DBNull.Value.
  720. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  721. (parameter.Value == null))
  722. {
  723. parameter.Value = DBNull.Value;
  724. }
  725. command.Parameters.Add(parameter);
  726. }
  727. }
  728. return command;
  729. }
  730. /// <summary>
  731. /// 执行存储过程,返回返回一个整数值
  732. /// </summary>
  733. /// <param name="storedProcName">存储过程名</param>
  734. /// <param name="parameters">存储过程参数</param>
  735. /// <param name="rowsAffected">影响的行数</param>
  736. /// <returns></returns>
  737. public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
  738. {
  739. using (SqlConnection connection = new SqlConnection(connectionString))
  740. {
  741. int result;
  742. connection.Open();
  743. using (SqlCommand command = BuildIntCommand(connection, storedProcName, parameters))
  744. {
  745. try
  746. {
  747. rowsAffected = command.ExecuteNonQuery();
  748. result = (int)command.Parameters["ReturnValue"].Value;
  749. return result;
  750. }
  751. catch (Exception ex)
  752. {
  753. string retParamStr = string.Empty;
  754. foreach (IDataParameter item in parameters)
  755. {
  756. retParamStr += $"【参数名称:[{item.ParameterName}]参数值:[{item.Value}]】";
  757. }
  758. LogHelper.WriteLog($"执行存储过程,返回存储过程结果集DataSet中的某个表发生异常:【{ex.Message}】!存储过程:【{storedProcName}】{retParamStr} ", LogTypeEnum.DbErr);
  759. rowsAffected = 0;
  760. return 0;
  761. }
  762. }
  763. }
  764. }
  765. /// <summary>
  766. /// 创建 SqlCommand 对象实例(用来返回一个整数值)
  767. /// </summary>
  768. /// <param name="storedProcName">存储过程名</param>
  769. /// <param name="parameters">存储过程参数</param>
  770. /// <returns>SqlCommand 对象实例</returns>
  771. private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
  772. {
  773. SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
  774. command.Parameters.Add(new SqlParameter("ReturnValue",
  775. SqlDbType.Int, 4, ParameterDirection.ReturnValue,
  776. false, 0, 0, string.Empty, DataRowVersion.Default, null));
  777. return command;
  778. }
  779. #endregion
  780. #region 自定义方法
  781. /// <summary>
  782. /// 数据库是否连接成功
  783. /// </summary>
  784. /// <returns></returns>
  785. public static bool ConnStatus()
  786. {
  787. using (SqlConnection connection = new SqlConnection(connectionString))
  788. {
  789. try
  790. {
  791. connection.Open();
  792. return true;
  793. }
  794. catch (SqlException ex)
  795. {
  796. connection.Close();
  797. LogHelper.WriteLog($"测试数据库是否连接成功发生异常:【{ex.Message}】!", LogTypeEnum.DbErr);
  798. return false;
  799. }
  800. }
  801. }
  802. #endregion
  803. }
  804. }