CNAS取数仪器端升级
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

571 řádky
21KB

  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 Dm;
  10. namespace CnasSynchronusDAL
  11. {
  12. public class DmDAL
  13. {
  14. public void CreateConnectString(string strIP, string strPort, string strName, string strUser, string strPwd)
  15. {
  16. DamengHelper.InitConnectionString(strIP, strPort, strName, strUser, strPwd);
  17. }
  18. public void CreateConnectString(string strConnectString)
  19. {
  20. DamengHelper.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 user_tables WHERE owner='{0}'", strName);
  27. try
  28. {
  29. dt = DamengHelper.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. public DataTable GetTableStruct(string strTableName, string strViewName, string strViewSql)
  41. {
  42. DataTable dt = new DataTable();
  43. if (strTableName.Length <= 0) return dt;
  44. string strSql = "";
  45. if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
  46. strSql = strViewSql + " where 0=1";
  47. else
  48. strSql = string.Format("SELECT * FROM {0} Where 0=1", strTableName);
  49. try
  50. {
  51. dt = DamengHelper.ExecuteDataSet(strSql).Tables[0];
  52. }
  53. catch (Exception ex)
  54. {
  55. AppLog.Error(ex.Message);
  56. }
  57. return dt;
  58. }
  59. /// <summary>
  60. /// 获取某表的表结构和类型长度
  61. /// </summary>
  62. public DataTable GetTableTypeAndLenth(string strTableName)
  63. {
  64. DataTable dt = new DataTable();
  65. string strSql = string.Format(@"SELECT
  66. COLUMN_NAME AS 'ColumnName',
  67. NULLABLE AS 'IsNullable',
  68. DATA_TYPE AS 'DataType',
  69. DATA_LENGTH AS 'CharMaxLenth',
  70. DATA_LENGTH AS 'CharOcterLenth',
  71. DATA_PRECISION AS 'NumericPrecision',
  72. DATA_SCALE AS 'NumericScale'
  73. FROM USER_TAB_COLUMNS
  74. WHERE TABLE_NAME = '{0}'", strTableName);
  75. try
  76. {
  77. dt = DamengHelper.ExecuteDataSet(strSql).Tables[0];
  78. }
  79. catch (Exception ex)
  80. {
  81. AppLog.Error(ex.Message);
  82. }
  83. return dt;
  84. }
  85. /// <summary>
  86. /// 逐行批量插入数据
  87. /// </summary>
  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. //固定列处理
  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})",
  141. syncParamasInfos[0].TargetTable,
  142. strSql_part1.Substring(0, strSql_part1.Length - 1),
  143. strSql_part2.Substring(0, strSql_part2.Length - 1));
  144. string strUpdateSql = "";
  145. DataTable dtSelect = new DataTable();
  146. foreach (DataRow dr in dt.Rows)
  147. {
  148. //插入参数值
  149. DmParameter[] parameters = new DmParameter[lstColumnName.Count];
  150. int i = 0;
  151. foreach (var item in lstColumnName)
  152. {
  153. parameters[i++] = new DmParameter(item, dr[item]);
  154. }
  155. //检查是否存在数据
  156. int ifHavaValue = ExistSingleCnasData(lstKeyColumns, syncParamasInfos[0].TargetTable, dr, ref dtSelect);
  157. if (ifHavaValue == 1)
  158. {
  159. if (dtSelect.Rows.Count == 1)
  160. {
  161. //比对数据是否一致
  162. if (!CompareObjectOperation.DataRowCompare(dtSelect.Rows[0], dr, lstColumnName))
  163. {
  164. //构造更新语句
  165. strUpdateSql = GetUpdateSql(lstColumnName, lstKeyColumns, syncParamasInfos[0].TargetTable, dr);
  166. //执行UpdateSql语句
  167. iReturn += DamengHelper.ExecuteNonQuery(strUpdateSql, parameters);
  168. }
  169. else
  170. {
  171. iReturn = -2;
  172. AppLog.Info("更新时发现在数据库中相同关键字段数据一致。");
  173. }
  174. }
  175. else
  176. {
  177. AppLog.Error("更新时发现在数据库中多条相同关键字段数据,请重新配置关键字段。");
  178. }
  179. }
  180. else if (ifHavaValue == 0)
  181. {
  182. //执行InsertSQL语句
  183. iReturn += DamengHelper.ExecuteNonQuery(strInsertSql, parameters);
  184. }
  185. }
  186. }
  187. catch (Exception ex)
  188. {
  189. if (!LinkCnasTest())
  190. {
  191. iReturn = -1; //用于表示插入时无法正常数据库连接问题
  192. }
  193. AppLog.Error(ex.Message);
  194. }
  195. return iReturn;
  196. }
  197. /// <summary>
  198. /// 拼接Update语句
  199. /// </summary>
  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. /// <summary>
  224. /// 是否数据库中已经存在数据
  225. /// </summary>
  226. private int ExistSingleCnasData(List<string> lstPrimaryColumn, string strTableName, DataRow dr, ref DataTable dtSelect)
  227. {
  228. int bIfHaveValue = 0;
  229. string strsql_partial = "";
  230. string strSql = "";
  231. foreach (var item in lstPrimaryColumn)
  232. {
  233. if (dr.Table.Columns.Contains(item.ToString()))
  234. if (dr[item.ToString()].ToString() != "")
  235. strsql_partial += $"{item.ToString()}='{dr[item.ToString()].ToString()}' and ";
  236. else
  237. strsql_partial += $"({item.ToString()}='{dr[item.ToString()].ToString()}' or {item.ToString()} is null) and ";
  238. }
  239. if (strsql_partial.Length > 3)
  240. strSql = $"select * from {strTableName} where {strsql_partial.Substring(0, strsql_partial.Length - 4)}";
  241. if (strSql != "")
  242. {
  243. DataTable dt = DamengHelper.ExecuteDataTable(strSql, new DmParameter[] { });
  244. if (dt != null && dt.Rows.Count > 0)
  245. {
  246. bIfHaveValue = 1;
  247. dtSelect = dt;
  248. AppLog.Info($"插入前查询时存在重复数据:{strSql}");
  249. }
  250. else if (dt == null)
  251. {
  252. bIfHaveValue = -1;
  253. AppLog.Info($"插入前查询时发生了异常:{strSql}");
  254. }
  255. }
  256. return bIfHaveValue;
  257. }
  258. public bool LinkCnasTest()
  259. {
  260. return DamengHelper.TestConnectDameng();
  261. }
  262. /// <summary>
  263. /// 获得表中该列中最大时间
  264. /// </summary>
  265. public string GetMaxTimeByTableName(string strTableName, string strDateColumn, string strInstrumentColumn, string strInstrumentValue)
  266. {
  267. string strReturnTime = "";
  268. try
  269. {
  270. string strSql = $"SELECT TO_CHAR(MAX({strDateColumn}), 'YYYY-MM-DD HH24:MI:SS') FROM {strTableName}";
  271. if (!string.IsNullOrWhiteSpace(strInstrumentColumn) && !string.IsNullOrWhiteSpace(strInstrumentValue))
  272. strSql += $" WHERE {strInstrumentColumn}='{strInstrumentValue}'";
  273. string strDateTime = GetMaxTimeByTableName(strSql);
  274. DateTime dateTime = DateTime.Now;
  275. if (DateTime.TryParse(strDateTime, out dateTime))
  276. {
  277. strReturnTime = strDateTime;
  278. }
  279. }
  280. catch (Exception ex)
  281. {
  282. strReturnTime = "1899-1-1";
  283. AppLog.Error(ex.Message);
  284. }
  285. return strReturnTime;
  286. }
  287. internal DataTable GetDataByDateColumn(string strDBName, string strViewName, string strViewSql, string strTableName, string strDateColumn, string strDate)
  288. {
  289. DataTable dtReturn = new DataTable();
  290. try
  291. {
  292. string strSql = "";
  293. if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName))
  294. strSql = strViewSql + $" where {strDateColumn} > TO_DATE('{strDate}', 'YYYY-MM-DD HH24:MI:SS')";
  295. else
  296. strSql = $"select * from {strTableName} where {strDateColumn} > TO_DATE('{strDate}', 'YYYY-MM-DD HH24:MI:SS')";
  297. DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0];
  298. Dictionary<string, string> dictFiled = GetSpecialOperaField(strDBName, strTableName);
  299. if (dictFiled.Count > 0)
  300. dtReturn = DateAndTimeTypeOpera(dt, dictFiled);
  301. else
  302. dtReturn = dt;
  303. }
  304. catch (Exception ex)
  305. {
  306. AppLog.Error(ex.Message);
  307. throw ex;
  308. }
  309. return dtReturn;
  310. }
  311. internal Dictionary<string, DataTable> GetAllTableNameAndStructure(string strDBName)
  312. {
  313. Dictionary<string, DataTable> dictTables = new Dictionary<string, DataTable>();
  314. try
  315. {
  316. DataTable TablesName = GetTableNames(strDBName);
  317. foreach (DataRow dr in TablesName.Rows)
  318. {
  319. string strTableName = dr[0].ToString();
  320. dictTables.Add(strTableName.ToUpper(), GetTableStruct(strTableName, "", ""));
  321. }
  322. }
  323. catch (Exception ex)
  324. {
  325. AppLog.Error(ex.Message);
  326. }
  327. return dictTables;
  328. }
  329. private string GetMaxTimeByTableName(string strSql)
  330. {
  331. string strDateTime = "";
  332. try
  333. {
  334. DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0];
  335. if (dt != null && dt.Rows.Count == 1)
  336. {
  337. strDateTime = dt.Rows[0][0].ToString();
  338. }
  339. }
  340. catch (Exception ex)
  341. {
  342. if (!LinkCnasTest())
  343. {
  344. strDateTime = "1899-1-1";
  345. }
  346. AppLog.Error(ex.Message);
  347. }
  348. return strDateTime;
  349. }
  350. /// <summary>
  351. /// 获取特殊处理字段
  352. /// </summary>
  353. private Dictionary<string, string> GetSpecialOperaField(string strDBName, string strTableName)
  354. {
  355. Dictionary<string, string> DictFiled = new Dictionary<string, string>();
  356. try
  357. {
  358. string sql = $"SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME='{strTableName}'";
  359. DataTable dt = DamengHelper.ExecuteDataSet(sql).Tables[0];
  360. foreach (DataRow dr in dt.Rows)
  361. {
  362. string dataType = dr["DATA_TYPE"].ToString().ToLower();
  363. if (dataType == "date" || dataType == "time" || dataType == "timestamp")
  364. {
  365. DictFiled.Add(dr["COLUMN_NAME"].ToString(), dataType);
  366. }
  367. }
  368. }
  369. catch (Exception ex)
  370. {
  371. AppLog.Error(ex.Message);
  372. }
  373. return DictFiled;
  374. }
  375. /// <summary>
  376. /// 处理日期时间类型数据
  377. /// </summary>
  378. private DataTable DateAndTimeTypeOpera(DataTable dt, Dictionary<string, string> DictSpecialField)
  379. {
  380. DataTable dtNewFormat = new DataTable();
  381. //添加列
  382. foreach (DataColumn dc in dt.Columns)
  383. {
  384. if (DictSpecialField.ContainsKey(dc.ColumnName))
  385. {
  386. string strDateType = DictSpecialField[dc.ColumnName];
  387. switch (strDateType.ToLower())
  388. {
  389. case "date":
  390. case "time":
  391. case "timestamp":
  392. dtNewFormat.Columns.Add(dc.ColumnName, typeof(string));
  393. break;
  394. default:
  395. dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
  396. break;
  397. }
  398. }
  399. else
  400. {
  401. dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType);
  402. }
  403. }
  404. //添加数据
  405. foreach (DataRow dr in dt.Rows)
  406. {
  407. DataRow drNewRow = dtNewFormat.NewRow();
  408. foreach (DataColumn dc in dtNewFormat.Columns)
  409. {
  410. if (!DictSpecialField.ContainsKey(dc.ColumnName))
  411. drNewRow[dc.ColumnName] = dr[dc.ColumnName];
  412. else
  413. {
  414. if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "")
  415. {
  416. switch (DictSpecialField[dc.ColumnName].ToLower())
  417. {
  418. case "date":
  419. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd");
  420. break;
  421. case "time":
  422. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("HH:mm:ss");
  423. break;
  424. case "timestamp":
  425. drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss");
  426. break;
  427. default:
  428. drNewRow[dc.ColumnName] = dr[dc.ColumnName];
  429. break;
  430. }
  431. }
  432. }
  433. }
  434. dtNewFormat.Rows.Add(drNewRow);
  435. }
  436. return dtNewFormat;
  437. }
  438. /// <summary>
  439. /// 获取表数据
  440. /// </summary>
  441. public DataTable GetTableData(string strSql)
  442. {
  443. DataTable dt = new DataTable();
  444. try
  445. {
  446. dt = DamengHelper.ExecuteDataSet(strSql).Tables[0];
  447. }
  448. catch (Exception ex)
  449. {
  450. AppLog.Error(ex.Message);
  451. }
  452. return dt;
  453. }
  454. /// <summary>
  455. /// 插入表数据
  456. /// </summary>
  457. public bool InsertTableData(string strSql)
  458. {
  459. try
  460. {
  461. return DamengHelper.ExecuteNonQuery(strSql) > 0;
  462. }
  463. catch (Exception ex)
  464. {
  465. AppLog.Error(ex.Message);
  466. }
  467. return false;
  468. }
  469. /// <summary>
  470. /// 根据用户名和密码获取登录名
  471. /// </summary>
  472. public string GetLoginNameByPwd(string strUser, string strPwd)
  473. {
  474. string strLoginName = "";
  475. try
  476. {
  477. string strSql = string.Format("SELECT loginname FROM sys_user WHERE username='{0}' and password='{1}'", strUser, strPwd);
  478. DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0];
  479. if (dt != null && dt.Rows.Count > 0)
  480. {
  481. strLoginName = dt.Rows[0][0].ToString();
  482. }
  483. }
  484. catch (Exception ex)
  485. {
  486. AppLog.Error(ex.Message);
  487. }
  488. return strLoginName;
  489. }
  490. /// <summary>
  491. /// 检查MAC地址信息
  492. /// </summary>
  493. public bool CheckMacMessage(string strMac)
  494. {
  495. bool bIfSuccess = false;
  496. try
  497. {
  498. string strSql = string.Format("SELECT * FROM sys_mac WHERE mac='{0}'", strMac);
  499. DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0];
  500. if (dt != null && dt.Rows.Count > 0)
  501. {
  502. bIfSuccess = true;
  503. }
  504. }
  505. catch (Exception ex)
  506. {
  507. AppLog.Error(ex.Message);
  508. }
  509. return bIfSuccess;
  510. }
  511. /// <summary>
  512. /// 检查MAC地址信息
  513. /// </summary>
  514. public bool CheckMacMessage(string strMac, string strUser)
  515. {
  516. bool bIfSuccess = false;
  517. try
  518. {
  519. string strSql = string.Format("SELECT * FROM sys_mac WHERE mac='{0}' and username='{1}'", strMac, strUser);
  520. DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0];
  521. if (dt != null && dt.Rows.Count > 0)
  522. {
  523. bIfSuccess = true;
  524. }
  525. }
  526. catch (Exception ex)
  527. {
  528. AppLog.Error(ex.Message);
  529. }
  530. return bIfSuccess;
  531. }
  532. }
  533. }