using CnasSynchronousCommon; using CnasSynchrousModel; using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace CnasSynchronusDAL { public class OracleDAL { /// /// 数据库连接字符串 /// private static string connectionStr = ""; public static void CreateConnection(string strHost, string strName, string strUserId, string strPwd,string strPort) { //OracleDAL.connectionStr = $"Data Source = {strName}; User Id = {strUserId}; Password = {strPwd}"; OracleDAL.connectionStr= $"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={strHost})(PORT={strPort}))" +$"(CONNECT_DATA=(SID={strName})));User Id={strUserId};Password={strPwd};"; } internal static DataTable GetTableNames(string dBName) { DataTable dt = new DataTable(); string strSql = string.Format("select table_name from user_tab_comments"); try { dt = GetDataTable(strSql, new OracleParameter[] { }); } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } internal static 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.ToUpper()); try { dt = GetDataTable(strSql, new OracleParameter[] { }); } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } public static 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 {0} Where 0=1", strTableName); try { dt = GetDataTable(strSql, new OracleParameter[] { }); } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } internal static DataTable GetLoginNameByPwd(string strUserName, string strPwd) { DataTable dt = new DataTable(); string strSql = string.Format("select * FROM user WHERE userid='{0}' and password='{1}'", strUserName, strPwd); try { dt = GetDataTable(strSql, new OracleParameter[] { }); } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } internal static string GetMaxTimeByTableName(string strTableName, string strDateColumn, string strInstrumentColumn, string strInstrumentValue) { string strReturnTime = ""; //因为数据库用varchar存储日期字段,从而格式不固定,需要使用多种格式读取 try { string strSql = string.Format("SELECT Convert(max(Convert({0},datetime)) using utf8) FROM {1}", strDateColumn, strTableName, strInstrumentColumn, strInstrumentValue); if (!string.IsNullOrWhiteSpace(strInstrumentColumn) && !string.IsNullOrWhiteSpace(strInstrumentValue)) strSql += string.Format(" where {0}='{1}'", strInstrumentColumn, strInstrumentValue); string strDateTime = GetMaxTimeByTableName(strSql); DateTime dateTime = DateTime.Now; if (DateTime.TryParse(strDateTime, out dateTime)) { strReturnTime = strDateTime; } } catch (Exception ex) { //if (!LinkCnasTest()) //{ // strReturnTime = "1899-1-1"; //用于表示插入时无法正常数据库连接问题 //} //只要发生异常,就返回这个结果 strReturnTime = "1899-1-1"; AppLog.Error(ex.Message); } return strReturnTime; } internal static 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()); } } //如果映射列中不包含固定列,则需要将这些列添加到SQL语句中 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) { //插入参数值 OracleParameter[] parameters = new OracleParameter[lstColumnName.Count]; int i = 0; foreach (var item in lstColumnName) { parameters[i++] = new OracleParameter(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 += ExecuteNonQuery(strUpdateSql, parameters); } else { iReturn = -2; AppLog.Info("更新时发现在数据库中相同关键字段数据一致。"); } } else { AppLog.Error("更新时发现在数据库中多条相同关键字段数据,请重新配置关键字段。"); } } else if (ifHavaValue == 0) { //执行InsertSQL语句 iReturn += ExecuteNonQuery(strInsertSql, parameters); } } } catch (Exception ex) { if (!TestLink()) { iReturn = -1; //用于表示插入时无法正常数据库连接问题 } //此处添加错误日志 AppLog.Error(ex.Message); } return iReturn; } /// /// 是否数据库中已经存在数据,如果存在返回1,并且传递返回的数据;如果不存在,返回0;如果发生了异常,返回-1 /// /// /// /// /// /// private static int ExistSingleCnasData(List lstPrimaryColumn, string strTableName, DataRow dr, ref DataTable dtSelect) { int bIfHaveValue = 0; //如果存在,返回1;如果不存在,返回0;如果发生了异常,返回-1 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_partial.Length > 3 && (strTableName.Equals("tcoalweight") || strTableName.Equals("TCOALWEIGHT"))) strSql = $"select * from {strTableName} where (idbatch is null or idbatch = '') and {strsql_partial.Substring(0, strsql_partial.Length - 4)}"; if (strSql != "") { DataTable dt = GetDataTable(strSql, new OracleParameter[] { }); 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; } /// /// 拼接Update语句 /// /// /// /// private static 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 static string GetMaxTimeByTableName(string strSql) { string strDateTime = ""; try { DataTable dt = GetDataTable(strSql, new OracleParameter[] { }); AppLog.Info($"执行语句获得最晚时间:{strSql}"); if (dt != null && dt.Rows.Count == 1) { strDateTime = dt.Rows[0][0].ToString(); AppLog.Info($"执行语句获得最晚时间:行数-({dt.Rows.Count}),列数-({dt.Columns.Count}),值-({strDateTime})"); } } catch (Exception ex) { if (!TestLink()) { strDateTime = "1899-1-1"; //用于表示插入时无法正常数据库连接问题 } AppLog.Error(ex.Message); } return strDateTime; } internal static bool CheckMacMessage(string strMac) { bool bIfChecked = false; string strSql = string.Format("select * FROM macaddress WHERE MAC_ADDRESS='{0}'", strMac); try { DataTable dt = GetDataTable(strSql, new OracleParameter[] { }); if (dt != null && dt.Rows.Count > 0) { bIfChecked = true; } } catch (Exception ex) { AppLog.Error(ex.Message); } return bIfChecked; } /// /// 查询操作 /// /// /// public static DataTable GetDataTable(string sql, params OracleParameter[] sp) { DataTable dt = new DataTable(); try { using (OracleConnection conn = new OracleConnection(connectionStr)) { conn.Open(); //using (OracleDataAdapter sda = new OracleDataAdapter("select * from t_weight_info where WEIGH_DATE > '2019-10-02 14:20:12'", conn)) using (OracleDataAdapter sda = new OracleDataAdapter(sql, conn)) { sda.SelectCommand.Parameters.AddRange(sp); sda.Fill(dt); } } } catch (Exception ex) { AppLog.Error(ex.Message); } return dt; } internal static DataTable GetTableDataStruct(string strViewName,string strViewSQL,string strTableName) { string sql = ""; if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName)) sql = strViewSQL + " where 1=0"; else sql = $"select * from {strTableName} where 1=0"; return GetDataTable(sql, new OracleParameter[] { }); } /// /// 增删改操作 /// /// sql语句 /// 执行后的条数 public static int ExecuteNonQuery(string sql, params OracleParameter[] sp) { using (OracleConnection conn = new OracleConnection(connectionStr)) { conn.Open(); using (OracleCommand cmd = new OracleCommand(sql, conn)) { cmd.Parameters.AddRange(sp); int i = cmd.ExecuteNonQuery(); return i; } } } /// /// 执行一条SQL语句,返回首行首列 /// /// sql语句 /// 首行首列 public static object ExecuteScalar(string sql, params OracleParameter[] sp) { using (OracleConnection conn = new OracleConnection(connectionStr)) { conn.Open(); using (OracleCommand cmd = new OracleCommand(sql, conn)) { cmd.Parameters.AddRange(sp); return cmd.ExecuteScalar(); } } } /// /// 根据表名获取数据 /// /// /// public static DataTable GetDataByTableName(string strTableName) { return GetDataTable($"select * from {strTableName}", new OracleParameter[] { }); } /// /// 根据表名,时间列,时间值,获得表中所有大于该时间的行集合 /// /// /// /// /// public static DataTable GetDataByDateColumn(string strViewName,string strViewSQL,string strTableName, string strColumnName, string strColumnValue) { DataTable dtReturn = new DataTable(); try { string strSql = ""; if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName)) strSql = strViewSQL + $" where {strColumnName}> '{strColumnValue}'"; else strSql = $"select * from {strTableName} where to_char({strColumnName}, 'yyyy-mm-dd hh24:mi:ss') > '{strColumnValue}'"; AppLog.Info(strSql); DataTable dt = GetDataTable(strSql, new OracleParameter[] { }); Dictionary dictFiled = GetSpecialOperaField(strTableName); if (dictFiled.Count > 0) dtReturn = DateAndTimeTypeOpera(dt, dictFiled); else dtReturn = dt; } catch (Exception ex) { //发生异常,写入日志 AppLog.Error(ex.Message); throw ex; } return dtReturn; } public static Dictionary GetAllTableNameAndStructure(string strUserName) { Dictionary dictTables = new Dictionary(); try { string sql = ""; DataTable TablesName = GetDataTable("select table_name from user_tab_comments", new OracleParameter[] { });//得到所有表 //DataTable TablesName = GetDataTable(string.Format("select table_name from user_tables where TABLESPACE_NAME is not null and user='{0}'", strUserName.ToUpper()), new OracleParameter[] { });//得到所有表 DataTable CurrentTable = new DataTable(); foreach (DataRow dr in TablesName.Rows) { string strTableName = dr[0].ToString(); sql = string.Format("SELECT * FROM {0} where 1=0", strTableName); //查询字符串 CurrentTable = GetDataTable(sql, new OracleParameter[] { }); if(CurrentTable!=null&&CurrentTable.Columns.Count>0) dictTables.Add(strTableName.ToUpper(), CurrentTable); } } catch (Exception ex) { //发生异常,写入日志 AppLog.Error(ex.Message); //throw ex; } return dictTables; } public static bool TestLink() { bool bIfSuccess = false; using (OracleConnection conn = new OracleConnection(connectionStr)) { try { conn.Open(); bIfSuccess = true; } catch (Exception ex) { //这里写日志 bIfSuccess = false; AppLog.Error(ex.Message); } } return bIfSuccess; } /// /// 获取所有数据字段,然后记录其中是否存在需要特殊处理的字段 /// /// private static Dictionary GetSpecialOperaField(string strTableName) { Dictionary DictFiled = new Dictionary(); DataTable dt = new DataTable(); try { string sql = string.Format("SELECT * FROM user_tab_columns WHERE TABLE_NAME='{0}'", strTableName.ToUpper()); //查询字符串 dt = GetDataTable(sql, new OracleParameter[] { }); foreach (DataRow dr in dt.Rows) { if (dr["data_type"].ToString().ToLower() == "date" || dr["data_type"].ToString().ToLower() == "time") { DictFiled.Add(dr["column_name"].ToString(), dr["data_type"].ToString()); } } } catch (Exception ex) { //发生异常,写入日志 AppLog.Error(ex.Message); } return DictFiled; } /// /// 获取数据时,单独处理某些(Date和Time)类型数据,并把数据类型转换为字符串类型 /// private static 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.ToUpper()) { case "DATE": case "TIME": dtNewFormat.Columns.Add(dc.ColumnName, typeof(string)); //使用字符串来存储该字段,而不是采用它的数据库格式(C#无法区分Date, Time,DateTime,前两种格式会自动补充数据,导致数据的不准确) 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 { switch (DictSpecialField[dc.ColumnName].ToUpper()) { case "DATE": if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "") drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd"); break; case "TIME": if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "") drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName].ToString()).ToString("HH:mm:ss"); break; default: drNewRow[dc.ColumnName] = dr[dc.ColumnName]; break; } } } dtNewFormat.Rows.Add(drNewRow); } //返回数据 return dtNewFormat; } } }