using System;
using System.Data;
using System.Collections.Generic;
using CYQ.Data.SQL;
using System.ComponentModel;
using System.Data.SqlTypes;
using System.Collections;
using CYQ.Data.Tool;
namespace CYQ.Data.Table
{
///
/// 单元结构的值
///
internal partial class MCellValue
{
internal bool IsNull = true;
///
/// 状态改变:0;未改(无法插入和更新),1;进行赋值操作[但值相同](允许插入),2:赋值,值不同改变了(允许插入和更新)
///
internal int State = 0;
///
/// 已经Fix()类型转换后的值。
///
internal object Value = null;
///
/// 未进行类型转换之前的值
///
internal object SourceValue = null;
internal string StringValue = null;
///
/// 将值重置为空
///
public void Clear()
{
SourceValue = null;
Value = null;
State = 0;
IsNull = true;
StringValue = null;
}
internal void LoadValue(MCellValue mValue, bool isWithState)
{
SourceValue = mValue.SourceValue;
Value = mValue.Value;
IsNull = mValue.IsNull;
StringValue = mValue.StringValue;
if (isWithState)
{
State = mValue.State;
}
}
}
///
/// 单元格
///
public partial class MDataCell
{
private MCellValue _CellValue;
internal MCellValue CellValue
{
get
{
if (_CellValue == null)
{
_CellValue = new MCellValue();
}
else// if(isNewValue && !IsNull)
{
// CheckNewValue();//修正延时值的问题。
}
return _CellValue;
}
}
private MCellStruct _CellStruct;
#region 构造函数
///
/// 原型模式(Prototype Method)
///
///
internal MDataCell(ref MCellStruct dataStruct)
{
Init(dataStruct, null);
}
internal MDataCell(ref MCellStruct dataStruct, object value)
{
Init(dataStruct, value);
}
#endregion
#region 初始化
private void Init(MCellStruct dataStruct, object value)
{
_CellStruct = dataStruct;
if (value != null)
{
_CellValue = new MCellValue();
Value = value;
}
}
#endregion
#region 属性
///
/// 字符串值
///
public string StringValue
{
get
{
return CellValue.StringValue;
}
}
private bool isNewValue = false;
private bool isAllowChangeState = true;
///
/// 值
///
public object Value
{
get
{
//值的检测延时到获取属性时触发
CheckNewValue();
return CellValue.Value;
}
set
{
isAllowChangeState = true;
CellValue.StringValue = Convert.ToString(value);
CellValue.SourceValue = value;
NullCheck();//进行Null检测
}
}
///
/// 是否忽略Json转换
///
internal bool IsJsonIgnore
{
get
{
return _CellStruct.IsJsonIgnore;
}
}
///
/// 延时检测值的类型
///
private void CheckNewValue()
{
if (isNewValue && !IsNull)
{
FixValue();
}
}
private void NullCheck()
{
bool valueIsNull = CellValue.SourceValue == null || CellValue.SourceValue == DBNull.Value;
if (!valueIsNull && CellValue.StringValue.Length == 0 && DataType.GetGroup(_CellStruct.SqlType) > 0)
{
valueIsNull = true;
}
if (valueIsNull)
{
if (CellValue.IsNull)
{
CellValue.State = (CellValue.SourceValue == DBNull.Value) ? 2 : 1;
}
else
{
if (isAllowChangeState)
{
CellValue.State = 2;
}
CellValue.Value = null;
CellValue.IsNull = true;
}
isAllowChangeState = false;
}
else
{
CellValue.IsNull = false;
isNewValue = true;
isAllowChangeState = true;
}
}
internal void FixValue()
{
object value = CellValue.SourceValue;
DataGroupType group = DataType.GetGroup(_CellStruct.SqlType);
if (_CellStruct.SqlType != SqlDbType.Variant)
{
value = ChangeValue(value, _CellStruct.ValueType, group);
if (value == null)
{
return;
}
}
if (isAllowChangeState)
{
if (CellValue.Value == null || CellValue.Value == DBNull.Value)
{
CellValue.State = 2;
}
else if (CellValue.Value.Equals(value) || (group != DataGroupType.Object && CellValue.Value.ToString() == StringValue))//对象的比较值,用==号则比例引用地址。
{
CellValue.State = 1;
}
else
{
CellValue.State = 2;
}
}
CellValue.Value = value;
isNewValue = false;
isAllowChangeState = false;//恢复可设置状态。
}
///
/// 值的数据类型转换。
///
/// 要被转换的值
/// 要转换成哪种类型
/// 数据库类型的组号
///
internal object ChangeValue(object value, Type convertionType, DataGroupType group)
{
//值不为null
try
{
switch (group)
{
case DataGroupType.Text:
if (_CellStruct.SqlType == SqlDbType.Time)//time类型的特殊处理。
{
string[] items = StringValue.Split(' ');
if (items.Length > 1)
{
CellValue.StringValue = items[1];
}
}
value = StringValue;
break;
default:
value = ConvertTool.ChangeType(value, convertionType);
//if (convertionType.Name.EndsWith("[]"))
//{
// value = Convert.FromBase64String(StringValue);
// CellValue.StringValue = "System.Byte[]";
//}
//else
//{
//}
break;
}
}
catch (Exception err)
{
CellValue.Value = null;
CellValue.IsNull = true;
CellValue.StringValue = null;
isNewValue = false;
string msg = string.Format("【MDataCell.ChangeValue】ChangeType Error:ColumnName【{0}】({1}) , Value:【{2}】\r\n", _CellStruct.ColumnName, _CellStruct.ValueType.FullName, StringValue);
Log.Write(msg, LogType.Error);
return null;
}
return value;
}
internal T Get()
{
if (CellValue.IsNull)
{
return default(T);
}
return ConvertTool.ChangeType(Value);
//if (isNewValue)
//{
// Type t = typeof(T);
// return (T)ChangeValue(CellValue.SourceValue, t, DataType.GetGroup(DataType.GetSqlType(t)));
//}
// return (T)Value;
}
///
/// 值是否为Null值[只读属性]
///
public bool IsNull
{
get
{
return CellValue.IsNull;
}
internal set
{
CellValue.IsNull = value;
}
}
///
/// 值是否为Null或为空[只读属性]
///
public bool IsNullOrEmpty
{
get
{
return CellValue.IsNull || StringValue.Length == 0;
}
}
///
/// 列名[只读属性]
///
public string ColumnName
{
get
{
return _CellStruct.ColumnName;
}
}
///
/// 单元格的结构
///
public MCellStruct Struct
{
get
{
return _CellStruct;
}
}
///
/// Value的状态:0;未改,1;进行赋值操作[但值相同],2:赋值,值不同改变了
///
public int State
{
get
{
if (isAllowChangeState)
{
CheckNewValue();
}
return CellValue.State;
}
set
{
//如果设值(延时加载),又设置状态(在获取时设置的状态会失效)
if (isNewValue) { isAllowChangeState = false; }
CellValue.State = value;
}
}
#endregion
#region 方法
///
/// 将值重置为空
///
public void Clear()
{
isNewValue = false;
isAllowChangeState = true;
CellValue.Clear();
}
internal void LoadValue(MDataCell cell, bool isWithState)
{
isNewValue = true;
cell.CheckNewValue();//还原完整的值状态。
CellValue.LoadValue(cell.CellValue, isWithState);
if (isWithState) { isAllowChangeState = false; }
}
///
/// 设置默认值。
///
internal void SetDefaultValueToValue()
{
if (Convert.ToString(_CellStruct.DefaultValue).Length > 0)
{
switch (DataType.GetGroup(_CellStruct.SqlType))
{
case DataGroupType.Date:
Value = DateTime.Now;
break;
case DataGroupType.Guid:
if (_CellStruct.DefaultValue.ToString().Length == 36)
{
Value = new Guid(_CellStruct.DefaultValue.ToString());
}
else
{
Value = Guid.NewGuid();
}
break;
default:
Value = _CellStruct.DefaultValue;
break;
}
}
}
///
/// 已被重载,默认返回Value值。
///
///
public override string ToString()
{
return _CellStruct.SqlType == SqlDbType.Int ? Convert.ToString(Value) : (StringValue ?? "");//int 是处理枚举判断。
}
///
/// 是否值相同[已重写该方法]
///
public override bool Equals(object value)
{
bool valueIsNull = (value == null || value == DBNull.Value);
if (CellValue.IsNull)
{
return valueIsNull;
}
if (valueIsNull)
{
return CellValue.IsNull;
}
return StringValue.ToLower() == Convert.ToString(value).ToLower();
}
///
/// 转成行
///
internal MDataRow ToRow()
{
MDataRow row = new MDataRow();
row.Add(this);
return row;
}
#endregion
}
//扩展交互部分
public partial class MDataCell
{
internal string ToXml(bool isConvertNameToLower)
{
string text = StringValue ?? "";
switch (DataType.GetGroup(_CellStruct.SqlType))
{
case DataGroupType.Object:
MDataRow row = null;
MDataTable table = null;
Type t = Value.GetType();
if (!t.FullName.StartsWith("System."))//普通对象。
{
row = new MDataRow(TableSchema.GetColumnByType(t));
row.LoadFrom(Value);
}
else if (Value is IEnumerable)
{
int len = ReflectTool.GetArgumentLength(ref t);
if (len == 1)
{
table = MDataTable.CreateFrom(Value);
}
else if (len == 2)
{
row = MDataRow.CreateFrom(Value);
}
}
if (row != null)
{
text = row.ToXml(isConvertNameToLower);
}
else if (table != null)
{
text = string.Empty;
foreach (MDataRow r in table.Rows)
{
text += r.ToXml(isConvertNameToLower);
}
text += "\r\n ";
}
return string.Format("\r\n <{0}>{1}{0}>", isConvertNameToLower ? ColumnName.ToLower() : ColumnName, text);
default:
if (text.LastIndexOfAny(new char[] { '<', '>', '&' }) > -1 && !text.StartsWith("";
}
return string.Format("\r\n <{0}>{1}{0}>", isConvertNameToLower ? ColumnName.ToLower() : ColumnName, text);
}
}
}
}