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.

185 lines
7.8 KiB

3 weeks ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace ICSSoft.Common
  9. {
  10. public class HTTPHelper
  11. {
  12. private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  13. //public static string HttpPost(string apiName, string url, string body)
  14. //{
  15. // try
  16. // {
  17. // //log.Debug(url + Environment.NewLine + body);
  18. // Encoding encoding = Encoding.UTF8;
  19. // System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
  20. // request.Method = "POST";
  21. // request.Accept = "application/json, text/javascript, */*"; //"text/html, application/xhtml+xml, */*";
  22. // request.ContentType = "application/json; charset=utf-8";
  23. // // request.ContentType = "text/html, application/xhtml+xml";
  24. // byte[] buffer = encoding.GetBytes(body);
  25. // request.ContentLength = buffer.Length;
  26. // request.GetRequestStream().Write(buffer, 0, buffer.Length);
  27. // System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
  28. // using (System.IO.StreamReader reader = new System.IO.StreamReader(response.GetResponseStream(), encoding))
  29. // {
  30. // return reader.ReadToEnd();
  31. // }
  32. // }
  33. // catch (System.Net.WebException ex)
  34. // {
  35. // log.Error(ex.ToString() + Environment.NewLine + url + Environment.NewLine + body);
  36. // throw new Exception(apiName + "调用失败," + ex.Message);
  37. // }
  38. //}
  39. public static string HttpPost(string apiName, string url, string body)
  40. {
  41. try
  42. {
  43. Encoding encoding = Encoding.UTF8;
  44. System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
  45. request.Method = "POST";
  46. request.Accept = "application/json, text/javascript, */*";
  47. request.ContentType = "application/json; charset=utf-8";
  48. request.Timeout = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["TimeOut"]);//超时时间
  49. byte[] buffer = encoding.GetBytes(body);
  50. request.ContentLength = buffer.Length;
  51. request.GetRequestStream().Write(buffer, 0, buffer.Length);
  52. System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
  53. using (System.IO.StreamReader reader = new System.IO.StreamReader(response.GetResponseStream(), encoding))
  54. {
  55. return reader.ReadToEnd();
  56. }
  57. }
  58. catch (System.Net.WebException ex)
  59. {
  60. log.Error(ex.ToString() + Environment.NewLine + url + Environment.NewLine + body);
  61. throw new Exception(apiName + "调用失败," + ex.Message);
  62. }
  63. }
  64. public static void BatchUpdate(SqlConnection conn, SqlTransaction transaction, string crateTemplateSql, string tmpTable, string updateCommandSql, DataSet dset, Dictionary<string, string[]> tableDecimalColumns = null)
  65. {
  66. try
  67. {
  68. if (crateTemplateSql != "")
  69. {
  70. using (SqlCommand command = new SqlCommand(crateTemplateSql, conn, transaction))
  71. {
  72. command.ExecuteNonQuery();
  73. }
  74. }
  75. foreach (DataTable dt in dset.Tables)
  76. {
  77. if (dt == null) continue;
  78. log.Debug("表名: " + dt.TableName);
  79. // 根据表名获取对应的 decimal 列配置
  80. string[] decimalColumns = null;
  81. if (tableDecimalColumns != null && tableDecimalColumns.ContainsKey(dt.TableName))
  82. {
  83. decimalColumns = tableDecimalColumns[dt.TableName];
  84. }
  85. if (decimalColumns != null && decimalColumns.Length > 0)
  86. {
  87. ValidateDecimalColumns(dt, decimalColumns);
  88. }
  89. using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction))
  90. {
  91. bulkCopy.DestinationTableName = dt.TableName;
  92. foreach (DataColumn column in dt.Columns)
  93. {
  94. log.Debug("column.ColumnName: " + column.ColumnName);
  95. bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
  96. }
  97. bulkCopy.WriteToServer(dt);
  98. bulkCopy.Close();
  99. }
  100. }
  101. if (!string.IsNullOrEmpty(updateCommandSql))
  102. {
  103. using (SqlCommand command = new SqlCommand(updateCommandSql, conn, transaction))
  104. {
  105. int i = command.ExecuteNonQuery();
  106. log.Debug("updateCommandSql影响行数: " + i);
  107. }
  108. }
  109. }
  110. catch (Exception ex)
  111. {
  112. log.Error("BatchUpdate 出错: " + ex.Message);
  113. throw;
  114. }
  115. }
  116. // 验证 decimal 列的数据类型
  117. private static void ValidateDecimalColumns(DataTable dataTable, string[] decimalColumns)
  118. {
  119. // 添加 null 检查
  120. if (dataTable == null || decimalColumns == null) return;
  121. foreach (string columnName in decimalColumns)
  122. {
  123. // 检查 columnName 是否为 null 或空
  124. if (string.IsNullOrEmpty(columnName)) continue;
  125. if (dataTable.Columns.Contains(columnName))
  126. {
  127. // 检查列的数据类型
  128. if (dataTable.Columns[columnName].DataType != typeof(decimal))
  129. {
  130. // 如果数据类型不是 decimal,创建一个新的 decimal 列
  131. DataColumn newColumn = new DataColumn(columnName + "_New", typeof(decimal));
  132. dataTable.Columns.Add(newColumn);
  133. // 转换数据
  134. foreach (DataRow row in dataTable.Rows)
  135. {
  136. // 检查 row 是否为 null
  137. if (row == null) continue;
  138. if (row[columnName] != DBNull.Value && row[columnName] != null)
  139. {
  140. decimal value=0;
  141. if (decimal.TryParse(row[columnName].ToString(), out value))
  142. {
  143. row[newColumn] = value;
  144. }
  145. else
  146. {
  147. row[newColumn] = 0m;
  148. }
  149. }
  150. else
  151. {
  152. row[newColumn] = 0m;
  153. }
  154. }
  155. // 删除原列并重命名新列
  156. dataTable.Columns.Remove(columnName);
  157. newColumn.ColumnName = columnName;
  158. }
  159. }
  160. else
  161. {
  162. continue;
  163. }
  164. }
  165. }
  166. }
  167. }