/// <summary> /// 确定指定的 Object 是否等于当前的 Object。 /// </summary> /// <param name="obj"></param> /// <returns></returns> public override bool Equals(object obj) { if (obj == null) { return(false); } XTable table = obj as XTable; if (table == null) { return(false); } if (this.Name != table.Name) { return(false); } if (this.Readme != table.Readme) { return(false); } if (this.IsView != table.IsView) { return(false); } //比较字段 List <XField> list1 = new List <XField>(Fields); List <XField> list2 = new List <XField>(table.Fields); foreach (XField item in list1) { XField match = null; //在第二个列表里面找该字段 foreach (XField elm in list2) { if (item == elm) { match = elm; break; } } //如果找不到,表明第二个列表没有该字段 if (match == null) { return(false); } list2.Remove(match); } //如果第二个列表还不为空,表明字段数不对应 if (list2.Count > 0) { return(false); } return(true); }
/// <summary> /// 确定指定的 Object 是否等于当前的 Object。 /// </summary> /// <param name="obj"></param> /// <returns></returns> public override bool Equals(object obj) { if (obj == null) { return(false); } XField field = obj as XField; if (field == null) { return(false); } if (this.Name != field.Name) { return(false); } if (this.FieldType != field.FieldType) { return(false); } if (this.Identity != field.Identity) { return(false); } if (this.PrimaryKey != field.PrimaryKey) { return(false); } if (this.Length != field.Length) { return(false); } if (this.NumOfByte != field.NumOfByte) { return(false); } if (this.Digit != field.Digit) { return(false); } if (this.Nullable != field.Nullable) { return(false); } if (this.Default != field.Default) { return(false); } if (this.Readme != field.Readme) { return(false); } return(true); }
/// <summary> /// 取得指定表的所有列构架 /// </summary> /// <param name="xt"></param> /// <returns></returns> protected virtual XField[] GetFields(XTable xt) { DataTable dt = GetSchema("Columns", new String[] { null, null, xt.Name }); List <XField> list = new List <XField>(); DataRow[] drs = dt.Select("", "ORDINAL_POSITION"); List <String> pks = GetPrimaryKeys(xt); List <Dictionary <String, String> > fks = GetForeignKeys(xt); foreach (DataRow dr in drs) { XField xf = new XField(); xf.ID = Int32.Parse(dr["ORDINAL_POSITION"].ToString()); xf.Name = dr["COLUMN_NAME"].ToString(); xf.FieldType = FieldTypeToClassType(dr["DATA_TYPE"].ToString()); xf.Identity = dr["DATA_TYPE"].ToString() == "3" && (dr["COLUMN_FLAGS"].ToString() == "16" || dr["COLUMN_FLAGS"].ToString() == "90"); xf.PrimaryKey = pks != null && pks.Contains(xf.Name); xf.ForeignKey = false; xf.ForeignTableName = ""; xf.ForeignTablePrimaryName = ""; if (fks != null) { foreach (Dictionary <String, String> dic in fks) { if (dic["FK_COLUMN_NAME"] == xf.Name) { xf.ForeignKey = true; xf.ForeignTableName = dic["PK_TABLE_NAME"]; xf.ForeignTablePrimaryName = dic["PK_COLUMN_NAME"]; break; } } } if (xf.FieldType == "Int32" || xf.FieldType == "Double") { xf.Length = dr["NUMERIC_PRECISION"] == DBNull.Value ? 0 : Int32.Parse(dr["NUMERIC_PRECISION"].ToString()); xf.NumOfByte = 0; xf.Digit = dr["NUMERIC_SCALE"] == DBNull.Value ? 0 : Int32.Parse(dr["NUMERIC_SCALE"].ToString()); } else if (xf.FieldType == "DateTime") { xf.Length = dr["DATETIME_PRECISION"] == DBNull.Value ? 0 : Int32.Parse(dr["DATETIME_PRECISION"].ToString()); xf.NumOfByte = 0; xf.Digit = 0; } else { if (dr["DATA_TYPE"].ToString() == "130" && dr["COLUMN_FLAGS"].ToString() == "234") //备注类型 { xf.Length = Int32.MaxValue; xf.NumOfByte = Int32.MaxValue; } else { xf.Length = dr["CHARACTER_MAXIMUM_LENGTH"] == DBNull.Value ? 0 : Int32.Parse(dr["CHARACTER_MAXIMUM_LENGTH"].ToString()); xf.NumOfByte = dr["CHARACTER_OCTET_LENGTH"] == DBNull.Value ? 0 : Int32.Parse(dr["CHARACTER_OCTET_LENGTH"].ToString()); } xf.Digit = 0; } try { xf.Nullable = Boolean.Parse(dr["IS_NULLABLE"].ToString()); } catch { xf.Nullable = dr["IS_NULLABLE"].ToString() == "YES"; } try { xf.Default = dr["COLUMN_HASDEFAULT"].ToString() == "False" ? "" : dr["COLUMN_DEFAULT"].ToString(); } catch { xf.Default = dr["COLUMN_DEFAULT"].ToString(); } try { xf.Readme = dr["DESCRIPTION"] == DBNull.Value ? "" : dr["DESCRIPTION"].ToString(); } catch { xf.Readme = ""; } list.Add(xf); } return(list.ToArray()); }
//private DataTable allfields; /// <summary> /// 取得指定表的所有列构架 /// </summary> /// <param name="xt"></param> /// <returns></returns> protected override XField[] GetFields(XTable xt) { //if (allfields == null) allfields = Query(SchemaSql).Tables[0]; DataTable allfields = Query(String.Format(SchemaSql, xt.Name)).Tables[0]; if (allfields == null) { return(base.GetFields(xt)); } List <XField> list = new List <XField>(); //DataRow[] drs = allfields.Select("表名='" + xt.Name + "'", "字段序号"); //if (drs == null || drs.Length < 1) return base.GetFields(xt); if (allfields.Rows == null || allfields.Rows.Count < 1) { return(base.GetFields(xt)); } List <String> pks = GetPrimaryKeys(xt); List <Dictionary <String, String> > fks = GetForeignKeys(xt); foreach (DataRow dr in allfields.Rows) { XField xf = new XField(); xf.ID = Int32.Parse(dr["字段序号"].ToString()); xf.Name = dr["字段名"].ToString(); xf.FieldType = FieldTypeToClassType(dr["类型"].ToString()); xf.Identity = Boolean.Parse(dr["标识"].ToString()); //xf.PrimaryKey = pks != null && pks.Contains(xf.Name); xf.PrimaryKey = Boolean.Parse(dr["主键"].ToString()); xf.ForeignKey = false; xf.ForeignTableName = ""; xf.ForeignTablePrimaryName = ""; if (fks != null) { foreach (Dictionary <String, String> dic in fks) { if (dic["FK_COLUMN_NAME"] == xf.Name) { xf.ForeignKey = true; xf.ForeignTableName = dic["PK_TABLE_NAME"]; xf.ForeignTablePrimaryName = dic["PK_COLUMN_NAME"]; break; } } } xf.Length = Int32.Parse(dr["长度"].ToString()); xf.NumOfByte = Int32.Parse(dr["占用字节数"].ToString()); xf.Digit = Int32.Parse(dr["小数位数"].ToString()); xf.Nullable = Boolean.Parse(dr["允许空"].ToString()); xf.Default = dr["默认值"].ToString(); xf.Readme = dr["字段说明"].ToString(); list.Add(xf); } return(list.ToArray()); }