using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using CnasSynchronousCommon; using CnasSynchrousModel; using System.Reflection; using Dm; namespace CnasSynchronusDAL { public class DmDAL { public void CreateConnectString(string strIP, string strPort, string strName, string strUser, string strPwd) { DamengHelper.InitConnectionString(strIP, strPort, strName, strUser, strPwd); } public void CreateConnectString(string strConnectString) { DamengHelper.InitConnectionString(strConnectString); } //获取所有表单名称 public DataTable GetTableNames(string strName) { DataTable dt = new DataTable(); //string strSql = string.Format("SELECT table_name as TABNAME FROM user_tables WHERE owner='{0}'", strName); string strSql = string.Format("SELECT table_name as TABNAME FROM user_tables WHERE TABLESPACE_NAME='MAIN'", strName); try { dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } /// /// 获取某表的表结构 /// public DataTable GetTableStruct(string strTableName, string strViewName, string strViewSql) { DataTable dt = new DataTable(); if (strTableName.Length <= 0) return dt; string strSql = ""; if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName)) strSql = strViewSql + " where 0=1"; else strSql = string.Format("SELECT * FROM {1}.{0} Where 0=1", strTableName, DamengHelper.ServerHost.Split('.')[1]); try { dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } /// /// 获取某表的表结构和类型长度 /// public DataTable GetTableTypeAndLenth(string strTableName) { DataTable dt = new DataTable(); 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); try { dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } /// /// 逐行批量插入数据 /// public int InsertCnasData(DataTable dt, List syncParamasInfos, List lstFixedValue, string strInsumentColumn) { int iReturn = 0; if (dt.Rows.Count <= 0) return 0; try { //获取唯一健组(关键字段) var query = from p in syncParamasInfos where p.IfPrimaryKey == true select new { p.TargetField }; List lstKeyColumns = new List(); foreach (var item in query) { lstKeyColumns.Add(item.TargetField); } //构建SQL语句 string strSql_part1 = ""; string strSql_part2 = ""; List lstColumnName = new List(); foreach (var item in syncParamasInfos) { if (!lstColumnName.Contains(item.TargetField.ToLower())) { strSql_part1 += item.TargetField + ","; strSql_part2 += string.Format(":{0},", item.TargetField.ToLower()); lstColumnName.Add(item.TargetField.ToLower()); } } //固定列处理 if (lstFixedValue != null) { foreach (var cnasfield in lstFixedValue) { if (cnasfield.TableName != syncParamasInfos[0].TargetTable) continue; if (!lstColumnName.Contains(cnasfield.ColumnName.ToLower())) { strSql_part1 += cnasfield.ColumnName + ","; strSql_part2 += string.Format(":{0},", cnasfield.ColumnName.ToLower()); lstColumnName.Add(cnasfield.ColumnName.ToLower()); } } } //增加仪器编号数据 if (!string.IsNullOrWhiteSpace(strInsumentColumn) && !lstColumnName.Contains(strInsumentColumn.ToLower())) { strSql_part1 += strInsumentColumn + ","; strSql_part2 += string.Format(":{0},", strInsumentColumn); lstColumnName.Add(strInsumentColumn.ToLower()); } 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)); string strUpdateSql = ""; DataTable dtSelect = new DataTable(); foreach (DataRow dr in dt.Rows) { //插入参数值 DmParameter[] parameters = new DmParameter[lstColumnName.Count]; int i = 0; foreach (var item in lstColumnName) { parameters[i++] = new DmParameter(item, dr[item]); } //检查是否存在数据 int ifHavaValue = ExistSingleCnasData(lstKeyColumns, syncParamasInfos[0].TargetTable, dr, ref dtSelect); if (ifHavaValue == 1) { if (dtSelect.Rows.Count == 1) { //比对数据是否一致 if (!CompareObjectOperation.DataRowCompare(dtSelect.Rows[0], dr, lstColumnName)) { //构造更新语句 strUpdateSql = GetUpdateSql(lstColumnName, lstKeyColumns, syncParamasInfos[0].TargetTable, dr); //执行UpdateSql语句 iReturn += DamengHelper.ExecuteNonQuery(strUpdateSql, parameters); } else { iReturn = -2; AppLog.Info("更新时发现在数据库中相同关键字段数据一致。"); } } else { AppLog.Error("更新时发现在数据库中多条相同关键字段数据,请重新配置关键字段。"); } } else if (ifHavaValue == 0) { //执行InsertSQL语句 iReturn += DamengHelper.ExecuteNonQuery(strInsertSql, parameters); } } } catch (Exception ex) { if (!LinkCnasTest()) { iReturn = -1; //用于表示插入时无法正常数据库连接问题 } AppLog.Error(ex.Message); } return iReturn; } /// /// 拼接Update语句 /// private string GetUpdateSql(List lstColumnName, List lstPrimaryColumn, string strTableName, DataRow dr) { //构造关键字段条件 string strsql_partial = ""; foreach (var item in lstPrimaryColumn) { if (dr.Table.Columns.Contains(item.ToString())) if (dr[item.ToString()].ToString() != "") strsql_partial += $"{item.ToString()}='{dr[item.ToString()].ToString()}' and "; else strsql_partial += $"({item.ToString()}='{dr[item.ToString()].ToString()}' or {item.ToString()} is null) and "; } //构造Update语句 string strUpdateSql = ""; string strsql_partial2 = ""; foreach (var item in lstColumnName) { strsql_partial2 += $"{item}=:{item},"; } if (strsql_partial.Length > 3 && strsql_partial2.Length > 0) strUpdateSql = $"update {strTableName} set {strsql_partial2.Substring(0, strsql_partial2.Length - 1)} where {strsql_partial.Substring(0, strsql_partial.Length - 4)}"; return strUpdateSql; } /// /// 是否数据库中已经存在数据 /// private int ExistSingleCnasData(List lstPrimaryColumn, string strTableName, DataRow dr, ref DataTable dtSelect) { int bIfHaveValue = 0; string strsql_partial = ""; string strSql = ""; foreach (var item in lstPrimaryColumn) { if (dr.Table.Columns.Contains(item.ToString())) if (dr[item.ToString()].ToString() != "") strsql_partial += $"{item.ToString()}='{dr[item.ToString()].ToString()}' and "; else strsql_partial += $"({item.ToString()}='{dr[item.ToString()].ToString()}' or {item.ToString()} is null) and "; } if (strsql_partial.Length > 3) strSql = $"select * from {strTableName} where {strsql_partial.Substring(0, strsql_partial.Length - 4)}"; if (strSql != "") { DataTable dt = DamengHelper.ExecuteDataTable(strSql, new DmParameter[] { }); if (dt != null && dt.Rows.Count > 0) { bIfHaveValue = 1; dtSelect = dt; AppLog.Info($"插入前查询时存在重复数据:{strSql}"); } else if (dt == null) { bIfHaveValue = -1; AppLog.Info($"插入前查询时发生了异常:{strSql}"); } } return bIfHaveValue; } public bool LinkCnasTest() { return DamengHelper.TestConnectDameng(); } /// /// 获得表中该列中最大时间 /// public string GetMaxTimeByTableName(string strTableName, string strDateColumn, string strInstrumentColumn, string strInstrumentValue) { string strReturnTime = ""; try { string strSql = $"SELECT TO_CHAR(MAX({strDateColumn}), 'YYYY-MM-DD HH24:MI:SS') FROM {strTableName}"; if (!string.IsNullOrWhiteSpace(strInstrumentColumn) && !string.IsNullOrWhiteSpace(strInstrumentValue)) strSql += $" WHERE {strInstrumentColumn}='{strInstrumentValue}'"; string strDateTime = GetMaxTimeByTableName(strSql); DateTime dateTime = DateTime.Now; if (DateTime.TryParse(strDateTime, out dateTime)) { strReturnTime = strDateTime; } } catch (Exception ex) { strReturnTime = "1899-1-1"; AppLog.Error(ex.Message); } return strReturnTime; } internal DataTable GetDataByDateColumn(string strDBName, string strViewName, string strViewSql, string strTableName, string strDateColumn, string strDate) { DataTable dtReturn = new DataTable(); try { string strSql = ""; if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName)) strSql = strViewSql + $" where {strDateColumn} > TO_DATE('{strDate}', 'YYYY-MM-DD HH24:MI:SS')"; else strSql = $"select * from {DamengHelper.ServerHost.Split('.')[1]}.{strTableName} where {strDateColumn} > TO_DATE('{strDate}', 'YYYY-MM-DD HH24:MI:SS')"; DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; Dictionary dictFiled = GetSpecialOperaField(strDBName, strTableName); if (dictFiled.Count > 0) dtReturn = DateAndTimeTypeOpera(dt, dictFiled); else dtReturn = dt; } catch (Exception ex) { AppLog.Error(ex.Message); throw ex; } return dtReturn; } internal Dictionary GetAllTableNameAndStructure(string strDBName) { Dictionary dictTables = new Dictionary(); try { DataTable TablesName = GetTableNames(strDBName); foreach (DataRow dr in TablesName.Rows) { string strTableName = dr[0].ToString(); dictTables.Add(strTableName.ToUpper(), GetTableStruct(strTableName, "", "")); } } catch (Exception ex) { AppLog.Error(ex.Message); } return dictTables; } private string GetMaxTimeByTableName(string strSql) { string strDateTime = ""; try { DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; if (dt != null && dt.Rows.Count == 1) { strDateTime = dt.Rows[0][0].ToString(); } } catch (Exception ex) { if (!LinkCnasTest()) { strDateTime = "1899-1-1"; } AppLog.Error(ex.Message); } return strDateTime; } /// /// 获取特殊处理字段 /// private Dictionary GetSpecialOperaField(string strDBName, string strTableName) { Dictionary DictFiled = new Dictionary(); try { string sql = $"SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME='{strTableName}'"; DataTable dt = DamengHelper.ExecuteDataSet(sql).Tables[0]; foreach (DataRow dr in dt.Rows) { string dataType = dr["DATA_TYPE"].ToString().ToLower(); if (dataType == "datetime" || dataType == "date" || dataType == "time" || dataType == "timestamp") { DictFiled.Add(dr["COLUMN_NAME"].ToString(), dataType); } } } catch (Exception ex) { AppLog.Error(ex.Message); } return DictFiled; } /// /// 处理日期时间类型数据 /// private DataTable DateAndTimeTypeOpera(DataTable dt, Dictionary DictSpecialField) { DataTable dtNewFormat = new DataTable(); //添加列 foreach (DataColumn dc in dt.Columns) { if (DictSpecialField.ContainsKey(dc.ColumnName)) { string strDateType = DictSpecialField[dc.ColumnName]; switch (strDateType.ToLower()) { case "date": case "time": case "timestamp": dtNewFormat.Columns.Add(dc.ColumnName, typeof(string)); break; default: dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType); break; } } else { dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType); } } //添加数据 foreach (DataRow dr in dt.Rows) { DataRow drNewRow = dtNewFormat.NewRow(); foreach (DataColumn dc in dtNewFormat.Columns) { if (!DictSpecialField.ContainsKey(dc.ColumnName)) drNewRow[dc.ColumnName] = dr[dc.ColumnName]; else { if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "") { switch (DictSpecialField[dc.ColumnName].ToLower()) { case "date": drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd"); break; case "time": drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("HH:mm:ss"); break; case "timestamp": drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss"); break; default: drNewRow[dc.ColumnName] = dr[dc.ColumnName]; break; } } } } dtNewFormat.Rows.Add(drNewRow); } return dtNewFormat; } /// /// 获取表数据 /// public DataTable GetTableData(string strSql) { DataTable dt = new DataTable(); try { dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } /// /// 插入表数据 /// public bool InsertTableData(string strSql) { try { return DamengHelper.ExecuteNonQuery(strSql) > 0; } catch (Exception ex) { AppLog.Error(ex.Message); } return false; } /// /// 根据用户名和密码获取登录名 /// public string GetLoginNameByPwd(string strUser, string strPwd) { string strLoginName = ""; try { string strSql = string.Format("SELECT loginname FROM sys_user WHERE username='{0}' and password='{1}'", strUser, strPwd); DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; if (dt != null && dt.Rows.Count > 0) { strLoginName = dt.Rows[0][0].ToString(); } } catch (Exception ex) { AppLog.Error(ex.Message); } return strLoginName; } /// /// 检查MAC地址信息 /// public bool CheckMacMessage(string strMac) { bool bIfSuccess = false; try { string strSql = string.Format("SELECT * FROM sys_mac WHERE mac='{0}'", strMac); DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; if (dt != null && dt.Rows.Count > 0) { bIfSuccess = true; } } catch (Exception ex) { AppLog.Error(ex.Message); } return bIfSuccess; } /// /// 检查MAC地址信息 /// public bool CheckMacMessage(string strMac, string strUser) { bool bIfSuccess = false; try { string strSql = string.Format("SELECT * FROM sys_mac WHERE mac='{0}' and username='{1}'", strMac, strUser); DataTable dt = DamengHelper.ExecuteDataSet(strSql).Tables[0]; if (dt != null && dt.Rows.Count > 0) { bIfSuccess = true; } } catch (Exception ex) { AppLog.Error(ex.Message); } return bIfSuccess; } } }