/// <summary> /// 条件比较 /// </summary> private static bool GetTFilterOk(string where, int quoteIndex, string sign, Op op, MDataColumn mdc, out TFilter tFilter) { bool result = false; tFilter = null; int index = where.ToLower().IndexOf(sign, 0, quoteIndex > 0 ? quoteIndex : where.Length); if (index > 0) { string columnAName = where.Substring(0, index).Trim(); int columnAIndex = mdc.GetIndex(columnAName); string valueB = where.Substring(index + sign.Length).Trim(' ', '\'').Replace("''", "'"); if (op == Op.In || op == Op.NotIn) { valueB = ',' + valueB.TrimStart('(', ')').Replace("'", "") + ",";//去除单引号。 } int columnBIndex = -1; if (quoteIndex == 0 && mdc.Contains(valueB)) //判断右侧的是否列名。 { columnBIndex = mdc.GetIndex(valueB); } tFilter = new TFilter(Ao.None, columnAName, columnAIndex, op, valueB, columnBIndex); if (columnBIndex == -1 && !string.IsNullOrEmpty(Convert.ToString(valueB))) //右侧是值类型,转换值的类型。 { if (columnAIndex > -1 && DataType.GetGroup(mdc[columnAIndex].SqlType) == 3) //bool型 { switch (Convert.ToString(tFilter._valueB).ToLower()) { case "true": case "1": case "on": tFilter._valueB = true; break; case "false": case "0": case "": tFilter._valueB = false; break; default: tFilter._valueB = null; break; } } else { try { tFilter._valueB = ConvertTool.ChangeType(tFilter._valueB, columnAIndex > -1 ? typeof(string) : mdc[columnAIndex].ValueType); } catch { } } } result = true; } return(result); }
/// <summary> /// 进行列修正(只有移除 和 修正类型,若无主键列,则新增主键列) /// </summary> private void FixTable(MDataColumn column) { if (column.Count > 0) { bool tableIsChange = false; for (int i = mdt.Columns.Count - 1; i >= 0; i--) { if (!column.Contains(mdt.Columns[i].ColumnName))//没有此列 { if (!tableIsChange) { mdt = mdt.Clone();//列需要变化时,克隆一份,不变更原有数据。 tableIsChange = true; } mdt.Columns.RemoveAt(i); } else { MCellStruct ms = column[mdt.Columns[i].ColumnName]; //新表的字段 Type valueType = mdt.Columns[i].ValueType; //存档的字段的值的原始类型。 bool isChangeType = mdt.Columns[i].SqlType != ms.SqlType; mdt.Columns[i].Load(ms); if (isChangeType) { //修正数据的数据类型。 foreach (MDataRow row in mdt.Rows) { row[i].FixValue();//重新自我赋值修正数据类型。 } } } } //主键检测,若没有,则补充主键 if (column.JointPrimary != null && column.JointPrimary.Count > 0) { if (!mdt.Columns.Contains(column[0].ColumnName) && (column[0].IsPrimaryKey || column[0].IsAutoIncrement)) { MCellStruct ms = column[0].Clone(); mdt = mdt.Clone();//列需要变化时,克隆一份,不变更原有数据。 ms.MDataColumn = null; mdt.Columns.Insert(0, ms); } } } }