using System; using System.Collections.Generic; using System.Text; using System.Data; using CYQ.Data.SQL; namespace CYQ.Data.Table { /// /// 列结构修选项 /// [Flags] public enum AlterOp { /// /// 默认不修改状态 /// None = 0, /// /// 添加或修改状态 /// AddOrModify = 1, /// /// 删除列状态 /// Drop = 2, /// /// 重命名列状态 /// Rename = 4 } /// /// 单元结构属性 /// public partial class MCellStruct { private MDataColumn _MDataColumn = null; /// /// 结构集合 /// public MDataColumn MDataColumn { get { return _MDataColumn; } internal set { _MDataColumn = value; } } /// /// 是否对值进行格式校验 /// //public bool IsCheckValue = true; /// /// 是否关键字 /// public bool IsPrimaryKey = false; /// /// 是否唯一索引 /// public bool IsUniqueKey = false; /// /// 是否外键 /// public bool IsForeignKey = false; /// /// 外键表名 /// public string FKTableName; /// /// 字段描述 /// public string Description; private object _DefaultValue; /// /// 默认值 /// public object DefaultValue { get { return _DefaultValue; } set { int groupID=DataType.GetGroup(SqlType); if (groupID == 1 || groupID == 3) { 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; } } } /// /// 是否允许为Null /// public bool IsCanNull; /// /// 是否自增加 /// public bool IsAutoIncrement; /// /// 旧的列名(AlterOp为Rename时可用) /// public string OldName; private string _ColumnName = string.Empty; /// /// 列名 /// public string ColumnName { get { return _ColumnName; } set { _ColumnName = value; if (_MDataColumn != null) { _MDataColumn.IsColumnNameChanged = true;//列名已变更,存储索引也需要变更 } } } /// /// 表名 /// public string TableName; private SqlDbType _SqlType; /// /// SqlDbType类型 /// public SqlDbType SqlType { get { return _SqlType; } set { _SqlType = value; ValueType = DataType.GetType(_SqlType, DalType); } } /// /// 最大字节 /// public int MaxSize; /// /// 精度(小数位) /// public short Scale; /// /// 原始的数据库字段类型名称 /// internal string SqlTypeName; internal Type ValueType; private DalType dalType = DalType.None; internal DalType DalType { get { if (_MDataColumn != null) { return _MDataColumn.dalType; } return dalType; } } private AlterOp _AlterOp = AlterOp.None; /// /// 列结构改变状态 /// public AlterOp AlterOp { get { return _AlterOp; } set { _AlterOp = value; } } //内部使用的索引,在字段名为空时使用 internal int ReaderIndex = -1; #region 构造函数 internal MCellStruct(DalType 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; 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; SqlTypeName = ms.SqlTypeName; AlterOp = ms.AlterOp; 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.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.SqlTypeName = SqlTypeName; ms.DefaultValue = DefaultValue; ms.Description = Description; ms.MDataColumn = MDataColumn; ms.AlterOp = AlterOp; ms.TableName = TableName; 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; } } }