CNAS取数仪器端升级
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.

598 lines
25KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. using CnasSynchronousCommon;
  7. using CnasSynchrousModel;
  8. using System.Reflection;
  9. using Devart.Common;
  10. namespace CnasSynchronusDAL
  11. {
  12. public class PostgreSqlDAL
  13. {
  14. public void CreateConnectString(string strIP, string strPort, string strName, string strUser, string strPwd)
  15. {
  16. MySQLHelper.InitConnectionString(strIP, strPort, strName, strUser, strPwd);
  17. }
  18. public void CreateConnectString(string strConnectString)
  19. {
  20. MySQLHelper.InitConnectionString(strConnectString);
  21. }
  22. //获取所有表单名称
  23. public DataTable GetTableNames(string strName)
  24. {
  25. DataTable dt = new DataTable();
  26. string strSql = string.Format("SELECT table_name as TABNAME FROM information_schema.TABLES WHERE table_schema='{0}'", strName);
  27. try
  28. {
  29. dt = MySQLHelper.ExecuteDataSet(strSql).Tables[0];
  30. }
  31. catch (Exception ex)
  32. {
  33. AppLog.Error(ex.Message);
  34. }
  35. return dt;
  36. }
  37. /// <summary>
  38. /// 获取某表的表结构
  39. /// </summary>
  40. /// <param name="strTableName"></param>
  41. /// <returns></returns>
  42. public DataTable GetTableStruct(string strTableName, string strViewName, string strViewSql)
  43. {
  44. DataTable dt = new DataTable();
  45. if (strTableName.Length <= 0) return dt;
  46. string strSql = "";
  47. if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
  48. strSql = strViewSql + " where 0=1";
  49. else
  50. strSql = string.Format("SELECT * FROM {0} Where 0=1", strTableName);
  51. try
  52. {
  53. AppLog.Error("===-222-===" + strTableName + strSql);
  54. dt = MySQLHelper.ExecuteDataSet(strSql).Tables[0];
  55. AppLog.Error("===-333-===" + strTableName + "MySQLHelper.ExecuteDataSet(strSql)" + dt);
  56. }
  57. catch (Exception ex)
  58. {
  59. AppLog.Error(ex.Message);
  60. }
  61. return dt;
  62. }
  63. /// <summary>
  64. /// 获取某表的表结构和类型长度
  65. /// </summary>
  66. /// <param name="strTableName"></param>
  67. /// <returns></returns>
  68. public DataTable GetTableTypeAndLenth(string strTableName)
  69. {
  70. DataTable dt = new DataTable();
  71. string strSql = string.Format("select COLUMN_NAME AS 'ColumnName',IS_NULLABLE AS 'IsNullable',DATA_TYPE AS 'DataType',CHARACTER_MAXIMUM_LENGTH AS 'CharMaxLenth',CHARACTER_OCTET_LENGTH AS 'CharOcterLenth',NUMERIC_PRECISION AS 'NumericPrecision',NUMERIC_SCALE AS 'NumericScale' FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE '{0}'", strTableName);
  72. try
  73. {
  74. dt = MySQLHelper.ExecuteDataSet(strSql).Tables[0];
  75. }
  76. catch (Exception ex)
  77. {
  78. AppLog.Error(ex.Message);
  79. }
  80. return dt;
  81. }
  82. /// <summary>
  83. /// 逐行批量插入数据
  84. /// </summary>
  85. /// <param name="dt"></param>
  86. /// <returns></returns>
  87. public int InsertCnasData(DataTable dt, List<SyncParamasInfo> syncParamasInfos, List<CnasConditionMapValue> lstFixedValue, string strInsumentColumn)
  88. {
  89. int iReturn = 0;
  90. if (dt.Rows.Count <= 0) return 0;
  91. try
  92. {
  93. //获取唯一健组(关键字段)
  94. var query = from p in syncParamasInfos
  95. where p.IfPrimaryKey == true
  96. select new
  97. {
  98. p.TargetField
  99. };
  100. List<string> lstKeyColumns = new List<string>();
  101. foreach (var item in query)
  102. {
  103. lstKeyColumns.Add(item.TargetField);
  104. }
  105. //构建SQL语句
  106. string strSql_part1 = "";
  107. string strSql_part2 = "";
  108. List<string> lstColumnName = new List<string>();
  109. foreach (var item in syncParamasInfos)
  110. {
  111. if (!lstColumnName.Contains(item.TargetField.ToLower()))
  112. {
  113. strSql_part1 += item.TargetField + ",";
  114. strSql_part2 += string.Format("@{0},", item.TargetField.ToLower());
  115. lstColumnName.Add(item.TargetField.ToLower());
  116. }
  117. }
  118. //如果映射列中不包含固定列,则需要将这些列添加到SQL语句中
  119. if (lstFixedValue != null)
  120. {
  121. foreach (var cnasfield in lstFixedValue)
  122. {
  123. if (cnasfield.TableName != syncParamasInfos[0].TargetTable) continue;
  124. if (!lstColumnName.Contains(cnasfield.ColumnName.ToLower()))
  125. {
  126. strSql_part1 += cnasfield.ColumnName + ",";
  127. strSql_part2 += string.Format("@{0},", cnasfield.ColumnName.ToLower());
  128. lstColumnName.Add(cnasfield.ColumnName.ToLower());
  129. }
  130. }
  131. }
  132. //增加仪器编号数据
  133. if (!string.IsNullOrWhiteSpace(strInsumentColumn) && !lstColumnName.Contains(strInsumentColumn.ToLower()))
  134. {
  135. strSql_part1 += strInsumentColumn + ",";
  136. strSql_part2 += string.Format("@{0},", strInsumentColumn);
  137. lstColumnName.Add(strInsumentColumn.ToLower());
  138. }
  139. string strInsertSql = string.Format("insert into {0}({1}) values({2})", syncParamasInfos[0].TargetTable, strSql_part1.Substring(0, strSql_part1.Length - 1), strSql_part2.Substring(0, strSql_part2.Length - 1));
  140. string strUpdateSql = "";
  141. DataTable dtSelect = new DataTable();
  142. foreach (DataRow dr in dt.Rows)
  143. {
  144. //插入参数值
  145. MySqlParameter[] parameters = new MySqlParameter[lstColumnName.Count];
  146. int i = 0;
  147. foreach (var item in lstColumnName)
  148. {
  149. parameters[i++] = new MySqlParameter(item, dr[item]);
  150. }
  151. //插入时发现已经在数据库中存在该值,则进行更新操作
  152. int ifHavaValue = ExistSingleCnasData(lstKeyColumns, syncParamasInfos[0].TargetTable, dr, ref dtSelect);
  153. if (ifHavaValue == 1)
  154. {
  155. if (dtSelect.Rows.Count == 1)
  156. {
  157. //比对获取的数据跟准备更新的数据是否一样
  158. if (!CompareObjectOperation.DataRowCompare(dtSelect.Rows[0], dr, lstColumnName))
  159. {
  160. //构造更新语句
  161. strUpdateSql = GetUpdateSql(lstColumnName, lstKeyColumns, syncParamasInfos[0].TargetTable, dr);
  162. //执行UpdateSql语句
  163. iReturn += MySQLHelper.ExecuteNonQuery(strUpdateSql, parameters);
  164. }
  165. else
  166. {
  167. iReturn = -2;
  168. AppLog.Info("更新时发现在数据库中相同关键字段数据一致。");
  169. }
  170. }
  171. else
  172. {
  173. AppLog.Error("更新时发现在数据库中多条相同关键字段数据,请重新配置关键字段。");
  174. }
  175. }
  176. else if (ifHavaValue == 0)
  177. {
  178. //执行InsertSQL语句
  179. iReturn += MySQLHelper.ExecuteNonQuery(strInsertSql, parameters);
  180. }
  181. }
  182. }
  183. catch (Exception ex)
  184. {
  185. if (!LinkCnasTest())
  186. {
  187. iReturn = -1; //用于表示插入时无法正常数据库连接问题
  188. }
  189. //此处添加错误日志
  190. AppLog.Error(ex.Message);
  191. }
  192. return iReturn;
  193. }
  194. /// <summary>
  195. /// 拼接Update语句
  196. /// </summary>
  197. /// <param name="lstColumnName"></param>
  198. /// <param name="lstPrimaryColumn"></param>
  199. /// <param name="dr"></param>
  200. private string GetUpdateSql(List<string> lstColumnName, List<string> lstPrimaryColumn, string strTableName, DataRow dr)
  201. {
  202. //构造关键字段条件
  203. string strsql_partial = "";
  204. foreach (var item in lstPrimaryColumn)
  205. {
  206. if (dr.Table.Columns.Contains(item.ToString()))
  207. if (dr[item.ToString()].ToString() != "")
  208. strsql_partial += $"{item.ToString()}='{dr[item.ToString()].ToString()}' and ";
  209. else
  210. strsql_partial += $"({item.ToString()}='{dr[item.ToString()].ToString()}' or {item.ToString()} is null) and ";
  211. }
  212. //构造Update语句
  213. string strUpdateSql = "";
  214. string strsql_partial2 = "";
  215. foreach (var item in lstColumnName)
  216. {
  217. strsql_partial2 += $"{item}=@{item},";
  218. }
  219. if (strsql_partial.Length > 3 && strsql_partial2.Length > 0)
  220. strUpdateSql = $"update {strTableName} set {strsql_partial2.Substring(0, strsql_partial2.Length - 1)} where {strsql_partial.Substring(0, strsql_partial.Length - 4)}";
  221. return strUpdateSql;
  222. }
  223. internal bool CheckMacMessage(string strMac)
  224. {
  225. bool bIfChecked = false;
  226. string strSql = string.Format("select * FROM macaddress WHERE MAC_ADDRESS='{0}'", strMac);
  227. try
  228. {
  229. DataTable dt = MySQLHelper.ExecuteDataSet(strSql).Tables[0];
  230. if (dt != null && dt.Rows.Count > 0)
  231. {
  232. bIfChecked = true;
  233. }
  234. }
  235. catch (Exception ex)
  236. {
  237. AppLog.Error(ex.Message);
  238. }
  239. return bIfChecked;
  240. }
  241. /// <summary>
  242. /// 是否数据库中已经存在数据,如果存在返回1,并且传递返回的数据;如果不存在,返回0;如果发生了异常,返回-1
  243. /// </summary>
  244. /// <param name="lstPrimaryColumn"></param>
  245. /// <param name="strTableName"></param>
  246. /// <param name="dr"></param>
  247. /// <param name="dtSelect"></param>
  248. /// <returns></returns>
  249. private int ExistSingleCnasData(List<string> lstPrimaryColumn, string strTableName, DataRow dr, ref DataTable dtSelect)
  250. {
  251. int bIfHaveValue = 0; //如果存在,返回1;如果不存在,返回0;如果发生了异常,返回-1
  252. string strsql_partial = "";
  253. string strSql = "";
  254. foreach (var item in lstPrimaryColumn)
  255. {
  256. if (dr.Table.Columns.Contains(item.ToString()))
  257. if (dr[item.ToString()].ToString() != "")
  258. strsql_partial += $"{item.ToString()}='{dr[item.ToString()].ToString()}' and ";
  259. else
  260. strsql_partial += $"({item.ToString()}='{dr[item.ToString()].ToString()}' or {item.ToString()} is null) and ";
  261. }
  262. if (strsql_partial.Length > 3)
  263. strSql = $"select * from {strTableName} where {strsql_partial.Substring(0, strsql_partial.Length - 4)}";
  264. if (strsql_partial.Length > 3 && (strTableName.Equals("tcoalweight") || strTableName.Equals("TCOALWEIGHT")))
  265. strSql = $"select * from {strTableName} where (idbatch is null or idbatch = '') and {strsql_partial.Substring(0, strsql_partial.Length - 4)}";
  266. if (strSql != "")
  267. {
  268. DataTable dt = MySQLHelper.ExecuteDataTable(strSql, new MySqlParameter[] { });
  269. if (dt != null && dt.Rows.Count > 0)
  270. {
  271. bIfHaveValue = 1;
  272. dtSelect = dt;
  273. AppLog.Info($"插入前查询时存在重复数据:{strSql}");
  274. }
  275. else if (dt == null)
  276. {
  277. bIfHaveValue = -1;
  278. AppLog.Info($"插入前查询时发生了异常:{strSql}");
  279. }
  280. }
  281. return bIfHaveValue;
  282. }
  283. internal DataTable GetLoginNameByPwd(string strUserName, string strPwd)
  284. {
  285. DataTable dt = new DataTable();
  286. string strSql = string.Format("select * FROM user WHERE userid='{0}' and password='{1}'", strUserName, strPwd);
  287. try
  288. {
  289. dt = MySQLHelper.ExecuteDataSet(strSql).Tables[0];
  290. }
  291. catch (Exception ex)
  292. {
  293. AppLog.Error(ex.Message);
  294. }
  295. return dt;
  296. }
  297. public bool LinkCnasTest()
  298. {
  299. return MySQLHelper.TestConnectMySql();
  300. }
  301. /// <summary>
  302. /// 获得表中该列中最大时间
  303. /// </summary>
  304. /// <param name="dt"></param>
  305. /// <returns></returns>
  306. public string GetMaxTimeByTableName(string strTableName, string strDateColumn, string strInstrumentColumn, string strInstrumentValue)
  307. {
  308. string strReturnTime = "";
  309. //因为数据库用varchar存储日期字段,从而格式不固定,需要使用多种格式读取
  310. try
  311. {
  312. #region 旧的获取时间方法
  313. ////string strSql_1 = string.Format("SELECT max(STR_TO_DATE({0},'%Y-%m-%d %H:%i:%s')) FROM {1} ", strDateColumn, strTableName);
  314. ////string strSql_2 = string.Format("SELECT max(STR_TO_DATE({0},'%Y/%m/%d %H:%i:%s')) FROM {1} ", strDateColumn, strTableName);
  315. //string strSql_2 = string.Format("SELECT max(Convert({0},datetime)) FROM {1} ", strDateColumn, strTableName);
  316. ////string strDateTime_1 = GetMaxTimeByTableName(strSql_1);
  317. //string strDateTime_2= GetMaxTimeByTableName(strSql_2);
  318. ////AppLog.Info($"读取到最大的时间(1):表-{strTableName},列-{strDateColumn},值-{strDateTime_1}");
  319. //AppLog.Info($"读取到最大的时间(2):表-{strTableName},列-{strDateColumn},值-{strDateTime_2}");
  320. //List<DateTime> lstTime = new List<DateTime>();
  321. ////DateTime dateTime_1 = DateTime.Now;
  322. //DateTime dateTime_2 = DateTime.Now;
  323. ////if (DateTime.TryParse(strDateTime_1, out dateTime_1))
  324. ////{
  325. //// lstTime.Add(dateTime_1);
  326. ////}
  327. //if (DateTime.TryParse(strDateTime_2, out dateTime_2))
  328. //{
  329. // if (!lstTime.Contains(dateTime_2))
  330. // lstTime.Add(dateTime_2);
  331. //}
  332. //if (lstTime.Count > 0)
  333. //{
  334. // strReturnTime = lstTime.Max<DateTime>().ToString();
  335. // AppLog.Info($"返回最大的时间(3):表-{strTableName},列-{strDateColumn},值-{strReturnTime}");
  336. //}
  337. # endregion
  338. string strSql = string.Format("SELECT Convert(max(Convert({0},datetime)) using utf8) FROM {1}", strDateColumn, strTableName, strInstrumentColumn, strInstrumentValue);
  339. if (!string.IsNullOrWhiteSpace(strInstrumentColumn) && !string.IsNullOrWhiteSpace(strInstrumentValue))
  340. strSql += string.Format(" where {0}='{1}'", strInstrumentColumn, strInstrumentValue);
  341. string strDateTime = GetMaxTimeByTableName(strSql);
  342. DateTime dateTime = DateTime.Now;
  343. if (DateTime.TryParse(strDateTime, out dateTime))
  344. {
  345. strReturnTime = strDateTime;
  346. }
  347. }
  348. catch (Exception ex)
  349. {
  350. //if (!LinkCnasTest())
  351. //{
  352. // strReturnTime = "1899-1-1"; //用于表示插入时无法正常数据库连接问题
  353. //}
  354. //只要发生异常,就返回这个结果
  355. strReturnTime = "1899-1-1";
  356. AppLog.Error(ex.Message);
  357. }
  358. return strReturnTime;
  359. }
  360. internal DataTable GetDataByDateColumn(string strDBName, string strViewName, string strViewSql, string strTableName, string strDateColumn, string strDate)
  361. {
  362. DataTable dtReturn = new DataTable();
  363. try
  364. {
  365. string strSql = "";
  366. if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
  367. strSql = strViewSql + $" where {strDateColumn} >convert( '{strDate}',datetime)";
  368. else
  369. strSql = $"select * from {strDBName}.{strTableName} where {strDateColumn} >convert( '{strDate}',datetime)";
  370. DataTable dt = MySQLHelper.ExecuteDataSet(strSql).Tables[0];
  371. Dictionary<string, string> dictFiled = GetSpecialOperaField(strDBName, strTableName);
  372. if (dictFiled.Count > 0)
  373. dtReturn = DateAndTimeTypeOpera(dt, dictFiled);
  374. else
  375. dtReturn = dt;
  376. }
  377. catch (Exception ex)
  378. {
  379. //发生异常,写入日志
  380. AppLog.Error(ex.Message);
  381. throw ex;
  382. }
  383. return dtReturn;
  384. }
  385. internal Dictionary<string, DataTable> GetAllTableNameAndStructure(string strDBName)
  386. {
  387. Dictionary<string, DataTable> dictTables = new Dictionary<string, DataTable>();
  388. try
  389. {
  390. DataTable TablesName = GetTableNames(strDBName);//得到所有表
  391. foreach (DataRow dr in TablesName.Rows)
  392. {
  393. string strTableName = dr[0].ToString();
  394. AppLog.Error("===---===" + strTableName + "GetTableStruct(strTableName, )");
  395. dictTables.Add(strTableName.ToUpper(), GetTableStruct(strTableName, "", ""));
  396. }
  397. }
  398. catch (Exception ex)
  399. {
  400. //发生异常,写入日志
  401. AppLog.Error(ex.Message);
  402. //throw ex;
  403. }
  404. return dictTables;
  405. }
  406. public string GetMaxTimeByTableName(string strSql)
  407. {
  408. string strDateTime = "";
  409. try
  410. {
  411. DataTable dt = MySQLHelper.ExecuteDataSet(strSql).Tables[0];
  412. AppLog.Info($"执行语句获得最晚时间:{strSql}");
  413. if (dt != null && dt.Rows.Count == 1)
  414. {
  415. strDateTime = dt.Rows[0][0].ToString();
  416. AppLog.Info($"执行语句获得最晚时间:行数-({dt.Rows.Count}),列数-({dt.Columns.Count}),值-({strDateTime})");
  417. }
  418. }
  419. catch (Exception ex)
  420. {
  421. if (!LinkCnasTest())
  422. {
  423. strDateTime = "1899-1-1"; //用于表示插入时无法正常数据库连接问题
  424. }
  425. AppLog.Error(ex.Message);
  426. }
  427. return strDateTime;
  428. }
  429. /// <summary>
  430. /// 获取所有数据字段,然后记录其中是否存在需要特殊处理的字段
  431. /// </summary>
  432. /// <returns></returns>
  433. private static Dictionary<string, string> GetSpecialOperaField(string strDBName, string strTableName)
  434. {
  435. Dictionary<string, string> DictFiled = new Dictionary<string, string>();
  436. DataTable dt = new DataTable();
  437. try
  438. {
  439. string sql = string.Format("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='{0}' and table_schema='{1}'", strTableName, strDBName); //查询字符串
  440. dt = MySQLHelper.ExecuteDataSet(sql).Tables[0];
  441. foreach (DataRow dr in dt.Rows)
  442. {
  443. if (dr["data_type"].ToString().ToLower() == "date" || dr["data_type"].ToString().ToLower() == "time")
  444. {
  445. DictFiled.Add(dr["column_name"].ToString(), dr["data_type"].ToString());
  446. }
  447. }
  448. }
  449. catch (Exception ex)
  450. {
  451. //发生异常,写入日志
  452. AppLog.Error(ex.Message);
  453. }
  454. return DictFiled;
  455. }
  456. /// <summary>
  457. /// 获取数据时,单独处理某些(Date和Time)类型数据,并把数据类型转换为字符串类型
  458. /// </summary>
  459. private static DataTable DateAndTimeTypeOpera(DataTable dt, Dictionary<string, string> DictSpecialField)
  460. {
  461. DataTable dtNewFormat = new DataTable();
  462. //添加列
  463. foreach (DataColumn dc in dt.Columns)
  464. {
  465. if (DictSpecialField.ContainsKey(dc.ColumnName))
  466. {
  467. string strDateType = DictSpecialField[dc.ColumnName];
  468. switch (strDateType.ToUpper())
  469. {
  470. case "DATE":
  471. case "TIME":
  472. dtNewFormat.Columns.Add(dc.ColumnName, typeof(string)); //使用字符串来存储该字段,而不是采用它的数据库格式(C#无法区分Date, Time,DateTime,前两种格式会自动补充数据,导致数据的不准确)
  473. break;
  474. default:
  475. dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
  476. break;
  477. }
  478. }
  479. else
  480. {
  481. dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
  482. }
  483. }
  484. //添加数据行
  485. foreach (DataRow dr in dt.Rows)
  486. {
  487. DataRow drNewRow = dtNewFormat.NewRow();
  488. foreach (DataColumn dc in dtNewFormat.Columns)
  489. {
  490. if (!DictSpecialField.ContainsKey(dc.ColumnName))
  491. drNewRow[dc.ColumnName] = dr[dc.ColumnName];
  492. else
  493. {
  494. switch (DictSpecialField[dc.ColumnName].ToUpper())
  495. {
  496. case "DATE":
  497. if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
  498. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd");
  499. break;
  500. case "TIME":
  501. if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
  502. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName].ToString()).ToString("HH:mm:ss");
  503. break;
  504. default:
  505. drNewRow[dc.ColumnName] = dr[dc.ColumnName];
  506. break;
  507. }
  508. }
  509. }
  510. dtNewFormat.Rows.Add(drNewRow);
  511. }
  512. //返回数据
  513. return dtNewFormat;
  514. }
  515. /// <summary>
  516. /// 获取某个表的数据
  517. /// </summary>
  518. /// <param name="strSql"></param>
  519. /// <returns></returns>
  520. public DataTable GetTableData(string strSql)
  521. {
  522. DataTable dt = new DataTable();
  523. try
  524. {
  525. dt = MySQLHelper.ExecuteDataSet(strSql).Tables[0];
  526. }
  527. catch (Exception ex)
  528. {
  529. AppLog.Error(ex.Message);
  530. }
  531. return dt;
  532. }
  533. /// <summary>
  534. /// 插入某个表的数据
  535. /// </summary>
  536. /// <param name="strSql"></param>
  537. /// <returns></returns>
  538. public bool InsertTableData(string strSql)
  539. {
  540. try
  541. {
  542. return MySQLHelper.ExecuteNonQuery(strSql) > 0;
  543. }
  544. catch (Exception ex)
  545. {
  546. AppLog.Error(ex.Message);
  547. }
  548. return false;
  549. }
  550. }
  551. }