using CnasSynchronousCommon; using Oracle.ManagedDataAccess.Client; //using Oracle.DataAccess.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};"; } /// /// 查询操作 /// /// /// 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 INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='{0}'", strTableName); //查询字符串 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; } } }