You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

332 lines
14 KiB

3 weeks ago
  1. using NFine.Code;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Configuration;
  5. using System.Data;
  6. using System.Data.Common;
  7. using System.Data.SqlClient;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Security.Cryptography;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace NFine.Data.Extensions
  14. {
  15. public class ERPSqlServerHelper
  16. {
  17. #region [ 连接串相关 ]
  18. /// <summary>
  19. /// 数据中心DB的连接字符串
  20. /// </summary>
  21. public static string ConnectionString = FromMd5( ConfigurationManager.ConnectionStrings["ERPconnstr"].ConnectionString);
  22. /// <summary>
  23. /// 获取同步服务器的连接
  24. /// </summary>
  25. /// <returns></returns>
  26. #region 字符串加解密
  27. /// <summary>
  28. /// MD5加密
  29. /// </summary>
  30. /// <param name="str"></param>
  31. /// <returns></returns>
  32. public static string ToMd5(string str)
  33. {
  34. return Encrypt(str, "&%#@?,:*_");
  35. }
  36. /// <summary>
  37. /// MD5解密
  38. /// </summary>
  39. /// <param name="str"></param>
  40. /// <returns></returns>
  41. public static string FromMd5(string str)
  42. {
  43. //return str;
  44. return Decrypt(str, "&%#@?,:*_");
  45. }
  46. /// <summary>
  47. /// 加密
  48. /// </summary>
  49. /// <param name="strText"></param>
  50. /// <param name="strEncrKey"></param>
  51. /// <returns></returns>
  52. private static String Encrypt(String strText, String strEncrKey)
  53. {
  54. Byte[] byKey = { };
  55. Byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
  56. try
  57. {
  58. byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8));
  59. DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  60. Byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
  61. MemoryStream ms = new MemoryStream();
  62. CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV),
  63. CryptoStreamMode.Write);
  64. cs.Write(inputByteArray, 0, inputByteArray.Length);
  65. cs.FlushFinalBlock();
  66. return Convert.ToBase64String(ms.ToArray());
  67. }
  68. catch (Exception ex)
  69. {
  70. return ex.Message;
  71. }
  72. }
  73. /// <summary>
  74. /// 解密
  75. /// </summary>
  76. /// <param name="strText"></param>
  77. /// <param name="sDecrKey"></param>
  78. /// <returns></returns>
  79. private static String Decrypt(String strText, String sDecrKey)
  80. {
  81. Byte[] byKey = { };
  82. Byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
  83. Byte[] inputByteArray = new byte[strText.Length];
  84. try
  85. {
  86. byKey = System.Text.Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8));
  87. DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  88. inputByteArray = Convert.FromBase64String(strText);
  89. MemoryStream ms = new MemoryStream();
  90. CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV),
  91. CryptoStreamMode.Write);
  92. cs.Write(inputByteArray, 0, inputByteArray.Length);
  93. cs.FlushFinalBlock();
  94. System.Text.Encoding encoding = System.Text.Encoding.UTF8;
  95. return encoding.GetString(ms.ToArray());
  96. }
  97. catch (Exception ex)
  98. {
  99. return ex.Message;
  100. }
  101. }
  102. #endregion
  103. private static SqlConnection GetConnectionString()
  104. {
  105. return new SqlConnection(ConnectionString);
  106. }
  107. /// <summary>
  108. /// 根据连接串获取连接
  109. /// </summary>
  110. /// <returns></returns>
  111. private static SqlConnection GetConnByString(string conn)
  112. {
  113. return new SqlConnection(conn);
  114. }
  115. #endregion
  116. #region 数据分页
  117. /// <summary>
  118. /// 摘要:
  119. /// 数据分页
  120. /// 参数:
  121. /// sql:传入要执行sql语句
  122. /// param:参数化
  123. /// orderField:排序字段
  124. /// orderType:排序类型
  125. /// pageIndex:当前页
  126. /// pageSize:页大小
  127. /// count:返回查询条数
  128. /// </summary>
  129. public static DataTable GetPageTable(string sql, DbParameter[] param, string orderField, string orderType, int pageIndex, int pageSize, ref int count)
  130. {
  131. StringBuilder strSql = new StringBuilder();
  132. string DataActionsql = GetDataActionSql();
  133. sql += " " + DataActionsql;
  134. if (pageIndex == 0)
  135. {
  136. pageIndex = 1;
  137. }
  138. int num = (pageIndex - 1) * pageSize;
  139. int num1 = (pageIndex) * pageSize;
  140. string OrderBy = "";
  141. if (!string.IsNullOrEmpty(orderField))
  142. OrderBy = "Order By " + orderField + " " + orderType + "";
  143. else
  144. OrderBy = "order by (select 0)";
  145. strSql.Append("Select * From (Select ROW_NUMBER() Over (" + OrderBy + ")");
  146. strSql.Append(" As rowNum, * From (" + sql + ") As T ) As N Where rowNum > " + num + " And rowNum <= " + num1 + "");
  147. count = Convert.ToInt32(ExecuteScalar(CommandType.Text, "Select Count(1) From (" + sql + ") As t", param));
  148. IDataReader dr = ExecuteReader(CommandType.Text, strSql.ToString(), param);
  149. return DatabaseReader.ReaderToDataTable(dr);
  150. }
  151. /// <summary>
  152. /// 根据sql语句和参数,返回DataTable
  153. /// </summary>
  154. /// <param name="sql">sql语句</param>
  155. /// <param name="spArr">可变参数</param>
  156. /// <returns>DataTable</returns>
  157. public static DataTable GetDataTableBySql(string sql, params SqlParameter[] spArr)
  158. {
  159. using (SqlConnection conn = GetConnectionString())
  160. {
  161. conn.Open();
  162. SqlCommand cmd = new SqlCommand(sql, conn).AddTimeout();
  163. if (spArr != null && spArr.Length > 0)
  164. cmd.Parameters.AddRange(spArr.SetDBNull());
  165. DataTable dt = cmd.ExecuteDataTable();
  166. return dt;
  167. }
  168. }
  169. /// <summary>
  170. /// 使用提供的参数,执行有结果集返回的数据库操作命令、并返回SqlDataReader对象
  171. /// </summary>
  172. /// <param name="commandType">执行命令的类型(存储过程或T-SQL,等等)</param>
  173. /// <param name="commandText">存储过程名称或者T-SQL命令行<</param>
  174. /// <param name="parameters">执行命令所需的sql语句对应参数</param>
  175. /// <returns>返回SqlDataReader对象</returns>
  176. private static IDataReader ExecuteReader(CommandType cmdType, string cmdText, params DbParameter[] parameters)
  177. {
  178. DbCommand cmd = DbFactory.CreateDbCommand();
  179. DbConnection conn = DbFactory.CreateDbConnection(ConnectionString);
  180. try
  181. {
  182. PrepareCommand(cmd, conn, null, cmdType, cmdText, parameters);
  183. IDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  184. cmd.Parameters.Clear();
  185. return rdr;
  186. }
  187. catch (Exception ex)
  188. {
  189. conn.Close();
  190. cmd.Dispose();
  191. //log.Error(ex.Message);
  192. throw;
  193. }
  194. }
  195. /// <summary>
  196. /// 依靠数据库连接字符串connectionString,
  197. /// 使用所提供参数,执行返回首行首列命令
  198. /// </summary>
  199. /// <param name="commandType">执行命令的类型(存储过程或T-SQL,等等)</param>
  200. /// <param name="commandText">存储过程名称或者T-SQL命令行</param>
  201. /// <param name="parameters">执行命令所需的sql语句对应参数</param>
  202. /// <returns>返回一个对象,使用Convert.To{Type}将该对象转换成想要的数据类型。</returns>
  203. private static object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] parameters)
  204. {
  205. try
  206. {
  207. DbCommand cmd = DbFactory.CreateDbCommand();
  208. using (DbConnection connection = DbFactory.CreateDbConnection(ConnectionString))
  209. {
  210. PrepareCommand(cmd, connection, null, cmdType, cmdText, parameters);
  211. object val = cmd.ExecuteScalar();
  212. cmd.Parameters.Clear();
  213. return val;
  214. }
  215. }
  216. catch (Exception ex)
  217. {
  218. //log.Error(ex.Message);
  219. throw;
  220. }
  221. }
  222. /// <summary>
  223. /// 为即将执行准备一个命令
  224. /// </summary>
  225. /// <param name="cmd">SqlCommand对象</param>
  226. /// <param name="conn">SqlConnection对象</param>
  227. /// <param name="isOpenTrans">DbTransaction对象</param>
  228. /// <param name="cmdType">执行命令的类型(存储过程或T-SQL,等等)</param>
  229. /// <param name="cmdText">存储过程名称或者T-SQL命令行, e.g. Select * from Products</param>
  230. /// <param name="cmdParms">SqlParameters to use in the command</param>
  231. private static void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction isOpenTrans, CommandType cmdType, string cmdText, DbParameter[] cmdParms)
  232. {
  233. if (conn.State != ConnectionState.Open)
  234. conn.Open();
  235. cmd.Connection = conn;
  236. cmd.CommandText = cmdText;
  237. if (isOpenTrans != null)
  238. cmd.Transaction = isOpenTrans;
  239. cmd.CommandType = cmdType;
  240. if (cmdParms != null)
  241. {
  242. cmd.Parameters.AddRange(cmdParms);
  243. }
  244. }
  245. #endregion
  246. public static string GetDataActionSql()
  247. {
  248. OperatorModel oo = NFine.Code.OperatorProvider.Provider.GetCurrent();
  249. string MUSER = NFine.Code.OperatorProvider.Provider.GetCurrent().UserCode;
  250. string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
  251. string sqlstr = string.Empty;
  252. try
  253. {
  254. string sql = @" select B.DataActionId from Sys_SRM_User A
  255. INNER JOIN Sys_RoleDataPower B ON B.RoleId=A.F_RoleId
  256. where F_Account='{0}' and F_Location='{1}'";
  257. sql = string.Format(sql, MUSER, WorkPoint);
  258. DataTable dt = SqlHelper.GetDataTableBySql(sql);
  259. if (dt.Rows.Count == 0)
  260. {
  261. sqlstr = "";
  262. }
  263. else
  264. {
  265. string DataActionID = "";
  266. foreach (DataRow dr in dt.Rows)
  267. {
  268. DataActionID += "'" + dr["DataActionId"].ToString() + "',";
  269. }
  270. sql = @" SELECT CCaption 条件名称, CValueBegin 起始值,CValueEnd 结束值
  271. from Sys_FormDataAction con
  272. where con.ID in ({0})";
  273. sql = string.Format(sql, DataActionID.TrimEnd(','));
  274. dt = SqlHelper.GetDataTableBySql(sql);
  275. foreach (DataRow dr in dt.Rows)
  276. {
  277. if (dr["起始值"].ToString() != "" && dr["结束值"].ToString() != "")
  278. {
  279. sqlstr += " and " + dr["条件名称"].ToString() + " >= '" + dr["起始值"].ToString() + @"'
  280. and " + dr[""].ToString() + " <= '" + dr[""].ToString() + "'";
  281. }
  282. else if (dr["起始值"].ToString() == "" && dr["结束值"].ToString() == "")
  283. {
  284. continue;
  285. }
  286. else
  287. {
  288. if (dr["起始值"].ToString() != "")
  289. {
  290. sqlstr += " and " + dr["条件名称"].ToString() + " = '" + dr["起始值"].ToString() + "'";
  291. }
  292. else
  293. {
  294. sqlstr += " and " + dr["条件名称"].ToString() + " = '" + dr["结束值"].ToString() + "'";
  295. }
  296. }
  297. if (dr["起始值"].ToString().Contains("[AppConfig.WorkPointCode]") || dr["起始值"].ToString().Contains("[AppConfig.UserId]")
  298. || dr["起始值"].ToString().Contains("[AppConfig.UserCode]") || dr["起始值"].ToString().Contains("[AppConfig.UserName]")
  299. || dr["起始值"].ToString().Contains("[AppConfig.RoleCode]"))
  300. {
  301. sqlstr = sqlstr.Replace("[AppConfig.WorkPointCode]", oo.Location);
  302. sqlstr = sqlstr.Replace("[AppConfig.UserId]", oo.UserId);
  303. sqlstr = sqlstr.Replace("[AppConfig.UserCode]", oo.UserCode);
  304. sqlstr = sqlstr.Replace("[AppConfig.UserName]", oo.UserName);
  305. sqlstr = sqlstr.Replace("[AppConfig.RoleCode]", oo.RoleEnCode);
  306. }
  307. }
  308. }
  309. }
  310. catch (Exception ex)
  311. {
  312. throw new Exception(ex.Message);
  313. }
  314. return sqlstr;
  315. }
  316. }
  317. }