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;
}
}
}