|
- 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
- {
- /// <summary>
- /// 数据库连接字符串
- /// </summary>
- 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<SyncParamasInfo> syncParamasInfos, List<CnasConditionMapValue> 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<string> lstKeyColumns = new List<string>();
- foreach (var item in query)
- {
- lstKeyColumns.Add(item.TargetField);
- }
-
- //构建SQL语句
- string strSql_part1 = "";
- string strSql_part2 = "";
- List<string> lstColumnName = new List<string>();
- 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;
- }
- /// <summary>
- /// 是否数据库中已经存在数据,如果存在返回1,并且传递返回的数据;如果不存在,返回0;如果发生了异常,返回-1
- /// </summary>
- /// <param name="lstPrimaryColumn"></param>
- /// <param name="strTableName"></param>
- /// <param name="dr"></param>
- /// <param name="dtSelect"></param>
- /// <returns></returns>
- private static int ExistSingleCnasData(List<string> 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;
- }
- /// <summary>
- /// 拼接Update语句
- /// </summary>
- /// <param name="lstColumnName"></param>
- /// <param name="lstPrimaryColumn"></param>
- /// <param name="dr"></param>
- private static string GetUpdateSql(List<string> lstColumnName, List<string> 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;
- }
-
- /// <summary>
- /// 查询操作
- /// </summary>
- /// <param name="sql"></param>
- /// <returns></returns>
- 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[] { });
- }
-
- /// <summary>
- /// 增删改操作
- /// </summary>
- /// <param name="sql">sql语句</param>
- /// <returns>执行后的条数</returns>
- 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;
- }
- }
- }
- /// <summary>
- /// 执行一条SQL语句,返回首行首列
- /// </summary>
- /// <param name="sql">sql语句</param>
- /// <returns>首行首列</returns>
- 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();
- }
- }
- }
-
- /// <summary>
- /// 根据表名获取数据
- /// </summary>
- /// <param name="strTableName"></param>
- /// <returns></returns>
- public static DataTable GetDataByTableName(string strTableName)
- {
- return GetDataTable($"select * from {strTableName}", new OracleParameter[] { });
- }
-
- /// <summary>
- /// 根据表名,时间列,时间值,获得表中所有大于该时间的行集合
- /// </summary>
- /// <param name="strTableName"></param>
- /// <param name="strColumnName"></param>
- /// <param name="strColumnValue"></param>
- /// <returns></returns>
- 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<string, string> 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<string, DataTable> GetAllTableNameAndStructure(string strUserName)
- {
- Dictionary<string, DataTable> dictTables = new Dictionary<string, DataTable>();
- 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;
- }
-
-
-
- /// <summary>
- /// 获取所有数据字段,然后记录其中是否存在需要特殊处理的字段
- /// </summary>
- /// <returns></returns>
- private static Dictionary<string, string> GetSpecialOperaField(string strTableName)
- {
- Dictionary<string, string> DictFiled = new Dictionary<string, string>();
- 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;
- }
-
- /// <summary>
- /// 获取数据时,单独处理某些(Date和Time)类型数据,并把数据类型转换为字符串类型
- /// </summary>
- private static DataTable DateAndTimeTypeOpera(DataTable dt, Dictionary<string, string> 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;
- }
- }
- }
|