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.Trim().ToUpper()); 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("?,"); lstColumnName.Add(strInsturmentColumn); } 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) { //插入参数值 OleDbParameter[] parameters = new OleDbParameter[lstColumnName.Count]; int i = 0; foreach (var item in lstColumnName) { parameters[i++] = new OleDbParameter(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 += SQLDB2Helper.ExequeryDB2Table(strUpdateSql, parameters); } else { iReturn = -2; AppLog.Info("更新时发现在数据库中相同关键字段数据一致。"); } } else { AppLog.Error("更新时发现在数据库中多条相同关键字段数据,请重新配置关键字段。"); } } else if (ifHavaValue == 0) { //执行InsertSQL语句 iReturn += SQLDB2Helper.ExequeryDB2Table(strInsertSql, 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.Trim().ToUpper(), strTableName.ToUpper()); 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; } /// /// 是否数据库中已经存在数据,如果存在返回1,并且传递返回的数据;如果不存在,返回0;如果发生了异常,返回-1 /// /// /// /// /// /// private 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 != "") { DataTable dt = SQLDB2Helper.getDB2Table(strSql); 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语句 /// /// /// /// public 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; } } }