Ejemplo n.º 1
0
        /// <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);
             }
         }
     }
 }