using System; using System.Data; using System.Collections; using BP.DA; using BP.En; using BP.Pub; using BP.Sys; namespace BP.En { /// /// QueryObject 的摘要说明。 /// public class QueryObject { private Entity _en = null; private Entities _ens = null; private string _sql = ""; private Entity En { get { if (this._en == null) return this.Ens.GetNewEntity; else return this._en; } set { this._en = value; } } private Entities Ens { get { return this._ens; } set { this._ens = value; } } /// /// 处理Order by , group by . /// private string _groupBy = ""; /// /// 要得到的查询sql 。 /// public string SQL { get { string sql = ""; string selecSQL = SqlBuilder.SelectSQL(this.En, this.Top); if (this._sql == null || this._sql.Length == 0) sql = selecSQL + this._groupBy + this._orderBy; else { if (selecSQL.Contains(" WHERE ")) sql = selecSQL + " AND ( " + this._sql + " ) " + _groupBy + this._orderBy; else sql = selecSQL + " WHERE ( " + this._sql + " ) " + _groupBy + this._orderBy; } sql = sql.Replace(" ", " "); sql = sql.Replace(" ", " "); sql = sql.Replace("AND ( AND )", "AND"); sql = sql.Replace("WHERE(1 = 1) AND ( AND )", "WHERE(1 = 1)"); sql = sql.Replace("WHERE AND", "WHERE"); sql = sql.Replace("WHERE AND", "WHERE"); sql = sql.Replace("WHERE ORDER", "ORDER"); return sql; } set { this._sql = this._sql + " " + value; } } public string SQLWithOutPara { get { string sql = this.SQL; foreach (Para en in this.MyParas) { sql = sql.Replace(BP.Difference.SystemConfig.AppCenterDBVarStr + en.ParaName, "'" + en.val.ToString() + "'"); } return sql; } } public void AddWhere(string str) { this._sql = this._sql + " " + str; } /// /// 修改于2009 -05-12 /// private int _Top = -1; public int Top { get { return _Top; } set { this._Top = value; } } private Paras _Paras = null; public Paras MyParas { get { if (_Paras == null) _Paras = new Paras(); return _Paras; } set { _Paras = value; } } private Paras _ParasR = null; public Paras MyParasR { get { if (_ParasR == null) _ParasR = new Paras(); return _ParasR; } } public void AddPara(string key, object v) { key = "P" + key; this.MyParas.Add(key, v); } public QueryObject() { } /// DictBase public QueryObject(Entity en) { this.MyParas.Clear(); this._en = en; this.HisDBType = this._en.EnMap.EnDBUrl.DBType; this.HisDBUrlType = this._en.EnMap.EnDBUrl.DBUrlType; } public QueryObject(Entities ens) { this.MyParas.Clear(); ens.Clear(); this._ens = ens; Entity en = this._ens.GetNewEntity; this.HisDBType = en.EnMap.EnDBUrl.DBType; this.HisDBUrlType = en.EnMap.EnDBUrl.DBUrlType; } public DBType HisDBType = DBType.MSSQL; public DBUrlType HisDBUrlType = DBUrlType.AppCenterDSN; public string HisVarStr { get { switch (this.HisDBType) { case DBType.MSSQL: case DBType.Access: case DBType.MySQL: return "@"; case DBType.Informix: return "?"; default: return ":"; } } } /// /// 增加函数查寻. /// /// 属性 /// 表达格式 大于,等于,小于 /// 长度 public void AddWhereLen(string attr, string exp, int len, DBType dbtype) { this.SQL = "( " + BP.Difference.SystemConfig.AppCenterDBLengthStr + "( " + attr2Field(attr) + " ) " + exp + " '" + len.ToString() + "')"; } /// /// 增加查询条件,条件用 IN 表示.sql必须是一个列的集合. /// /// 属性 /// 此sql,必须是有一个列的集合. public void AddWhereInSQL(string attr, string sql) { this.AddWhere(attr, " IN ", "( " + sql + " )"); } /// /// 增加查询条件,条件用 IN 表示.sql必须是一个列的集合. /// /// 属性 /// 此sql,必须是有一个列的集合. public void AddWhereInSQL(string attr, string sql, string orderBy) { this.AddWhere(attr, " IN ", "( " + sql + " )"); this.addOrderBy(orderBy); } /// /// 增加查询条件,条件用 IN 表示.sql必须是一个列的集合. /// /// 属性 /// 此sql,必须是有一个列的集合. public void AddWhereNotInSQL(string attr, string sql) { this.AddWhere(attr, " NOT IN ", " ( " + sql + " ) "); } public void AddWhereNotIn(string attr, string val) { this.AddWhere(attr, " NOT IN ", " ( " + val + " ) "); } /// /// 增加条件, DataTable 第一列的值. /// /// 属性 /// 第一列是要组合的values public void AddWhereIn(string attr, DataTable dt) { string strs = ""; foreach (DataRow dr in dt.Rows) { strs += "'"+dr[0].ToString() + "',"; } if(DataType.IsNullOrEmpty(strs)==false) strs = strs.Substring(0, strs.Length - 1); this.AddWhereIn(attr,"("+strs+")"); } /// /// 增加条件,vals 必须是sql可以识别的字串. /// /// 属性 /// 用 , 分开的. public void AddWhereIn(string attr, string vals) { this.AddWhere(attr, " IN ", vals); } /// /// /// /// /// /// public void AddWhere(string attr, string exp, object val) { AddWhere(attr, exp, val, null); } /// /// 增加条件 /// /// 属性 /// 操作符号(根据不同的数据库) /// 值 /// 参数名称,可以为null, 如果查询中有多个参数中有相同属性名的需要,分别给他们起一个参数名。 public void AddWhere(string attr, string exp, object val, string paraName) { if (val == null) val = ""; string valStr = Convert.ToString(val); if (valStr.Equals("all")) { this.SQL = "( 1=1 )"; return; } if (exp.ToLower().Contains("in")) { this.SQL = "( " + attr2Field(attr) + " " + exp + " " + valStr + " )"; return; } if (exp.ToLower().Contains("like")) { if (attr.Equals("FK_Dept")) { valStr = valStr.Replace("'", ""); valStr = valStr.Replace("%", ""); switch (this.HisDBType) { case DBType.Oracle: case DBType.KingBaseR3: case DBType.KingBaseR6: this.SQL = "( " + attr2Field(attr) + " " + exp + " '%'||" + this.HisVarStr + "FK_Dept||'%' )"; this.MyParas.Add("FK_Dept", valStr); break; default: //this.SQL = "( " + attr2Field(attr) + " " + exp + " '" + this.HisVarStr + "FK_Dept%' )"; this.SQL = "( " + attr2Field(attr) + " " + exp + " '" + valStr + "%' )"; //this.MyParas.Add("FK_Dept", val); break; } } else { if (valStr.Contains(":") || valStr.Contains("@")) { this.SQL = "( " + attr2Field(attr) + " " + exp + " " + valStr + " )"; } else { if (valStr.Contains("'") == false) this.SQL = "( " + attr2Field(attr) + " " + exp + " '" + valStr + "' )"; else this.SQL = "( " + attr2Field(attr) + " " + exp + " " + valStr + " )"; } } return; } if (this.HisVarStr.Equals("?")) { this.SQL = "( " + attr2Field(attr) + " " + exp + "?)"; this.MyParas.Add(attr, val); } else { if (paraName == null) { this.SQL = "( " + attr2Field(attr) + " " + exp + this.HisVarStr + attr + ")"; this.MyParas.Add(attr, val); } else { this.SQL = "( " + attr2Field(attr) + " " + exp + this.HisVarStr + paraName + ")"; this.MyParas.Add(paraName, val); } } } public void AddWhereDept(string val) { string attr = "FK_Dept"; string exp = "="; if (val.Contains("'") == false) this.SQL = "( " + attr2Field(attr) + " " + exp + " '" + val + "' )"; else this.SQL = "( " + attr2Field(attr) + " " + exp + " " + val + " )"; } /// /// 是空的 /// /// public void AddWhereIsNull(string attr) { this.SQL = "( " + attr2Field(attr) + " IS NULL OR " + attr2Field(attr) + "='' )"; } public void AddWhereIsNotNull(string attr) { this.SQL = "( " + attr2Field(attr) + " IS NOT NULL AND " + attr2Field(attr) + "!='' )"; } public void AddWhereField(string attr, string exp, string val) { if (val.ToString().Equals("all")) { this.SQL = "( 1=1 )"; return; } if (exp.ToLower().Contains("in")) { this.SQL = "( " + attr + " " + exp + " " + val + " )"; return; } this.SQL = "( " + attr + " " + exp + " :" + attr + " )"; this.MyParas.Add(attr, val); } public void AddWhereField(string attr, string exp, int val) { if (val.ToString().Equals("all")) { this.SQL = "( 1=1 )"; return; } if (exp.ToLower().Contains("in")) { this.SQL = "( " + attr + " " + exp + " " + val + " )"; return; } if (attr.Equals("RowNum")) { this.SQL = "( " + attr + " " + exp + " " + val + " )"; return; } if (this.HisVarStr.Equals("?")) this.SQL = "( " + attr + " " + exp + "?)"; else this.SQL = "( " + attr + " " + exp + " " + this.HisVarStr + attr + " )"; this.MyParas.Add(attr, val); } /// /// 增加条件 /// /// 属性 /// 操作符号(根据不同的数据库) /// 值 public void AddWhere(string attr, string exp, int val) { if (attr == "RowNum") { this.SQL = "( " + attr2Field(attr) + " " + exp + " " + val + ")"; } else { if (this.HisVarStr == "?") this.SQL = "( " + attr2Field(attr) + " " + exp + "?)"; else this.SQL = "( " + attr2Field(attr) + " " + exp + this.HisVarStr + attr + ")"; this.MyParas.Add(attr, val); } } public void AddHD() { this.SQL = "( 1=1 ) "; } /// /// 非恒等。 /// public void AddHD_Not() { this.SQL = "( 1=2 ) "; } /// /// 增加条件 /// /// 属性 /// 操作符号(根据不同的数据库) /// 值 public void AddWhere(string attr, string exp, float val) { this.MyParas.Add(attr, val); if (this.HisVarStr == "?") this.SQL = "( " + attr2Field(attr) + " " + exp + "?)"; else this.SQL = "( " + attr2Field(attr) + " " + exp + " " + this.HisVarStr + attr + ")"; } /// /// 增加条件(默认的是= ) /// /// 属性 /// 值 public void AddWhere(string attr, string val) { this.AddWhere(attr, "=", val); } /// /// 增加条件(默认的是= ) /// /// 属性 /// 值 public void AddWhere(string attr, int val) { this.AddWhere(attr, "=", val, null); } /// /// 增加条件 /// /// 属性 /// 值 true/false public void AddWhere(string attr, bool val) { if (val) this.AddWhere(attr, "=", 1); else this.AddWhere(attr, "=", 0); } public void AddWhere(string attr, Int64 val) { this.AddWhere(attr, "=", val, null); } public void AddWhere(string attr, float val) { this.AddWhere(attr, "=", val); } public void AddWhere(string attr, object val) { if (val == null) throw new Exception("Attr=" + attr + ", 值是空 is null"); if (val.GetType() == typeof(int) || val.GetType() == typeof(long)) { this.AddWhere(attr, "=", val); return; } this.AddWhere(attr, "=", Convert.ToString(val)); } public void addLeftBracket() { this.SQL = " ( "; } public void addRightBracket() { this.SQL = " ) "; } public void addAnd() { this.SQL = " AND "; } public void addOr() { this.SQL = " OR "; } public void addSQL(string sql) { this.SQL = "("+sql+")"; } #region 关于endsql public void addGroupBy(string attr) { this._groupBy = " GROUP BY " + attr2Field(attr); } public void addGroupBy(string attr1, string attr2) { this._groupBy = " GROUP BY " + attr2Field(attr1) + " , " + attr2Field(attr2); } private string _orderBy = ""; public void addOrderBy(string attr) { if (this._orderBy.IndexOf("ORDER BY") != -1) { this._orderBy += " , " + attr; } else { this._orderBy = " ORDER BY " + attr; } } /// /// 追加自定义的排序方式 /// /// public void addOrderByOfSelf(string orderByContent) { if (this._orderBy.IndexOf("ORDER BY") == -1) this._orderBy += " ORDER BY " + orderByContent; } /// /// /// /// public void addOrderByRandom() { if (this._orderBy.IndexOf("ORDER BY") != -1) { this._orderBy = " , NEWID()"; } else { this._orderBy = " ORDER BY NEWID()"; } } /// /// addOrderByDesc /// /// /// public void addOrderByDesc(string attr) { if (this._orderBy.IndexOf("ORDER BY") != -1) { this._orderBy += " , " + attr2Field(attr) + " DESC "; } else { this._orderBy = " ORDER BY " + attr2Field(attr) + " DESC "; } } public void addOrderByDesc(string attr1, string attr2) { this._orderBy = " ORDER BY " + attr2Field(attr1) + " DESC ," + attr2Field(attr2) + " DESC"; } public void addOrderBy(string attr1, string attr2) { this._orderBy = " ORDER BY " + attr2Field(attr1) + "," + attr2Field(attr2); } #endregion public void addHaving() { } /// 清除查询条件 public void clear() { this._sql = ""; this._groupBy = ""; //this._orderBy = ""; this.MyParas.Clear(); } private Map _HisMap; public Map HisMap { get { if (_HisMap == null) _HisMap = this.En.EnMap; return _HisMap; } set { _HisMap = value; } } /// /// 增加字段. /// /// /// private string attr2Field(string attrKey) { Attr attr = this.HisMap.GetAttrByKey(attrKey); if (attr.IsRefAttr == true) { if (this.HisDBType == DBType.Oracle || this.HisDBType==DBType.KingBaseR3 || this.HisDBType==DBType.KingBaseR6) return "T" + attr.Key.Replace("Text", "") + ".Name"; Entity en = attr.HisFKEn; if (attr.IsFK == false) return en.EnMap.PhysicsTable + "_" + attr.Key.Replace("Text", "") + ".Name"; return en.EnMap.PhysicsTable + "_" + attr.Key.Replace("Text", "") + ".Name"; } return this.HisMap.PhysicsTable + "." + attr.Field; // return this.HisMap.PhysicsTable + "."+attr; } //public DataTable DoGroupReturnTable(Entity en, Attrs attrsOfGroupKey, Attr attrGroup, GroupWay gw, OrderWay ow) //{ // switch (en.EnMap.EnDBUrl.DBType) // { // case DBType.Oracle: // return DoGroupReturnTableOracle(en, attrsOfGroupKey, attrGroup, gw, ow); // default: // return DoGroupReturnTableSqlServer(en, attrsOfGroupKey, attrGroup, gw, ow); // } //} //public DataTable DoGroupReturnTableOracle(Entity en, Attrs attrsOfGroupKey, Attr attrGroup, GroupWay gw, OrderWay ow) //{ // #region 生成要查询的语句 // string fields = ""; // string str = ""; // foreach (Attr attr in attrsOfGroupKey) // { // if (attr.Field == null) // continue; // str = "," + attr.Field; // fields += str; // } // if (attrGroup.Key == "MyNum") // { // switch (gw) // { // case GroupWay.BySum: // fields += ", COUNT(*) AS MyNum"; // break; // case GroupWay.ByAvg: // fields += ", AVG(" + attrGroup.Field + ") AS MyNum"; // break; // default: // throw new Exception("no such case:"); // } // } // else // { // switch (gw) // { // case GroupWay.BySum: // fields += ",SUM(" + attrGroup.Field + ") AS " + attrGroup.Key; // break; // case GroupWay.ByAvg: // fields += ",AVG(" + attrGroup.Field + ") AS " + attrGroup.Key; // break; // default: // throw new Exception("no such case:"); // } // } // string by = ""; // foreach (Attr attr in attrsOfGroupKey) // { // if (attr.Field == null) // continue; // str = "," + attr.Field; // by += str; // } // by = by.Substring(1); // //string sql // string sql = "SELECT " + fields.Substring(1) + " FROM " + this.En.EnMap.PhysicsTable + " WHERE " + this._sql + " Group BY " + by; // #endregion // #region // Map map = new Map(); // map.PhysicsTable = "@VT@"; // map.Attrs = attrsOfGroupKey; // map.Attrs.Add(attrGroup); // #endregion . // string sql1 = SqlBuilder.SelectSQLOfOra(en.ToString(), map) + " " + SqlBuilder.GenerFormWhereOfOra(en, map); // sql1 = sql1.Replace("@TopNum", ""); // sql1 = sql1.Replace("FROM @VT@", "FROM (" + sql + ") VT"); // sql1 = sql1.Replace("@VT@", "VT"); // sql1 = sql1.Replace("TOP", ""); // if (ow == OrderWay.OrderByUp) // sql1 += " ORDER BY " + attrGroup.Key + " DESC "; // else // sql1 += " ORDER BY " + attrGroup.Key; // return this.En.RunSQLReturnTable(sql1, this.MyParas); //} //public DataTable DoGroupReturnTableSqlServer(Entity en, Attrs attrsOfGroupKey, Attr attrGroup, GroupWay gw, OrderWay ow) //{ // #region 生成要查询的语句 // string fields = ""; // string str = ""; // foreach (Attr attr in attrsOfGroupKey) // { // if (attr.Field == null) // continue; // str = "," + attr.Field; // fields += str; // } // if (attrGroup.Key == "MyNum") // { // switch (gw) // { // case GroupWay.BySum: // fields += ", COUNT(*) AS MyNum"; // break; // case GroupWay.ByAvg: // fields += ", AVG(*) AS MyNum"; // break; // default: // throw new Exception("no such case:"); // } // } // else // { // switch (gw) // { // case GroupWay.BySum: // fields += ",SUM(" + attrGroup.Field + ") AS " + attrGroup.Key; // break; // case GroupWay.ByAvg: // fields += ",AVG(" + attrGroup.Field + ") AS " + attrGroup.Key; // break; // default: // throw new Exception("no such case:"); // } // } // string by = ""; // foreach (Attr attr in attrsOfGroupKey) // { // if (attr.Field == null) // continue; // str = "," + attr.Field; // by += str; // } // by = by.Substring(1); // //string sql // string sql = "SELECT " + fields.Substring(1) + " FROM " + this.En.EnMap.PhysicsTable + " WHERE " + this._sql + " Group BY " + by; // #endregion // #region // Map map = new Map(); // map.PhysicsTable = "@VT@"; // map.Attrs = attrsOfGroupKey; // map.Attrs.Add(attrGroup); // #endregion . // //string sql1=SqlBuilder.SelectSQLOfMS( map )+" "+SqlBuilder.GenerFormWhereOfMS( en,map) + " AND ( " + this._sql+" ) "+_endSql; // string sql1 = SqlBuilder.SelectSQLOfMS(map) + " " + SqlBuilder.GenerFormWhereOfMS(en, map); // sql1 = sql1.Replace("@TopNum", ""); // sql1 = sql1.Replace("FROM @VT@", "FROM (" + sql + ") VT"); // sql1 = sql1.Replace("@VT@", "VT"); // sql1 = sql1.Replace("TOP", ""); // if (ow == OrderWay.OrderByUp) // sql1 += " ORDER BY " + attrGroup.Key + " DESC "; // else // sql1 += " ORDER BY " + attrGroup.Key; // return this.En.RunSQLReturnTable(sql1, this.MyParas); //} /// /// 分组查询,返回datatable. /// /// /// /// /// //public DataTable DoGroupReturnTable1(Entity en, Attrs attrsOfGroupKey, Attr attrGroup, GroupWay gw, OrderWay ow) //{ // #region 生成要查询的语句 // string fields = ""; // string str = ""; // foreach (Attr attr in attrsOfGroupKey) // { // if (attr.Field == null) // continue; // str = "," + attr.Field; // fields += str; // } // if (attrGroup.Key == "MyNum") // { // switch (gw) // { // case GroupWay.BySum: // fields += ", COUNT(*) AS MyNum"; // break; // case GroupWay.ByAvg: // fields += ", AVG(*) AS MyNum"; // break; // default: // throw new Exception("no such case:"); // } // } // else // { // switch (gw) // { // case GroupWay.BySum: // fields += ",SUM(" + attrGroup.Field + ") AS " + attrGroup.Key; // break; // case GroupWay.ByAvg: // fields += ",AVG(" + attrGroup.Field + ") AS " + attrGroup.Key; // break; // default: // throw new Exception("no such case:"); // } // } // string by = ""; // foreach (Attr attr in attrsOfGroupKey) // { // if (attr.Field == null) // continue; // str = "," + attr.Field; // by += str; // } // by = by.Substring(1); // //string sql // string sql = "SELECT " + fields.Substring(1) + " FROM " + this.En.EnMap.PhysicsTable + " WHERE " + this._sql + " Group BY " + by; // #endregion // #region // Map map = new Map(); // map.PhysicsTable = "@VT@"; // map.Attrs = attrsOfGroupKey; // map.Attrs.Add(attrGroup); // #endregion . // //string sql1=SqlBuilder.SelectSQLOfMS( map )+" "+SqlBuilder.GenerFormWhereOfMS( en,map) + " AND ( " + this._sql+" ) "+_endSql; // string sql1 = SqlBuilder.SelectSQLOfMS(map) + " " + SqlBuilder.GenerFormWhereOfMS(en, map); // sql1 = sql1.Replace("@TopNum", ""); // sql1 = sql1.Replace("FROM @VT@", "FROM (" + sql + ") VT"); // sql1 = sql1.Replace("@VT@", "VT"); // sql1 = sql1.Replace("TOP", ""); // if (ow == OrderWay.OrderByUp) // sql1 += " ORDER BY " + attrGroup.Key + " DESC "; // else // sql1 += " ORDER BY " + attrGroup.Key; // return this.En.RunSQLReturnTable(sql1); //} public string[] FullAttrs = null; /// /// 执行查询 /// /// public int DoQuery() { try { if (this._en == null) return this.doEntitiesQuery(); else return this.doEntityQuery(); } catch (Exception ex) { if (this._en == null) this._ens.GetNewEntity.CheckPhysicsTable(); else this._en.CheckPhysicsTable(); throw ex; } } public int DoQueryBak20111203() { try { if (this._en == null) { return this.doEntitiesQuery(); } else return this.doEntityQuery(); } catch (Exception ex) { try { if (this._en == null) this.Ens.GetNewEntity.CheckPhysicsTable(); else this._en.CheckPhysicsTable(); } catch { } throw ex; } } public string DealString(string sql) { DataTable dt = this.En.RunSQLReturnTable(sql); string strs = ""; foreach (DataRow dr in dt.Rows) { strs += ",'" + dr[0].ToString() + "'"; } return strs.Substring(1); } public string GenerPKsByTableWithPara(string pk, string sql, int from, int to) { //Log.DefaultLogWriteLineWarning(" ***************************** From= " + from + " T0" + to); DataTable dt = DBAccess.RunSQLReturnTable(sql, this.MyParas); string pks = ""; int i = 0; int paraI = 0; string dbStr = BP.Difference.SystemConfig.AppCenterDBVarStr; foreach (DataRow dr in dt.Rows) { i++; if (i > from) { paraI++; //pks += "'" + dr[0].ToString() + "'"; if (dbStr == "?") pks += "?,"; else pks += BP.Difference.SystemConfig.AppCenterDBVarStr + "R" + paraI + ","; if (pk.Equals("OID") || pk.Equals("WorkID") || pk.Equals("NodeID")) this.MyParasR.Add("R" + paraI, int.Parse(dr[0].ToString())); else this.MyParasR.Add("R" + paraI, dr[0].ToString()); if (i >= to) return pks.Substring(0, pks.Length - 1); } } if (pks == "") { return null; //return " '1' "; return " "; } return pks.Substring(0, pks.Length - 1); } public string GenerPKsByTable(string sql, int from, int to) { //Log.DefaultLogWriteLineWarning(" ***************************** From= " + from + " T0" + to); DataTable dt = this.En.RunSQLReturnTable(sql, this.MyParas); string pks = ""; int i = 0; foreach (DataRow dr in dt.Rows) { i++; if (i > from) { if (i >= to) { pks += "'" + dr[0].ToString() + "'"; return pks; } else pks += "'" + dr[0].ToString() + "',"; } } if (pks == "") return " '11111111' "; return pks.Substring(0, pks.Length - 1); } /// /// 删除当前查询的排序字段,然后可以再次增加其他的排序字段 /// added by liuxc,2015.3.18,为解决默认增加的是主键字段排序,但此排序字段未提供删除方法的问题 /// public void ClearOrderBy() { this._orderBy = string.Empty; } /// /// /// /// /// /// /// public int DoQuery(string pk, int pageSize, int pageIdx) { if (pk == "OID" || pk == "WorkID") return DoQuery(pk, pageSize, pageIdx, pk, true); else return DoQuery(pk, pageSize, pageIdx, pk, false); } /// /// 分页查询方法 /// /// 主键 /// 页面大小 /// 第x页 /// 排序 /// 排序方式: 两种情况 Down UP /// 查询结果 public int DoQuery(string pk, int pageSize, int pageIdx, string orderBy, string orderWay) { if (orderWay.ToLower().Trim() == "up" || orderWay.ToLower().Trim() == "asc") return DoQuery(pk, pageSize, pageIdx, orderBy, false); else return DoQuery(pk, pageSize, pageIdx, orderBy, true); } /// /// 分页查询方法 /// /// 主键 /// 页面大小 /// 第x页 /// 排序 /// 查询结果 public int DoQuery(string pk, int pageSize, int pageIdx, bool isDesc) { return DoQuery(pk, pageSize, pageIdx, pk, isDesc); } /// /// 分页查询方法 /// /// 主键 /// 页面大小 /// 第x页 /// 排序 /// 排序方式: 两种情况 desc 或者 为 null. /// 查询结果 public int DoQuery(string pk, int pageSize, int pageIdx, string orderBy, bool isDesc) { if (DataType.IsNullOrEmpty(orderBy) == false && orderBy.EndsWith("Text")) orderBy = orderBy.Replace("Text", ""); int pageNum = 0; //如果没有加入排序字段,使用主键 if (DataType.IsNullOrEmpty(this._orderBy)) { string isDescStr = ""; if (isDesc) isDescStr = " DESC "; if (DataType.IsNullOrEmpty(orderBy)) orderBy = pk; this._orderBy = orderBy + isDescStr; } if (this._orderBy.Contains("ORDER BY") == false) _orderBy = " ORDER BY " + this._orderBy; try { if (this._en == null) { int recordConut = 0; recordConut = this.GetCount(); // 获取 它的数量。 if (recordConut == 0) { this._ens.Clear(); return 0; } // xx!5555 提出的错误. if (pageSize == 0) pageSize = 12; decimal pageCountD = decimal.Parse(recordConut.ToString()) / decimal.Parse(pageSize.ToString()); // 页面个数。 string[] strs = pageCountD.ToString("0.0000").Split('.'); if (int.Parse(strs[1]) > 0) pageNum = int.Parse(strs[0]) + 1; else pageNum = int.Parse(strs[0]); int myleftCount = recordConut - (pageNum * pageSize); pageNum++; int top = pageSize * (pageIdx - 1); string sql = ""; Entity en = this._ens.GetNewEntity; Map map = en.EnMap; int toIdx = 0; string pks = ""; switch (map.EnDBUrl.DBType) { case DBType.Oracle: case DBType.KingBaseR3: case DBType.KingBaseR6: toIdx = top + pageSize; if (DataType.IsNullOrEmpty(this._sql) == true) { if (top == 0) sql = "SELECT * FROM ( SELECT " + pk + " FROM " + map.PhysicsTable + " " + this._orderBy + " ) WHERE ROWNUM <=" + pageSize; else sql = "SELECT * FROM ( SELECT " + pk + " FROM " + map.PhysicsTable + " " + this._orderBy + ") "; } else { string mysql = this.SQL; mysql = mysql.Substring(mysql.IndexOf("FROM ")); if (top == 0) sql = "SELECT * FROM ( SELECT " + map.PhysicsTable + "." + pk + " " + mysql + " ) WHERE ROWNUM <=" + pageSize; else sql = "SELECT * FROM ( SELECT " + map.PhysicsTable + "." + pk + " " + mysql + " ) "; //sql = "SELECT * FROM ( SELECT " + pk + " FROM " + map.PhysicsTable + " WHERE " + this._sql + " " + this._orderBy + " ) "; } sql = sql.Replace("AND ( ( 1=1 ) )", " "); pks = this.GenerPKsByTableWithPara(pk, sql, top, toIdx); this.clear(); this.MyParas = this.MyParasR; if (pks != null) this.AddWhereIn(pk, "(" + pks + ")"); else this.AddHD(); this.Top = pageSize; return this.doEntitiesQuery(); case DBType.Informix: toIdx = top + pageSize; if (DataType.IsNullOrEmpty(this._sql) == true) { if (top == 0) sql = " SELECT first " + pageSize + " " + this.En.PKField + " FROM " + map.PhysicsTable + " " + this._orderBy; else sql = " SELECT " + this.En.PKField + " FROM " + map.PhysicsTable + " " + this._orderBy; } else { string mysql = this.SQL; mysql = mysql.Substring(mysql.IndexOf("FROM ")); if (top == 0) sql = "SELECT first " + pageSize + " " + this.En.PKField + " " + mysql; else sql = "SELECT " + this.En.PKField + " " + mysql; } sql = sql.Replace("AND ( ( 1=1 ) )", " "); pks = this.GenerPKsByTableWithPara(pk, sql, top, toIdx); this.clear(); this.MyParas = this.MyParasR; if (pks == null) this.AddHD_Not(); else this.AddWhereIn(pk, "(" + pks + ")"); this.Top = pageSize; return this.doEntitiesQuery(); case DBType.MySQL: toIdx = top + pageSize; if (DataType.IsNullOrEmpty(this._sql) == true) { //if (top == 0) // sql = " SELECT " + this.En.PKField + " FROM " + map.PhysicsTable + " " + this._orderBy + " LIMIT " + pageSize; //else sql = " SELECT " + this.En.PKField + " FROM " + map.PhysicsTable + " " + this._orderBy; } else { string mysql = this.SQL; mysql = mysql.Substring(mysql.IndexOf("FROM ")); //if (top == 0) //这个位置暂时注释掉,使用LIMIT分页会出现数据重复的问题 // sql = "SELECT " + map.PhysicsTable + "." + this.En.PKField + " " + mysql + " LIMIT " + pageSize; //else sql = "SELECT " + map.PhysicsTable + "." + this.En.PKField + " " + mysql; } sql = sql.Replace("AND ( ( 1=1 ) )", " "); pks = this.GenerPKsByTableWithPara(pk, sql, top, toIdx); this.clear(); this.MyParas = this.MyParasR; if (pks == null) this.AddHD_Not(); else this.AddWhereIn(pk, "(" + pks + ")"); this.Top = pageSize; return this.doEntitiesQuery(); case DBType.PostgreSQL: case DBType.UX: case DBType.HGDB: toIdx = top + pageSize; if (DataType.IsNullOrEmpty(this._sql) == true) { if (top == 0) sql = " SELECT " + this.En.PKField + " FROM " + map.PhysicsTable + " " + this._orderBy + " LIMIT " + pageSize; else sql = " SELECT " + this.En.PKField + " FROM " + map.PhysicsTable + " " + this._orderBy; } else { string mysql = this.SQL; mysql = mysql.Substring(mysql.IndexOf("FROM ")); if (top == 0) sql = "SELECT " + map.PhysicsTable + "." + this.En.PKField + " " + mysql + " LIMIT " + pageSize; else sql = "SELECT " + map.PhysicsTable + "." + this.En.PKField + " " + mysql; } sql = sql.Replace("AND ( ( 1=1 ) )", " "); pks = this.GenerPKsByTableWithPara(pk, sql, top, toIdx); this.clear(); this.MyParas = this.MyParasR; if (pks == null) this.AddHD_Not(); else this.AddWhereIn(pk, "(" + pks + ")"); this.Top = pageSize; return this.doEntitiesQuery(); case DBType.MSSQL: default: toIdx = top + pageSize; if (DataType.IsNullOrEmpty(this._sql) == true) { //此处去掉原有的第1页时用top pagesize的写法,会导致第1页数据查询出来的不准确,统一都用下面的写法,edited by liuxc,2017-8-30 //此处查询数据,除第1页外,有可能会造排序不正确,但每一页的数据是准确的,限于原有写法,没法改动此处逻辑解决这个问题 sql = " SELECT [" + this.En.PKField + "] FROM " + map.PhysicsTable + " " + this._orderBy; } else { string mysql = this.SQL; mysql = mysql.Substring(mysql.IndexOf("FROM ")); sql = "SELECT " + map.PhysicsTable + "." + this.En.PKField + " as [" + this.En.PKField + "] " + mysql; } sql = sql.Replace("AND ( ( 1=1 ) )", " "); pks = this.GenerPKsByTableWithPara(pk, sql, top, toIdx); this.clear(); this.MyParas = this.MyParasR; if (pks == null) this.AddHD_Not(); else this.AddWhereIn(pk, "(" + pks + ")"); this.Top = pageSize; return this.doEntitiesQuery(); } } else return this.doEntityQuery(); } catch (Exception ex) { try { if (this._en == null) this.Ens.GetNewEntity.CheckPhysicsTable(); else this._en.CheckPhysicsTable(); } catch { } throw ex; } } /// /// 按照 /// /// public DataTable DoQueryToTable() { try { string sql = this.SQL; sql = sql.Replace("WHERE (1=1) AND ( AND ( ( ( 1=1 ) ) AND ( ( 1=1 ) ) ) )", ""); return DBAccess.RunSQLReturnTable(sql, this.MyParas); } catch (Exception ex) { if (this._en == null) this.Ens.GetNewEntity.CheckPhysicsTable(); else this._en.CheckPhysicsTable(); throw ex; } } /// /// 得到返回的数量 /// /// 得到返回的数量 public int GetCount() { string sql = this.SQL; //sql="SELECT COUNT(*) "+sql.Substring(sql.IndexOf("FROM") ) ; string ptable = this.En.EnMap.PhysicsTable; string pk = this.En.PKField; switch (this.En.EnMap.EnDBUrl.DBType) { case DBType.Oracle: case DBType.KingBaseR3: case DBType.KingBaseR6: if (DataType.IsNullOrEmpty(this._sql) == true) sql = "SELECT COUNT(" + ptable + "." + pk + ") as C FROM " + ptable; else sql = "SELECT COUNT(" + ptable + "." + pk + ") as C " + sql.Substring(sql.IndexOf("FROM ")); break; default: if (DataType.IsNullOrEmpty(this._sql) == true) sql = "SELECT COUNT(" + ptable + "." + pk + ") as C FROM " + ptable; else { sql = sql.Substring(sql.IndexOf("FROM ")); if (sql.IndexOf("ORDER BY") >= 0) sql = sql.Substring(0, sql.IndexOf("ORDER BY") - 1); sql = "SELECT COUNT(" + ptable + "." + pk + ") as C " + sql; } //sql="SELECT COUNT(*) as C "+this._endSql +sql.Substring( sql.IndexOf("FROM ") ) ; //sql="SELECT COUNT(*) as C FROM "+ this._ens.GetNewEntity.EnMap.PhysicsTable+ " " +sql.Substring(sql.IndexOf("WHERE") ) ; //int i = sql.IndexOf("ORDER BY") ; //if (i!=-1) // sql=sql.Substring(0,i); break; } try { int i = this.En.RunSQLReturnValInt(sql, this.MyParas); if (this.Top == -1) return i; if (this.Top >= i) return i; else return this.Top; } catch (Exception ex) { // if (BP.Difference.SystemConfig.IsDebug) this.En.CheckPhysicsTable(); throw ex; } } public DataTable GetSumOrAvg(string oper) { string sql = this.SQL; string ptable = this.En.EnMap.PhysicsTable; string pk = this.En.PKField; switch (this.En.EnMap.EnDBUrl.DBType) { case DBType.Oracle: case DBType.KingBaseR3: case DBType.KingBaseR6: if (DataType.IsNullOrEmpty(this._sql) == true) sql = "SELECT " + oper + " FROM " + ptable; else sql = "SELECT " + oper + sql.Substring(sql.IndexOf("FROM ")); break; default: if (DataType.IsNullOrEmpty(this._sql) == true) sql = "SELECT " + oper + " FROM " + ptable; else { sql = sql.Substring(sql.IndexOf("FROM ")); if (sql.IndexOf("ORDER BY") >= 0) sql = sql.Substring(0, sql.IndexOf("ORDER BY") - 1); sql = "SELECT " + oper + " " + sql; } break; } try { return this.En.RunSQLReturnTable(sql, this.MyParas); } catch (Exception ex) { this.En.CheckPhysicsTable(); throw ex; } } public DataTable DoGroupQueryToTable(string selectSQl, string groupBy, string orderBy) { string sql = this.SQL; string ptable = this.En.EnMap.PhysicsTable; string pk = this.En.PKField; switch (this.En.EnMap.EnDBUrl.DBType) { case DBType.Oracle: case DBType.KingBaseR3: case DBType.KingBaseR6: if (DataType.IsNullOrEmpty(this._sql) == true) sql = selectSQl + " FROM " + ptable + "WHERE " + groupBy + orderBy; else sql = selectSQl + sql.Substring(sql.IndexOf(" FROM ")) + groupBy + orderBy; break; default: if (DataType.IsNullOrEmpty(this._sql) == true) sql = selectSQl + " FROM " + ptable + "WHERE " + groupBy + orderBy; else { sql = sql.Substring(sql.IndexOf(" FROM ")); if (sql.IndexOf("ORDER BY") >= 0) sql = sql.Substring(0, sql.IndexOf("ORDER BY") - 1); sql = selectSQl + sql + groupBy + orderBy; } //sql="SELECT COUNT(*) as C "+this._endSql +sql.Substring( sql.IndexOf("FROM ") ) ; //sql="SELECT COUNT(*) as C FROM "+ this._ens.GetNewEntity.EnMap.PhysicsTable+ " " +sql.Substring(sql.IndexOf("WHERE") ) ; //int i = sql.IndexOf("ORDER BY") ; //if (i!=-1) // sql=sql.Substring(0,i); break; } return this.En.RunSQLReturnTable(sql, this.MyParas); } /// /// 最大的数量 /// /// 最大的数量 /// 要查询的信息 public DataTable DoQueryToTable(int topNum) { this.Top = topNum; return this.En.RunSQLReturnTable(this.SQL, this.MyParas); } private int doEntityQuery() { return EntityDBAccess.Retrieve(this.En, this.SQL, this.MyParas); } private int doEntitiesQuery() { switch (this.HisDBType) { case DBType.Oracle: case DBType.KingBaseR3: case DBType.KingBaseR6: if (this.Top != -1) { this.addAnd(); this.AddWhereField("RowNum", "<=", this.Top); } break; case DBType.MSSQL: case DBType.MySQL: default: break; } return EntityDBAccess.Retrieve(this.Ens, this.SQL, this.MyParas, this.FullAttrs); } /// /// 根据data初始化entiies. /// /// 实体s /// 数据表 /// 要填充的树形 /// 初始化后的ens public static Entities InitEntitiesByDataTable(Entities ens, DataTable dt, string[] fullAttrs) { FieldCaseModel fieldCaseModel = BP.Difference.SystemConfig.AppCenterDBFieldCaseModel; if (fullAttrs == null) { Map enMap = ens.GetNewEntity.EnMap; Attrs attrs = enMap.Attrs; try { foreach (DataRow dr in dt.Rows) { Entity en = ens.GetNewEntity; foreach (Attr attr in attrs) { if (fieldCaseModel == FieldCaseModel.UpperCase) { if ( attr.MyFieldType == FieldType.RefText) en.SetValByKey(attr.Key, dr[attr.Key]); else en.SetValByKey(attr.Key, dr[attr.Key.ToUpper()]); } else if (fieldCaseModel == FieldCaseModel.Lowercase) { if (attr.MyFieldType == FieldType.RefText) en.SetValByKey(attr.Key, dr[attr.Key]); else en.SetValByKey(attr.Key, dr[attr.Key.ToLower()]); } else en.SetValByKey(attr.Key, dr[attr.Key]); } ens.AddEntity(en); } } catch (Exception ex) { // warning 不应该出现的错误. 2011-12-03 add String cols = ""; foreach (DataColumn dc in dt.Columns) { cols += " , " + dc.ColumnName; } throw new Exception("Columns=" + cols + "@Ens=" + ens.ToString() + " @异常信息:" + ex.Message); } return ens; } foreach (DataRow dr in dt.Rows) { Entity en = ens.GetNewEntity; foreach (String str in fullAttrs) { if (fieldCaseModel == FieldCaseModel.UpperCase) { if (dt.Columns.Contains(str) == true) en.SetValByKey(str, dr[str]); else en.SetValByKey(str, dr[str.ToUpper()]); } else if (fieldCaseModel == FieldCaseModel.Lowercase) { if (dt.Columns.Contains(str) == true) en.SetValByKey(str, dr[str]); else en.SetValByKey(str, dr[str.ToLower()]); } else en.SetValByKey(str, dr[str]); } ens.AddEntity(en); } return ens; } } }