using CnasSynchronousCommon; using CnasSynchrousModel; using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.Linq; using System.Text; namespace CnasSynchronusDAL { public static class FoxProDAL { /// /// 获取所有表名和表结构 /// /// /// public static Dictionary ReadFoxProTables(FoxProOpenParams t) { Dictionary dictTables = new Dictionary(); try { //连接字符串 string connstring = string.Format("provider=VFPOLEDB.1;Source Type=DBF;data source={0};user id=admin;password={1}", t.StrPath,t.StrPwd); using (OleDbConnection conn = new OleDbConnection(connstring)) { conn.Open(); DataTable TablesName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字 string sql = ""; OleDbDataAdapter ada = null; foreach (DataRow dr in TablesName.Rows) { string strTableName = dr[2].ToString(); sql = string.Format("SELECT * FROM [{0}] where 1=0", strTableName); //查询字符串 ada = new OleDbDataAdapter(sql, connstring); DataSet set = new DataSet(); ada.Fill(set); DataTable dt = set.Tables[0]; if (!string.IsNullOrWhiteSpace(t.specialMethod.Method)) { switch (t.specialMethod.Method.ToLower()) { case "comcat": //合并某几个列,指定为某特定名称的列 dt = FoxProSpecialDtMethod.FoxProSpecialDtMethodForComcat(dt, t.specialMethod.Value); break; } } dictTables.Add(strTableName.ToUpper(), dt); } } } catch (Exception ex) { //发生异常,写入日志 AppLog.Error(ex.Message); } return dictTables; } internal static DataTable ReadFoxProTableStruct(FoxProOpenParams t, ConditionParams u) { DataTable dt = new DataTable(); try { //连接字符串 string connstring = string.Format("provider=VFPOLEDB.1;Source Type=DBF;data source={0};user id=admin;password={1}", t.StrPath, t.StrPwd); using (OleDbConnection conn = new OleDbConnection(connstring)) { conn.Open(); string sql = ""; OleDbDataAdapter ada = null; sql = string.Format("SELECT * FROM [{0}] where 1=0", u.TableName); //查询字符串 ada = new OleDbDataAdapter(sql, connstring); DataSet set = new DataSet(); ada.Fill(set); dt= set.Tables[0]; if (!string.IsNullOrWhiteSpace(t.specialMethod.Method)) { switch (t.specialMethod.Method.ToLower()) { case "comcat": //合并某几个列,指定为某特定名称的列 dt=FoxProSpecialDtMethod.FoxProSpecialDtMethodForComcat(dt, t.specialMethod.Value); break; } } } } catch (Exception ex) { //发生异常,写入日志 AppLog.Error(ex.Message); } return dt; } public static DataTable ReadFoxProTablesByDate(FoxProOpenParams t, ConditionParams u) { DataTable dt = new DataTable(); try { //连接字符串 string connstring = string.Format("provider=VFPOLEDB.1;Source Type=DBF;data source={0};user id=admin;password={1}", t.StrPath, t.StrPwd); using (OleDbConnection conn = new OleDbConnection(connstring)) { conn.Open(); DataTable TablesName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字 string sql = ""; OleDbDataAdapter ada = null; if (!string.IsNullOrWhiteSpace(t.autosql.FoxProViewName)&&!string.IsNullOrWhiteSpace(t.autosql.FoxProViewSql)) sql = t.autosql.FoxProViewSql; else sql = string.Format("select * from [{0}]", u.TableName); //查询字符串 ada = new OleDbDataAdapter(sql, connstring); DataSet set = new DataSet(); ada.Fill(set); dt = set.Tables[0]; if (!string.IsNullOrWhiteSpace(t.specialMethod.Method)) { switch (t.specialMethod.Method.ToLower()) { case "comcat": //合并某几个列,指定为某特定名称的列 dt = FoxProSpecialDtMethod.FoxProSpecialDtMethodForComcat(set.Tables[0], t.specialMethod.Value); break; } } DataTable dt_Middle = dt.Clone(); DateTime dtTime = DateTime.Now; foreach (DataRow dr in dt.Rows) { if (DateTime.TryParse(dr[u.DateColumn].ToString(), out dtTime)) { if (dtTime > Convert.ToDateTime(u.DateValue)) { DataRow drNew = dt_Middle.NewRow(); drNew.ItemArray = dr.ItemArray; dt_Middle.Rows.Add(drNew); } } else if (IfSepcialDateFormat(dr[u.DateColumn].ToString(),t.timeFormat,ref dtTime)) { if (dtTime > Convert.ToDateTime(u.DateValue)) { DataRow drNew = dt_Middle.NewRow(); drNew.ItemArray = dr.ItemArray; dt_Middle.Rows.Add(drNew); } } } dt = DateAndTimeTypeOpera(dt_Middle); } } catch (Exception ex) { //发生异常,写入日志 AppLog.Error(ex.Message); } return dt; } public static bool IfSepcialDateFormat(string strValue,string strTimeFormat,ref DateTime dtTime) { bool bIfTrue = true; try { dtTime = DateTime.ParseExact(strValue.Trim(), strTimeFormat, new System.Globalization.CultureInfo("zh-CN", true)); } catch (Exception e) { bIfTrue = false; AppLog.Error(e.Message); } return bIfTrue; } public static DataTable ReadFoxProTablesByTableName(string strPath, string strUser, string strPwd, string strViewName,string strViewSql,string strTableName) { DataSet set = new DataSet(); try { //连接字符串 string connstring = string.Format("provider=VFPOLEDB.1;Source Type=DBF;data source={0};user id=admin;password={1}", strPath, strPwd); using (OleDbConnection conn = new OleDbConnection(connstring)) { conn.Open(); DataTable TablesName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字 string sql = ""; OleDbDataAdapter ada = null; if (strViewName == strTableName && !string.IsNullOrWhiteSpace(strViewName)) sql = strViewSql; else sql = string.Format("SELECT * FROM [{0}]", strTableName); //查询字符串 ada = new OleDbDataAdapter(sql, connstring); ada.Fill(set); } } catch (Exception ex) { //发生异常,写入日志 AppLog.Error(ex.Message); } return set.Tables[0]; } /// /// 获取数据时,单独处理某些(Date和Time)类型数据,并把数据类型转换为字符串类型 /// private static DataTable DateAndTimeTypeOpera(DataTable dt) { DataTable dtNewFormat = new DataTable(); List lstChangeColumn = new List(); //添加列 foreach (DataColumn dc in dt.Columns) { string strDateType = dc.DataType.ToString(); switch (strDateType.ToUpper()) { case "SYSTEM.DATETIME": dtNewFormat.Columns.Add(dc.ColumnName, typeof(string)); //使用字符串来存储该字段,而不是采用它的数据库格式(C#无法区分Date, Time,DateTime,前两种格式会自动补充数据,导致数据的不准确) lstChangeColumn.Add(dc.ColumnName); break; default: dtNewFormat.Columns.Add(dc.ColumnName, dc.DataType); break; } } //添加数据行 foreach (DataRow dr in dt.Rows) { DataRow drNewRow = dtNewFormat.NewRow(); foreach (DataColumn dc in dtNewFormat.Columns) { if (lstChangeColumn.Contains(dc.ColumnName)) { if (dr[dc.ColumnName] != null && dr[dc.ColumnName].ToString() != "") { string strTime = Convert.ToDateTime(dr[dc.ColumnName]).ToString("HH:mm:ss"); if (strTime == "00:00:00") drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd"); else drNewRow[dc.ColumnName] = Convert.ToDateTime(dr[dc.ColumnName]).ToString("yyyy-MM-dd HH:mm:ss"); } } else { drNewRow[dc.ColumnName] = dr[dc.ColumnName]; } } dtNewFormat.Rows.Add(drNewRow); } //返回数据 return dtNewFormat; } } }