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.

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