CNAS取数仪器端升级
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

618 linhas
25KB

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