不是通用的方法,只是提供一個思路。
實體類:
/// <summary> /// 體例數據實體類 /// </summary> public class RulesLayout { /// <summary> /// 體例元數據行業代碼 /// </summary> public string hydm { get; set; } /// <summary> /// 體例元數據行業名稱 /// </summary> public string hymc { get; set; } /// <summary> /// 體例元數據主體代碼 /// </summary> public string ztdm { get; set; } /// <summary> /// 體例元數據主體名稱 /// </summary> public string ztmc { get; set; } /// <summary> /// 體例元數據結構代碼 /// </summary> public string jgdm { get; set; } /// <summary> /// 體例元數據結構名稱 /// </summary> public string jgmc { get; set; } /// <summary> /// 體例元數據結構名稱同義詞 /// </summary> public string jgmctyc { get; set; } /// <summary> /// 體例元數據代碼 /// </summary> public string ysjdm { get; set; } /// <summary> /// 體例元數據名稱 /// </summary> public string ysjmc { get; set; } /// <summary> /// 體例元數據名稱同義詞 /// </summary> public string ysjmctyc { get; set; } /// <summary> /// 屬性 /// </summary> public string sx { get; set; } /// <summary> /// 狀態 /// </summary> public string zt { get; set; } }
數據庫操作類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.OracleClient; using System.Data.OleDb; using System.Windows.Forms; using System.Collections; using System.Data; namespace DbProvider { /// <summary> /// 體例數據操作類 /// </summary> public static class StyleData { public static string constr = " 數據庫連接字符串"; static OracleConnection con=null; static OracleTransaction tran = null; static OracleCommand cmd = null; /// <summary> /// 執行一個sql語句,返回第一個值 /// </summary> /// <param name="sql"></param> /// <returns></returns> public static object GetOneValue(string sql) { using (con = new OracleConnection(constr)) { con.Open(); cmd = new OracleCommand(sql, con); return cmd.ExecuteOracleScalar(); } } /// <summary> /// 執行一個sql語句 /// </summary> /// <param name="sql"></param> public static int ExecSql(string sql) { using (con= new OracleConnection(constr)) { con.Open(); cmd = new OracleCommand(sql, con); return cmd.ExecuteNonQuery(); } } /// <summary> /// 執行sql語句獲取datareader,讀取完畢后,必須關閉datareader /// </summary> /// <param name="sql"></param> /// <returns></returns> public static OracleDataReader GetReader(string sql) { OracleDataReader dr = null; con = new OracleConnection(constr); con.Open(); OracleCommand cmd= new OracleCommand(sql, con); dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); return dr; } /// <summary> /// 在事務中執行多個sql語句 /// </summary> /// <param name="sql"></param> /// <returns></returns> public static bool ExeclSqlList(List<string>sql) { try { con = new OracleConnection(constr); tran = cmd.Transaction; con.Open(); con.BeginTransaction(); foreach (string s in sql) { cmd = new OracleCommand(s, con, tran); cmd.ExecuteNonQuery(); } tran.Commit(); tran.Dispose(); return true; } catch { tran.Rollback(); tran.Dispose(); return false; } } } }
業務實現類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Collections; using System.Data.OleDb; using System.Data.OracleClient; using System.Windows.Forms; using System.Drawing; namespace DbProvider { /// <summary> ///體例元數據業務輔助類 /// </summary> public class StyleDataAssist { /// <summary> /// 創建數據庫輔助表,並把表名添加到t_system_data記錄 /// </summary> /// <returns></returns> public ArrayList CreateSubsidiaryTable() { ArrayList tbl = new ArrayList(); string str = StyleData.GetOneValue("select max(num) from t_system_data").ToString(); int i = 0; if (String.IsNullOrEmpty(str)) { i = 1; } else { i += 1; } string vocation = "t_rvl_style_vocation" + i.ToString(); string main = "t_rvl_style_main" + i.ToString(); string frame = "t_rvl_style_frame" + i.ToString(); string metadata = "t_rvl_style_metadata" + i.ToString(); //創建輔助表 string sqlvoc = "create table " + vocation + " as select * from t_rvl_style_vocation where 1=1"; string sqlmain = "create table " + main + " as select * from t_rvl_style_main where 1=1"; string sqlfrm = "create table " + frame + " as select * from t_rvl_style_frame where 1=1 "; string sqldat = "create table " + metadata + " as select * from t_rvl_style_metadata where 1=1 "; //將輔助表的信息插入到t_system_data表記錄 string names = vocation + "," + main + "," + frame + "," + metadata; string insert = "insert into t_system_data(tablenames,chagetime,num) values('" + names + "','" + DateTime.Now.ToLongDateString() + "'," + i + ")"; List<string> sql = new List<string>(); sql.Add(sqlvoc); sql.Add(sqlmain); sql.Add(sqlfrm); sql.Add(sqldat); if (StyleData.ExeclSqlList(sql)) { tbl.Add(vocation); tbl.Add(main); tbl.Add(frame); tbl.Add(metadata); } return tbl; } /// <summary> /// 從數據庫中獲取體例元數據 /// </summary> /// <param name="where"></param> /// <returns></returns> public List<RulesLayout> GetStyleData(string where) { List<RulesLayout> List = new List<RulesLayout>(); RulesLayout rule = null; StringBuilder sql = new StringBuilder(); sql.Append("select vc.vocation_code as 行業代碼,vc.vocation_name as 行業名稱,"); sql.Append(" main.code as 主體代碼,main.caption as 主體名稱, "); sql.Append(" frame.frame_code as 結構代碼, frame.frame_name as 結構名稱, frame.frame_name_synonyms as 結構名稱同義詞, "); sql.Append("data.code as 元數據代碼, data.caption as 元數據名稱, data.synonyms as 元數據名稱同義詞,"); sql.Append(" data.attribute as 屬性 "); sql.Append(" from t_rvl_style_vocation vc"); sql.Append(" inner join t_rvl_style_main main on vc.vocation_code = main.vocation_code "); sql.Append(" inner join t_rvl_style_frame frame on main.id = frame.main_id "); sql.Append(" inner join t_rvl_style_metadata data on frame.id = data.frame_id where 1=1 "); sql.Append(where); sql.Append(" order by vc.vocation_code "); try { OracleDataReader dr = StyleData.GetReader(sql.ToString()); while (dr.Read()) { rule = new RulesLayout(); rule.hydm = dr["行業代碼"].ToString(); rule.hymc = dr["行業名稱"].ToString(); rule.ztdm = dr["主體代碼"].ToString(); rule.ztmc = dr["主體名稱"].ToString(); rule.jgdm = dr["結構代碼"].ToString(); rule.jgmc = dr["結構名稱"].ToString(); rule.jgmctyc = dr["結構名稱同義詞"].ToString(); rule.ysjdm = dr["元數據代碼"].ToString(); rule.ysjmc = dr["元數據名稱"].ToString(); rule.ysjmctyc = dr["元數據名稱同義詞"].ToString(); rule.sx = dr["屬性"].ToString(); List.Add(rule); } dr.Close(); dr.Dispose(); return List; } catch (Exception ex) { return null; } } /// <summary> /// 讀取excel數據 /// </summary> /// <param name="filename"></param> /// <returns></returns> public List<RulesLayout> ReadExcel(string filename,string where) { List<RulesLayout> List = new List<RulesLayout>(); RulesLayout rule = null; string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties='Excel 8.0;IMEX=1'"; OleDbConnection Conn = new OleDbConnection(strCon); string strCom = "SELECT distinct * FROM [屬性$] where 1=1 "+where; Conn.Open(); OleDbCommand cmd = null; string refmsg = ""; bool result = CheckExcel(Conn, cmd, ref refmsg); if (1 == 1) { cmd = new OleDbCommand(strCom, Conn); OleDbDataReader dr; dr = cmd.ExecuteReader(); while (dr.Read()) { rule = new RulesLayout(); rule.hydm = dr["體例元數據行業代碼"].ToString(); rule.hymc = dr["體例元數據行業名稱"].ToString(); rule.ztdm = dr["體例元數據主體代碼"].ToString(); rule.ztmc = dr["體例元數據主體名稱"].ToString(); rule.jgdm = dr["體例元數據結構代碼"].ToString(); rule.jgmc = dr["體例元數據結構名稱"].ToString(); rule.jgmctyc = dr["體例元數據結構名稱同義詞"].ToString(); rule.ysjdm =dr["體例元數據代碼"].ToString(); rule.ysjmc =dr["體例元數據名稱"].ToString(); rule.ysjmctyc =dr["體例元數據名稱同義詞"].ToString(); rule.sx = dr["屬性"].ToString(); List.Add(rule); } Conn.Close(); Conn.Dispose(); return List; } else { Conn.Close(); Conn.Dispose(); return null; } } /// <summary> /// 檢查excel數據的准確性 /// </summary> /// <param name="con"></param> /// <param name="cmd"></param> /// <param name="msg"></param> /// <returns></returns> private bool CheckExcel(OleDbConnection con, OleDbCommand cmd, ref string msg) { StringBuilder sql = new StringBuilder(); StringBuilder Msg = new StringBuilder(); sql.Append("SELECT * FROM [屬性$] where 體例元數據行業代碼<>'' "); sql.Append("or 體例元數據行業名稱<>'' or 體例元數據主體代碼<>'' "); sql.Append("or 體例元數據主體名稱<>'' or 體例元數據結構代碼<>'' or 體例元數據結構名稱<>''"); cmd = new OleDbCommand(sql.ToString(), con); OleDbDataReader dr; dr = cmd.ExecuteReader(); Msg.Append("excel 數據錯誤:"); if (dr.Read()) { Msg.Append("體例元數據行業代碼:" + dr["體例元數據行業代碼"].ToString()); Msg.Append("體例元數據行業名稱:" + dr["體例元數據行業名稱"].ToString()); Msg.Append("體例元數據主體代碼:" + dr["體例元數據主體代碼"].ToString()); Msg.Append("體例元數據主體名稱:" + dr["體例元數據主體名稱"].ToString()); Msg.Append("體例元數據結構代碼:" + dr["體例元數據結構代碼"].ToString()); Msg.Append("體例元數據結構名稱:" + dr["體例元數據結構名稱"].ToString()); Msg.Append("\r\n"); } if (Msg.ToString() != "excel 數據錯誤:") { msg = Msg.ToString(); return false; } else { msg = ""; return true; } } /// <summary> /// 比較excel的數據和數據庫的數據,獲取差異數據 /// </summary> /// <param name="file">來自文件的數據</param> /// <param name="data">來自數據庫原來的數據</param> /// <returns></returns> public List<RulesLayout> CompareDataList(List<RulesLayout> file, List<RulesLayout> data) { List<RulesLayout> Comp = new List<RulesLayout>(); // List<RulesLayout> datacopy = data; RulesLayout rule ; #region 沒有發生改變的 Comp = GetSameDataInFile(file, data); List<RulesLayout> sameindata = GetSameDataInData(file, data); #endregion // 從file,data里面移除2者相同的數據,減少下方的遍歷次數 foreach (RulesLayout r in Comp) { file.Remove(r); } foreach (RulesLayout r in sameindata) { data.Remove(r); } #region 更改了的 int fnum = file.Count; for (int f = 0; f < fnum; f++) { bool isAdd = true;//是否是新增數據 RulesLayout fuleRule = file[f]; for (int d = 0; d < data.Count; d++) { RulesLayout dataRule = data[d]; bool isquery = (fuleRule.hydm == dataRule.hydm) && (fuleRule.ztdm == dataRule.ztdm) && (fuleRule.jgdm == dataRule.jgdm) && (fuleRule.ysjdm == dataRule.ysjdm); if (isquery) { rule = CompareRule(fuleRule, dataRule); Comp.Add(rule); //發生更改了的數據在原數據庫實體類集合里面刪除 data.RemoveAt(d); isAdd = false; } } if (isAdd) { fuleRule.zt = "新增"; Comp.Add(fuleRule); } } #endregion #region 獲取刪除的數據 var deletedata = data; foreach (RulesLayout r in deletedata) { r.zt = "刪除"; Comp.Add(r); } #endregion return Comp.OrderBy(m => m.zt).ToList(); } /// <summary> /// 獲取修改過的字段信息 /// </summary> /// <param name="file"></param> /// <param name="data"></param> /// <returns></returns> private RulesLayout CompareRule(RulesLayout file, RulesLayout data) { StringBuilder gg = new StringBuilder(); #region 比較2個實體類的每個字段,如果不同,就記錄下字段名字 //並最后更新下來自文本的實體類的狀態屬性 if (file.hydm != data.hydm) { // gg.Append("行業代碼,"); gg.Append("hydm,"); } if (file.hymc != data.hymc) { // gg.Append("行業名稱,"); gg.Append("hymc,"); } if (file.ztdm != data.ztdm) { //gg.Append("主體代碼,"); gg.Append("ztdm,"); } if (file.ztmc != data.ztmc) { //gg.Append("主體名稱,"); gg.Append("ztmc,"); } if (file.jgdm != data.jgdm) { //gg.Append("結構代碼,"); gg.Append("jgdm,"); } if (file.jgmc != data.jgmc) { // gg.Append("結構名稱,"); gg.Append("jgmc,"); } if (file.jgmctyc != data.jgmctyc) { //gg.Append("結構名稱同義詞,"); gg.Append("jgmctyc,"); } if (file.ysjdm != data.ysjdm) { //gg.Append("元數據代碼,"); gg.Append("ysjdm,"); } if (file.ysjmc != data.ysjmc) { //gg.Append("元數據名稱,"); gg.Append("ysjmc,"); } if (file.ysjmctyc != data.ysjmctyc) { // gg.Append("元數據名稱同義詞,"); gg.Append("ysjmctyc,"); } if (file.sx != data.sx) { // gg.Append("屬性,"); gg.Append("sx,"); } #endregion file.zt = gg.Append("修改").ToString(); return file; } /// <summary> /// 獲取File相同的數據 /// </summary> /// <param name="File"></param> /// <param name="Data"></param> /// <returns></returns> private List<RulesLayout> GetSameDataInFile(List<RulesLayout> File, List<RulesLayout> Data) { var same = from f in File join d in Data on new { hydm= f.hydm, hymc=f.hymc, ztdm=f.ztdm, ztmc=f.ztmc, jgdm=f.jgdm, jgmc=f.jgmc, gjmctyc=f.jgmctyc, ysjdm=f.ysjdm, ysjmc=f.ysjmc, ysjmctyc=f.ysjmctyc, sx=f.sx } equals new { hydm = d.hydm, hymc = d.hymc, ztdm = d.ztdm, ztmc = d.ztmc, jgdm = d.jgdm, jgmc = d.jgmc, gjmctyc = d.jgmctyc, ysjdm = d.ysjdm, ysjmc = d.ysjmc, ysjmctyc = d.ysjmctyc, sx = d.sx } select f; return same.ToList(); } /// <summary> /// 獲取File相同的數據 /// </summary> /// <param name="File"></param> /// <param name="Data"></param> /// <returns></returns> private List<RulesLayout> GetSameDataInData(List<RulesLayout> File, List<RulesLayout> Data) { var same = from f in File join d in Data on new { hydm = f.hydm, hymc = f.hymc, ztdm = f.ztdm, ztmc = f.ztmc, jgdm = f.jgdm, jgmc = f.jgmc, gjmctyc = f.jgmctyc, ysjdm = f.ysjdm, ysjmc = f.ysjmc, ysjmctyc = f.ysjmctyc, sx = f.sx } equals new { hydm = d.hydm, hymc = d.hymc, ztdm = d.ztdm, ztmc = d.ztmc, jgdm = d.jgdm, jgmc = d.jgmc, gjmctyc = d.jgmctyc, ysjdm = d.ysjdm, ysjmc = d.ysjmc, ysjmctyc = d.ysjmctyc, sx = d.sx } select d; return same.ToList(); } /// <summary> /// datagridview變色並且發生改變的數據在ToolTipText中顯示出改變前的 /// </summary> public void DataGridViewAddColor(DataGridView dataGridView1) { string contr = StyleData.constr; using (OracleConnection con = new OracleConnection(contr)) { con.Open(); OracleCommand cmd = null; int count = dataGridView1.RowCount; #region 遍歷改色賦值 for (int i = 0; i < count; i++) { if (dataGridView1.Rows[i].Cells["zt"].Value != null) { string statue = dataGridView1.Rows[i].Cells["zt"].Value.ToString(); if (statue == "新增") { dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Yellow; } else if (statue == "刪除") { dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Red; } else { string[] cells = statue.Split(','); for (int a = 0; a < cells.Length - 1; a++) { dataGridView1.Rows[i].Cells[cells[a]].Style.BackColor = Color.Green; cmd = new OracleCommand(GetAlterSql(cells[a]), con); cmd.Parameters.Add(":hydm", OracleType.NVarChar); cmd.Parameters.Add(":ztdm", OracleType.NVarChar); cmd.Parameters.Add(":jgdm", OracleType.NVarChar); cmd.Parameters.Add(":ysjdm", OracleType.NVarChar); cmd.Parameters[":hydm"].Value=dataGridView1.Rows[i].Cells["hydm"].Value; cmd.Parameters[":ztdm"].Value = dataGridView1.Rows[i].Cells["ztdm"].Value; cmd.Parameters[":jgdm"].Value = dataGridView1.Rows[i].Cells["jgdm"].Value; cmd.Parameters[":ysjdm"].Value = dataGridView1.Rows[i].Cells["ysjdm"].Value; dataGridView1.Rows[i].Cells[cells[a]].ToolTipText ="數據庫原值:\r\n" +cmd.ExecuteScalar().ToString(); } } } } #endregion con.Close(); } } public string GetAlterSql(string column) { StringBuilder sql = new StringBuilder(); sql.Append("select "); switch (column) { case "hymc": sql.Append("vc.vocation_code "); break; case "ztmc": sql.Append(" main.caption "); break; case "jgmc": sql.Append(" frame.frame_name "); break; case "jgmctyc": sql.Append(" frame.frame_name_synonyms "); break; case "ysjmc": sql.Append(" data.caption "); break; case "ysjmctyc": sql.Append(" data.synonyms "); break; case "sx": sql.Append(" data.attribute "); break; default: return "未知錯誤"; } sql.Append(" from t_rvl_style_vocation vc"); sql.Append(" inner join t_rvl_style_main main on vc.vocation_code = main.vocation_code "); sql.Append(" inner join t_rvl_style_frame frame on main.id = frame.main_id "); sql.Append(" inner join t_rvl_style_metadata data on frame.id = data.frame_id where "); sql.Append(" vc.vocation_code=:hydm and main.code =:ztdm and frame.frame_code=:jgdm "); sql.Append(" and data.code=:ysjdm "); return sql.ToString(); } } }