商丘12345对接新点

SqlServerHelper.cs 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Data.Common;
  6. using System.Data.SqlClient;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace SQ12345_OutApi.Utility
  11. {
  12. public abstract class SqlServerHelper
  13. {
  14. public static string connectionString = EncryptHelper.DecryptAES(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
  15. #region 执行简单SQL语句
  16. /// <summary>
  17. /// 执行SQL语句,返回影响的记录数
  18. /// </summary>
  19. /// <param name="SQLString">SQL语句</param>
  20. /// <returns>影响的记录数</returns>
  21. public static int ExecuteSql(string SQLString)
  22. {
  23. using (SqlConnection connection = new SqlConnection(connectionString))
  24. {
  25. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  26. {
  27. try
  28. {
  29. connection.Open();
  30. int rows = cmd.ExecuteNonQuery();
  31. return rows;
  32. }
  33. catch (System.Data.SqlClient.SqlException e)
  34. {
  35. connection.Close();
  36. throw e;
  37. }
  38. }
  39. }
  40. }
  41. /// <summary>
  42. /// 执行SQL语句,返回影响的记录数(防止sql注入)
  43. /// </summary>
  44. /// <param name="SQLString">SQL语句</param>
  45. /// <returns>影响的记录数</returns>
  46. public static int ExecuteSql(string SQLString, Dictionary<String, String> paras)
  47. {
  48. List<SqlParameter> ps = new List<SqlParameter>();
  49. foreach (KeyValuePair<string, string> kvp in paras)
  50. {
  51. ps.Add(new SqlParameter(kvp.Key, kvp.Value));
  52. }
  53. return ExecuteSql(SQLString, ps.ToArray());
  54. }
  55. /// <summary>
  56. /// 执行多条SQL语句,实现数据库事务。
  57. /// </summary>
  58. /// <param name="SQLStringList">多条SQL语句</param>
  59. public static int ExecuteSqlTran(List<String> SQLStringList)
  60. {
  61. using (SqlConnection conn = new SqlConnection(connectionString))
  62. {
  63. conn.Open();
  64. SqlCommand cmd = new SqlCommand();
  65. cmd.Connection = conn;
  66. SqlTransaction tx = conn.BeginTransaction();
  67. cmd.Transaction = tx;
  68. try
  69. {
  70. int count = 0;
  71. for (int n = 0; n < SQLStringList.Count; n++)
  72. {
  73. string strsql = SQLStringList[n];
  74. if (strsql.Trim().Length > 1)
  75. {
  76. cmd.CommandText = strsql;
  77. count += cmd.ExecuteNonQuery();
  78. }
  79. }
  80. tx.Commit();
  81. return count;
  82. }
  83. catch
  84. {
  85. tx.Rollback();
  86. return 0;
  87. }
  88. }
  89. }
  90. /// <summary>
  91. /// 执行带一个存储过程参数的的SQL语句。
  92. /// </summary>
  93. /// <param name="SQLString">SQL语句</param>
  94. /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
  95. /// <returns>影响的记录数</returns>
  96. public static int ExecuteSql(string SQLString, string content)
  97. {
  98. using (SqlConnection connection = new SqlConnection(connectionString))
  99. {
  100. SqlCommand cmd = new SqlCommand(SQLString, connection);
  101. System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
  102. myParameter.Value = content;
  103. cmd.Parameters.Add(myParameter);
  104. try
  105. {
  106. connection.Open();
  107. int rows = cmd.ExecuteNonQuery();
  108. return rows;
  109. }
  110. catch (System.Data.SqlClient.SqlException e)
  111. {
  112. throw e;
  113. }
  114. finally
  115. {
  116. cmd.Dispose();
  117. connection.Close();
  118. }
  119. }
  120. }
  121. /// <summary>
  122. /// 执行一条计算查询结果语句,返回查询结果(object)。
  123. /// </summary>
  124. /// <param name="SQLString">计算查询结果语句</param>
  125. /// <returns>查询结果(object)</returns>
  126. public static object GetSingle(string SQLString)
  127. {
  128. using (SqlConnection connection = new SqlConnection(connectionString))
  129. {
  130. using (SqlCommand cmd = new SqlCommand(SQLString, connection))
  131. {
  132. try
  133. {
  134. connection.Open();
  135. object obj = cmd.ExecuteScalar();
  136. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  137. {
  138. return null;
  139. }
  140. else
  141. {
  142. return obj;
  143. }
  144. }
  145. catch (System.Data.SqlClient.SqlException e)
  146. {
  147. connection.Close();
  148. throw e;
  149. }
  150. }
  151. }
  152. }
  153. /// <summary>
  154. /// 执行一条计算查询结果语句,返回查询结果(object)(防止sql注入)。
  155. /// </summary>
  156. /// <param name="SQLString">计算查询结果语句</param>
  157. /// <param name="paras">参数(字典)</param>
  158. /// <returns>查询结果(object)</returns>
  159. public static object GetSingle(string SQLString, Dictionary<String, String> paras)
  160. {
  161. List<SqlParameter> ps = new List<SqlParameter>();
  162. foreach (KeyValuePair<string, string> kvp in paras)
  163. {
  164. ps.Add(new SqlParameter(kvp.Key, kvp.Value));
  165. }
  166. return GetSingle(SQLString, ps.ToArray());
  167. }
  168. /// <summary>
  169. /// 执行查询语句,返回DataSet
  170. /// </summary>
  171. /// <param name="SQLString">查询语句</param>
  172. /// <returns>DataSet</returns>
  173. public static DataSet Query(string SQLString)
  174. {
  175. using (SqlConnection connection = new SqlConnection(connectionString))
  176. {
  177. DataSet ds = new DataSet();
  178. try
  179. {
  180. connection.Open();
  181. SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
  182. command.Fill(ds, "ds");
  183. }
  184. catch (System.Data.SqlClient.SqlException ex)
  185. {
  186. throw new Exception(ex.Message);
  187. }
  188. return ds;
  189. }
  190. }
  191. /// <summary>
  192. /// 执行查询语句,返回DataSet(防止sql注入)
  193. /// </summary>
  194. /// <param name="SQLString"></param>
  195. /// <param name="paras"></param>
  196. /// <returns></returns>
  197. public static DataSet Query(string SQLString, Dictionary<String, String> paras)
  198. {
  199. List<SqlParameter> ps = new List<SqlParameter>();
  200. foreach (KeyValuePair<string, string> kvp in paras)
  201. {
  202. ps.Add(new SqlParameter(kvp.Key, kvp.Value));
  203. }
  204. return Query(SQLString, ps.ToArray());
  205. }
  206. #endregion
  207. #region 执行带参数的SQL语句
  208. /// <summary>
  209. /// 执行SQL语句,返回影响的记录数
  210. /// </summary>
  211. /// <param name="SQLString">SQL语句</param>
  212. /// <returns>影响的记录数</returns>
  213. public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
  214. {
  215. using (SqlConnection connection = new SqlConnection(connectionString))
  216. {
  217. using (SqlCommand cmd = new SqlCommand())
  218. {
  219. cmd.CommandTimeout = 3600;
  220. try
  221. {
  222. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  223. int rows = cmd.ExecuteNonQuery();
  224. cmd.Parameters.Clear();
  225. return rows;
  226. }
  227. catch (System.Data.SqlClient.SqlException e)
  228. {
  229. LogHelper.Error(SQLString, e);
  230. //throw e;
  231. }
  232. return 0;
  233. }
  234. }
  235. }
  236. /// <summary>
  237. /// 执行一条计算查询结果语句,返回查询结果(object)。
  238. /// </summary>
  239. /// <param name="SQLString">计算查询结果语句</param>
  240. /// <returns>查询结果(object)</returns>
  241. public static object GetSingle(string SQLString, params SqlParameter[] cmdParms)
  242. {
  243. using (SqlConnection connection = new SqlConnection(connectionString))
  244. {
  245. using (SqlCommand cmd = new SqlCommand())
  246. {
  247. try
  248. {
  249. cmd.CommandTimeout = 300;
  250. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  251. object obj = cmd.ExecuteScalar();
  252. cmd.Parameters.Clear();
  253. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  254. {
  255. return null;
  256. }
  257. else
  258. {
  259. return obj;
  260. }
  261. }
  262. catch (System.Data.SqlClient.SqlException e)
  263. {
  264. LogHelper.Error(SQLString, e);
  265. return null;
  266. }
  267. }
  268. }
  269. }
  270. /// <summary>
  271. /// 执行查询语句,返回DataSet
  272. /// </summary>
  273. /// <param name="SQLString">查询语句</param>
  274. /// <returns>DataSet</returns>
  275. public static DataSet Query(string SQLString, params SqlParameter[] cmdParms)
  276. {
  277. using (SqlConnection connection = new SqlConnection(connectionString))
  278. {
  279. SqlCommand cmd = new SqlCommand();
  280. PrepareCommand(cmd, connection, null, SQLString, cmdParms);
  281. using (SqlDataAdapter da = new SqlDataAdapter(cmd))
  282. {
  283. DataSet ds = new DataSet();
  284. try
  285. {
  286. da.Fill(ds, "ds");
  287. cmd.Parameters.Clear();
  288. }
  289. catch (System.Data.SqlClient.SqlException ex)
  290. {
  291. LogHelper.Error(SQLString, ex);
  292. //throw new Exception(ex.Message);
  293. }
  294. return ds;
  295. }
  296. }
  297. }
  298. /// <summary>
  299. /// 准备
  300. /// </summary>
  301. /// <param name="cmd"></param>
  302. /// <param name="conn"></param>
  303. /// <param name="trans"></param>
  304. /// <param name="cmdText"></param>
  305. /// <param name="cmdParms"></param>
  306. private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
  307. {
  308. DbCommand comm = conn.CreateCommand();
  309. comm.CommandTimeout = 5000;//500秒,单位是秒
  310. if (conn.State != ConnectionState.Open)
  311. conn.Open();
  312. cmd.Connection = conn;
  313. cmd.CommandText = cmdText;
  314. if (trans != null)
  315. cmd.Transaction = trans;
  316. cmd.CommandType = CommandType.Text;//cmdType;
  317. if (cmdParms != null)
  318. {
  319. foreach (SqlParameter parameter in cmdParms)
  320. {
  321. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  322. (parameter.Value == null))
  323. {
  324. parameter.Value = DBNull.Value;
  325. }
  326. cmd.Parameters.Add(parameter);
  327. }
  328. }
  329. }
  330. #endregion
  331. #region 存储过程操作
  332. /// <summary>
  333. /// 执行存储过程
  334. /// </summary>
  335. /// <param name="storedProcName">存储过程名</param>
  336. /// <param name="parameters">存储过程参数</param>
  337. /// <param name="tableName">DataSet结果中的表名</param>
  338. /// <returns>DataSet</returns>
  339. public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
  340. {
  341. using (SqlConnection connection = new SqlConnection(connectionString))
  342. {
  343. DataSet dataSet = new DataSet();
  344. connection.Open();
  345. SqlDataAdapter sqlDA = new SqlDataAdapter();
  346. sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
  347. sqlDA.Fill(dataSet, tableName);
  348. connection.Close();
  349. return dataSet;
  350. }
  351. }
  352. /// <summary>
  353. /// 执行存储过程
  354. /// </summary>
  355. /// <param name="storedProcName">存储过程名</param>
  356. /// <param name="paras">存储过程参数(字典)</param>
  357. /// <param name="tableName">DataSet结果中的表名</param>
  358. /// <returns>DataSet</returns>
  359. public static DataSet RunProcedure(string storedProcName, Dictionary<String, String> paras, string tableName)
  360. {
  361. List<SqlParameter> ps = new List<SqlParameter>();
  362. foreach (KeyValuePair<string, string> kvp in paras)
  363. {
  364. ps.Add(new SqlParameter(kvp.Key, kvp.Value));
  365. }
  366. using (SqlConnection connection = new SqlConnection(connectionString))
  367. {
  368. DataSet dataSet = new DataSet();
  369. connection.Open();
  370. SqlDataAdapter sqlDA = new SqlDataAdapter();
  371. sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, ps.ToArray());
  372. sqlDA.Fill(dataSet, tableName);
  373. connection.Close();
  374. return dataSet;
  375. }
  376. }
  377. /// <summary>
  378. /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
  379. /// </summary>
  380. /// <param name="connection">数据库连接</param>
  381. /// <param name="storedProcName">存储过程名</param>
  382. /// <param name="parameters">存储过程参数</param>
  383. /// <returns>SqlCommand</returns>
  384. private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
  385. {
  386. SqlCommand command = new SqlCommand(storedProcName, connection);
  387. command.CommandType = CommandType.StoredProcedure;
  388. foreach (SqlParameter parameter in parameters)
  389. {
  390. if (parameter != null)
  391. {
  392. // 检查未分配值的输出参数,将其分配以DBNull.Value.
  393. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  394. (parameter.Value == null))
  395. {
  396. parameter.Value = DBNull.Value;
  397. }
  398. command.Parameters.Add(parameter);
  399. }
  400. }
  401. command.CommandTimeout = 180;
  402. return command;
  403. }
  404. /// <summary>
  405. /// 执行存储过程,返回影响的行数
  406. /// </summary>
  407. /// <param name="storedProcName">存储过程名</param>
  408. /// <param name="parameters">存储过程参数</param>
  409. /// <param name="rowsAffected">影响的行数</param>
  410. /// <returns></returns>
  411. public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
  412. {
  413. using (SqlConnection connection = new SqlConnection(connectionString))
  414. {
  415. int result;
  416. connection.Open();
  417. SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
  418. rowsAffected = command.ExecuteNonQuery();
  419. result = (int)command.Parameters["ReturnValue"].Value;
  420. //Connection.Close();
  421. return result;
  422. }
  423. }
  424. /// <summary>
  425. /// 创建 SqlCommand 对象实例(用来返回一个整数值)
  426. /// </summary>
  427. /// <param name="storedProcName">存储过程名</param>
  428. /// <param name="parameters">存储过程参数</param>
  429. /// <returns>SqlCommand 对象实例</returns>
  430. private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
  431. {
  432. SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
  433. command.Parameters.Add(new SqlParameter("ReturnValue",
  434. SqlDbType.Int, 4, ParameterDirection.ReturnValue,
  435. false, 0, 0, string.Empty, DataRowVersion.Default, null));
  436. return command;
  437. }
  438. #endregion
  439. #region 执行分页
  440. /// <summary>
  441. /// 执行分页sql,where条件参数化
  442. /// </summary>
  443. /// <param name="TableName"></param>
  444. /// <param name="Fields"></param>
  445. /// <param name="WhereStr"></param>
  446. /// <param name="WherePra"></param>
  447. /// <param name="OrderStr"></param>
  448. /// <param name="PageSize"></param>
  449. /// <param name="PageIndex"></param>
  450. /// <param name="RecordCount"></param>
  451. /// <returns></returns>
  452. public static DataTable RunPaginationBySqlParameter(string TableName, string Fields, string WhereStr, Dictionary<string, string> WherePra, string OrderStr, int PageSize, int PageIndex, out int RecordCount)
  453. {
  454. string sql = string.Format("WITH t AS (SELECT ROW_NUMBER() OVER({0}) as row_number,{1} from {2} where 1=1 {3}) Select * from t where row_number BETWEEN {4} and {5}", OrderStr, Fields, TableName, WhereStr, PageSize * (PageIndex - 1) + 1, PageSize * PageIndex);
  455. DataTable PageTable = Query(sql, WherePra).Tables[0];
  456. PageTable.Columns.Remove("row_number");
  457. RecordCount = GetSingle("select count(1) from " + TableName + " where 1=1 " + WhereStr, WherePra)?.ToString().ToInt() ?? 0;
  458. return PageTable;
  459. }
  460. #endregion
  461. }
  462. }