CNAS取数仪器端升级
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

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