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 line
25KB

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