using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using CnasSynchronousCommon;
using CnasSynchrousModel;
namespace CnasSynchronusDAL
{
public class SQLDB2DAL
{
public void CreateConnectString(string strHost, string strName, string strUser, string strPwd)
{
SQLDB2Helper.createConnectString(strHost, strName, strUser, strPwd);
}
//获取所有表单名称
public DataTable GetTableNames(string strUser)
{
DataTable dt = new DataTable();
string strSql = string.Format("SELECT TABNAME FROM SYSCAT.TABLES Where TABSCHEMA = '{0}'",strUser);
try
{
dt= SQLDB2Helper.getDB2Table(strSql);
}
catch (Exception ex)
{
AppLog.Error(ex.Message);
}
return dt;
}
///
/// 获取某表的表结构
///
///
///
public DataTable GetTableStruct(string strTableName)
{
DataTable dt = new DataTable();
string strSql = string.Format("SELECT * FROM {0} Where 1=0", strTableName);
try
{
dt = SQLDB2Helper.getDB2Table(strSql);
}
catch (Exception ex)
{
AppLog.Error(ex.Message);
}
return dt;
}
///
/// 逐行批量插入数据
///
///
///
public int InsertCnasData(DataTable dt, List syncParamasInfos, string strInsturmentColumn,List lstFixedValue)
{
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)
{
strSql_part1 += item.TargetField + ",";
strSql_part2 += "?,";
lstColumnName.Add(item.TargetField);
//如果映射列中包含固定值列,则不用再继续处理
if (lstFixedValue != null)
{
var fixedvalue = lstFixedValue.Where(x => x.ColumnName == item.TargetField && x.TableName == item.TargetTable).ToList();
if (fixedvalue.Count() > 0)
{
foreach (var cnasfield in fixedvalue)
lstFixedValue.Remove(cnasfield);
}
}
}
//如果映射列中不包含固定列,则需要将这些列添加到SQL语句中
if (lstFixedValue != null)
{
foreach (var cnasfield in lstFixedValue)
{
if (cnasfield.TableName != syncParamasInfos[0].TargetTable) continue;
strSql_part1 += cnasfield.ColumnName + ",";
strSql_part2 += string.Format("@{0},", cnasfield.ColumnName);
lstColumnName.Add(cnasfield.ColumnName);
}
}
//增加仪器编号数据
if (!lstColumnName.Contains(strInsturmentColumn))
{
strSql_part1 += strInsturmentColumn + ",";
strSql_part2 += string.Format("@{0},", strInsturmentColumn);
lstColumnName.Add(strInsturmentColumn);
}
string strSql = 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));
foreach (DataRow dr in dt.Rows)
{
//插入时发现已经在数据库中存在该值,则不进行进行插入
if (ExistSingleCnasData(lstKeyColumns, syncParamasInfos[0].TargetTable, dr))
{
iReturn = 1;
continue;
}
OleDbParameter[] parameters = new OleDbParameter[syncParamasInfos.Count];
int i = 0;
foreach (var item in lstColumnName)
{
parameters[i++] = new OleDbParameter(item, dr[item]);
}
//执行SQL语句
iReturn += SQLDB2Helper.ExequeryDB2Table(strSql, parameters);
}
}
catch (Exception ex)
{
//此处添加错误日志
AppLog.Error(ex.Message);
}
return iReturn;
}
public bool LinkCnasTest()
{
return SQLDB2Helper.TestCnasLink();
}
internal DataTable GetTableTypeAndLenth(string strUserId,string strTableName)
{
DataTable dt = new DataTable();
//string strSql = string.Format("select COLUMN_NAME AS 'ColumnName',IS_NULLABLE AS 'IsNullable',DATA_TYPE AS 'DataType',CHARACTER_MAXIMUM_LENGTH AS 'CharMaxLenth',CHARACTER_OCTET_LENGTH AS 'CharOcterLenth',NUMERIC_PRECISION AS 'NumericPrecision',NUMERIC_SCALE AS 'NumericScale' FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE '{0}'", strTableName);
string strSql = string.Format("SELECT NAME AS ColumnName,NULLS AS IsNullable,COLTYPE AS DataType,LENGTH AS CharMaxLenth,LONGLENGTH AS CharOcterLenth,LENGTH AS NumericPrecision,SCALE AS NumericScale FROM SYSIBM.SYSCOLUMNS WHERE TBCREATOR = '{0}' AND TBNAME = '{1}'", strUserId, strTableName);
try
{
dt = SQLDB2Helper.getDB2Table(strSql);
}
catch (Exception ex)
{
AppLog.Error(ex.Message);
}
return dt;
}
public string GetMaxTimeByTableName(string strTableName, string strDateColumn, string strInstrumentColumn, string strInstrumentValue)
{
//string strSql = string.Format("SELECT max(to_date({0},'yyyy-mm-dd hh24:mi:ss')) FROM {1} ", strDateColumn, strTableName);
string strReturnTime = "";
//因为数据库用varchar存储日期字段,从而格式不固定,需要使用多种格式读取
try
{
string strSql_1 = string.Format("SELECT max(to_date({0},'yyyy-mm-dd hh24:mi:ss')) FROM {1} where {2}='{3}'", strDateColumn, strTableName,strInstrumentColumn,strInstrumentValue);
string strSql_2 = string.Format("SELECT max(to_date({0},'yyyy/mm/dd hh24:mi:ss')) FROM {1} where {2}='{3}'", strDateColumn, strTableName, strInstrumentColumn, strInstrumentValue);
string strDateTime_1 = GetMaxTimeByTableName(strSql_1);
string strDateTime_2 = GetMaxTimeByTableName(strSql_2);
List lstTime = new List();
DateTime dateTime_1 = DateTime.Now;
DateTime dateTime_2 = DateTime.Now;
if (DateTime.TryParse(strDateTime_1, out dateTime_1))
{
lstTime.Add(dateTime_1);
}
if (DateTime.TryParse(strDateTime_2, out dateTime_2))
{
if (!lstTime.Contains(dateTime_2))
lstTime.Add(dateTime_2);
}
if (lstTime.Count > 0)
{
strReturnTime = lstTime.Max().ToString();
}
}
catch (Exception ex)
{
AppLog.Error(ex.Message);
}
return strReturnTime;
}
public string GetMaxTimeByTableName(string strSql)
{
string strDateTime = "";
try
{
DataTable dt = SQLDB2Helper.getDB2Table(strSql);
if (dt != null && dt.Rows.Count == 1)
{
strDateTime = dt.Rows[0][0].ToString();
}
}
catch (Exception ex)
{
AppLog.Error(ex.Message);
}
return strDateTime;
}
internal DataTable GetLoginNameByPwd(string strUserName, string strPwd)
{
DataTable dt = new DataTable();
//SELECT max(to_date(TEST_DATE,'yyyy-mm-dd hh24:mi:ss')) FROM ASHEXAMINERECORD
string strSql = string.Format("select * FROM user WHERE username='{0}' and password='{1}'", strUserName, strPwd);
try
{
dt = SQLDB2Helper.getDB2Table(strSql);
}
catch (Exception ex)
{
AppLog.Error(ex.Message);
}
return dt;
}
internal bool GetLoginNameByPwd(string strMac)
{
bool bIfChecked = false;
string strSql = string.Format("select * FROM macaddress WHERE MAC_ADDRESS='{0}'", strMac);
try
{
DataTable dt = SQLDB2Helper.getDB2Table(strSql);
if (dt != null && dt.Rows.Count > 0)
{
bIfChecked = true;
}
}
catch (Exception ex)
{
AppLog.Error(ex.Message);
}
return bIfChecked;
}
private bool ExistSingleCnasData(List lstPrimaryColumn, string strTableName,DataRow dr)
{
bool bIfHaveValue = false;
string strsql_partial = "";
string strSql = "";
foreach (var item in lstPrimaryColumn)
{
if(dr.Table.Columns.Contains(item.ToString()))
strsql_partial += $"{item.ToString()}='{dr[item.ToString()].ToString()}' and ";
}
if(strsql_partial.Length>3)
strSql = $"select * from {strTableName} where {strsql_partial.Substring(0, strsql_partial.Length - 4)}";
if (strSql != "")
{
DataTable dt = SQLDB2Helper.getDB2Table(strSql);
if (dt != null && dt.Rows.Count > 0)
bIfHaveValue = true;
}
return bIfHaveValue;
}
}
}