using System; using System.Collections.Generic; using System.Text; using System.Data; using CYQ.Data.SQL; using CYQ.Data.Orm; using CYQ.Data.Tool; using CYQ.Data.Json; namespace CYQ.Data.Table { /// /// 列结构修选项 /// [Flags] public enum AlterOp { /// /// 默认不修改状态 /// None = 0, /// /// 添加或修改状态 /// AddOrModify = 1, /// /// 删除列状态 /// Drop = 2, /// /// 重命名列状态 /// Rename = 4 } /// /// 单元结构属性 /// public partial class MCellStruct { private MDataColumn _MDataColumn = null; /// /// 结构集合 /// [JsonIgnore] public MDataColumn MDataColumn { get { return _MDataColumn; } internal set { _MDataColumn = value; } } /// /// 是否忽略Json转换 /// [JsonIgnore] public bool IsJsonIgnore { get; set; } private string _TableName; /// /// 表名 /// [JsonIgnore] public string TableName { get { if (string.IsNullOrEmpty(_TableName) && _MDataColumn != null) { return _MDataColumn.TableName; } return _TableName; } set { _TableName = value; } } /// /// 外键表名 /// [JsonIgnore] public string FKTableName { get; set; } /// /// 旧的列名(AlterOp为Rename时可用) /// [JsonIgnore] public string OldName { get; set; } private string _ColumnName = string.Empty; /// /// 列名 /// public string ColumnName { get { return _ColumnName; } set { _ColumnName = value; if (_MDataColumn != null) { _MDataColumn.IsNeedRefleshIndex = true;//列名已变更,存储索引也需要变更 } } } /// /// 字段描述 /// public string Description { get; set; } /// /// 是否关键字 /// public bool IsPrimaryKey { get; set; } /// /// 是否自增加 /// public bool IsAutoIncrement { get; set; } /// /// 是否允许为Null /// public bool IsCanNull { get; set; } /// /// 是否唯一索引 /// public bool IsUniqueKey { get; set; } /// /// 是否外键 /// public bool IsForeignKey { get; set; } private object _DefaultValue; /// /// 默认值 /// public object DefaultValue { get { return _DefaultValue; } set { DataGroupType group = DataType.GetGroup(SqlType); if (group == DataGroupType.Number || group == DataGroupType.Bool) { string defaultValue = Convert.ToString(value); if (!string.IsNullOrEmpty(defaultValue) && (defaultValue[0] == 'N' || defaultValue[0] == '(')) { defaultValue = defaultValue.Trim('N', '(', ')');//处理int型默认值(1)带括号的问题。 } _DefaultValue = defaultValue; } else { _DefaultValue = value; } } } private SqlDbType _SqlType; /// /// SqlDbType类型 /// [JsonEnumToString] public SqlDbType SqlType { get { return _SqlType; } set { _SqlType = value; //ValueType = DataType.GetType(_SqlType, DalType,SqlTypeName); } } /// /// 最大字节 /// public int MaxSize { get; set; } /// /// 精度(小数位) /// public short Scale { get; set; } /// /// 原始的数据库字段类型名称 /// internal string SqlTypeName { get; set; } [NonSerialized] internal Type valueType; internal Type ValueType { get { if (valueType == null) { valueType = DataType.GetType(_SqlType, DalType, SqlTypeName); } return valueType; } } private DataBaseType dalType = DataBaseType.None; internal DataBaseType DalType { get { if (_MDataColumn != null) { return _MDataColumn.DataBaseType; } return dalType; } } private AlterOp _AlterOp = AlterOp.None; /// /// 列结构改变状态 /// [JsonIgnore] public AlterOp AlterOp { get { return _AlterOp; } set { _AlterOp = value; } } internal int _ReaderIndex = -1; //内部使用的索引,在字段名为空时使用 internal int ReaderIndex { get { if (_ReaderIndex == -1 && _MDataColumn != null) { return _MDataColumn.GetIndex(this.ColumnName); } return _ReaderIndex; } set { _ReaderIndex = value; } } #region 构造函数 internal MCellStruct(DataBaseType dalType) { this.dalType = dalType; } public MCellStruct(string columnName, SqlDbType sqlType) { Init(columnName, sqlType, false, true, false, -1, null); } public MCellStruct(string columnName, SqlDbType sqlType, bool isAutoIncrement, bool isCanNull, int maxSize) { Init(columnName, sqlType, isAutoIncrement, isCanNull, false, maxSize, null); } internal void Init(string columnName, SqlDbType sqlType, bool isAutoIncrement, bool isCanNull, bool isPrimaryKey, int maxSize, object defaultValue) { ColumnName = columnName.Trim(); SqlType = sqlType; IsAutoIncrement = isAutoIncrement; IsCanNull = isCanNull; MaxSize = maxSize; IsPrimaryKey = isPrimaryKey; DefaultValue = defaultValue; } internal void Load(MCellStruct ms) { ColumnName = ms.ColumnName; SqlTypeName = ms.SqlTypeName; SqlType = ms.SqlType; IsAutoIncrement = ms.IsAutoIncrement; IsCanNull = ms.IsCanNull; MaxSize = ms.MaxSize; Scale = ms.Scale; IsPrimaryKey = ms.IsPrimaryKey; IsUniqueKey = ms.IsUniqueKey; IsForeignKey = ms.IsForeignKey; FKTableName = ms.FKTableName; AlterOp = ms.AlterOp; IsJsonIgnore = ms.IsJsonIgnore; if (ms.DefaultValue != null) { DefaultValue = ms.DefaultValue; } if (!string.IsNullOrEmpty(ms.Description)) { Description = ms.Description; } } /// /// 克隆一个对象。 /// /// public MCellStruct Clone() { MCellStruct ms = new MCellStruct(dalType); ms.ColumnName = ColumnName; ms.SqlTypeName = SqlTypeName; ms.SqlType = SqlType; ms.IsAutoIncrement = IsAutoIncrement; ms.IsCanNull = IsCanNull; ms.MaxSize = MaxSize; ms.Scale = Scale; ms.IsPrimaryKey = IsPrimaryKey; ms.IsUniqueKey = IsUniqueKey; ms.IsForeignKey = IsForeignKey; ms.FKTableName = FKTableName; ms.DefaultValue = DefaultValue; ms.Description = Description; ms.MDataColumn = MDataColumn; ms.AlterOp = AlterOp; ms.TableName = TableName; ms.IsJsonIgnore = IsJsonIgnore; return ms; } #endregion } public partial class MCellStruct // 扩展几个常用方法 { /// /// 为列的所有行设置值 /// public MCellStruct Set(object value) { Set(value, -1); return this; } public MCellStruct Set(object value, int state) { if (_MDataColumn != null) { MDataTable dt = _MDataColumn._Table; if (dt != null && dt.Rows.Count > 0) { int index = _MDataColumn.GetIndex(ColumnName); for (int i = 0; i < dt.Rows.Count; i++) { dt.Rows[i].Set(index, value, state); } } } return this; } /// /// 返回该列的where In 条件 : Name in("aa","bb") /// /// public string GetWhereIn() { if (_MDataColumn != null) { MDataTable dt = _MDataColumn._Table; if (dt != null && dt.Rows.Count > 0) { List items = dt.GetColumnItems(ColumnName, BreakOp.NullOrEmpty, true); if (items != null && items.Count > 0) { return SqlCreate.GetWhereIn(this, items, dalType); } } } return string.Empty; } } }