Пример #1
0
 void appendCode(MethodInformation method, string code1, ref string code)
 {
     if (!string.IsNullOrEmpty(code1))
     {
         code1 = "\r\n" + code1;
         method.append(ref code, LeftSpaceLevel.one, code1);
         method.append(ref code, LeftSpaceLevel.one, "");
     }
 }
Пример #2
0
        /// <summary>
        /// 在接口代理方法内自定义执行实例接口方法及数据处理代码
        /// </summary>
        /// <param name="method">接口方法信息对象</param>
        /// <returns>string类型,返回自定义执行接口方法及数据处理代码字符串</returns>
        public virtual string ExecuteInterfaceMethodCodeString(MethodInformation method)
        {
            MethodComponent mc   = method.methodComponent;
            string          code = "";

            if (null == method.ofInstanceType)
            {
                method.append(ref code, LeftSpaceLevel.one, "throw new Exception(\"接口 {0} 不存在对应的实例\");", method.ofInterfaceType.FullName);
                return(code);
            }
            string resultVarName = string.IsNullOrEmpty(mc.ResultVariantName) ? "" : (mc.ResultVariantName + " = ");

            method.append(ref code, LeftSpaceLevel.one, "{0}{1}.{2}{3}({4});", resultVarName, mc.InstanceVariantName, mc.InterfaceMethodName, mc.GenericityParas, mc.MethodParas);
            return(code);
        }
Пример #3
0
        void ReturnResult(MethodInformation method, LeftSpaceLevel leftSpaceLevel, DataOptType dataOptType, string funcResultVarName, string resultVarName, ref string code)
        {
            Type resultType = method.methodInfo.ReturnType;

            if (DataOptType.insert == dataOptType || DataOptType.update == dataOptType || DataOptType.delete == dataOptType)
            {
                if (typeof(bool) == resultType || typeof(Boolean) == resultType)
                {
                    method.append(ref code, leftSpaceLevel, "{0} = 0 < {1};", funcResultVarName, resultVarName);
                }
                else
                {
                    method.append(ref code, leftSpaceLevel, "{0} = {1};", funcResultVarName, resultVarName);
                }
            }
            else
            {
                method.append(ref code, leftSpaceLevel, "{0} = {1};", funcResultVarName, resultVarName);
            }
        }
Пример #4
0
        void ExecuteSqlCode(MethodInformation method, LeftSpaceLevel leftSpaceLevel, DataOptType dataOptType, string sqlVarName, string paraListVarName, string dbHelperVarName, string returnVarName, ref string code)
        {
            if (DataOptType.select == dataOptType)
            {
                return;
            }
            //method.append(ref code, leftSpaceLevel, "");
            string methodName = "";

            if (DataOptType.none == method.sqlExecType)
            {
                switch (dataOptType)
                {
                case DataOptType.insert:
                    methodName = "insert";
                    break;

                case DataOptType.update:
                    methodName = "update";
                    break;

                case DataOptType.delete:
                    methodName = "delete";
                    break;
                }
            }
            else
            {
                methodName = Enum.GetName(typeof(DataOptType), method.sqlExecType);
            }

            string autCall       = method.AutoCallVarName;
            string enabledBuffer = method.methodComponent.EnabledBuffer.ToString().ToLower();

            enabledBuffer = method.methodComponent.IsAsync ? "true" : enabledBuffer;
            method.append(ref code, leftSpaceLevel, "if(null != {0})", dbHelperVarName);
            method.append(ref code, leftSpaceLevel, "{");
            if (DataOptType.select == method.sqlExecType || (DataOptType.procedure == dataOptType && DJTools.IsBaseType(method.methodComponent.ResultType)))
            {
                string dbTag = DJTools.GetParaTagByDbDialect(DataAdapter.dbDialect);
                method.append(ref code, leftSpaceLevel + 1, "{0} = {0}.Replace(\"{1}\", \"{2}\");", sqlVarName, procParaSign, dbTag);
                method.append(ref code, leftSpaceLevel + 1, "dbHelper.query({0}, {1}, {2}, {3}, dataTable =>", autCall, sqlVarName, paraListVarName, enabledBuffer);
                method.append(ref code, leftSpaceLevel + 1, "{");
                #region ***** action
                method.append(ref code, leftSpaceLevel + 2, "dataTable = null == dataTable ? new System.Data.DataTable() : dataTable;");
                method.append(ref code, leftSpaceLevel + 2, "if(0 < dataTable.Rows.Count)");
                method.append(ref code, leftSpaceLevel + 2, "{");
                method.append(ref code, leftSpaceLevel + 3, "string valStr = System.DBNull.Value == dataTable.Rows[0][0] ? \"\" : dataTable.Rows[0][0].ToString();");
                if (baseTypeWithResult(method))
                {
                    method.append(ref code, leftSpaceLevel + 3, "int tempVal = 0;");
                    method.append(ref code, leftSpaceLevel + 3, "int.TryParse(valStr, out tempVal);");
                    method.append(ref code, leftSpaceLevel + 3, "{0} = tempVal;", returnVarName);
                }
                else if (typeof(string) == method.methodComponent.ResultType)
                {
                    method.append(ref code, leftSpaceLevel + 3, "{0} = valStr;", returnVarName);
                }
                else
                {
                    method.append(ref code, leftSpaceLevel + 3, "{0}.TryParse(valStr, out {1});", method.methodComponent.ResultType.FullName, returnVarName);
                }

                method.append(ref code, leftSpaceLevel + 2, "}");
                method.append(ref code, leftSpaceLevel + 2, "else");
                method.append(ref code, leftSpaceLevel + 2, "{");
                method.append(ref code, leftSpaceLevel + 3, "{0} = 0;", returnVarName);
                method.append(ref code, leftSpaceLevel + 2, "}");
                if (null != method.methodComponent.ActionType)
                {
                    method.append(ref code, leftSpaceLevel + 2, "{0}({1});", method.methodComponent.ActionParaName, returnVarName);
                }
                #endregion
                method.append(ref code, leftSpaceLevel + 1, "}, ref err);");
            }
            else
            {
                method.append(ref code, leftSpaceLevel + 1, "{0} += dbHelper.{1}({2}, {3}, {4},{5}, resultNum =>", returnVarName, methodName, autCall, sqlVarName, paraListVarName, enabledBuffer);
                method.append(ref code, leftSpaceLevel + 1, "{");
                #region ***** action
                method.append(ref code, leftSpaceLevel + 2, "{0} += resultNum;", returnVarName);
                if (null != method.methodComponent.ActionType)
                {
                    method.append(ref code, leftSpaceLevel + 2, "{0}(resultNum);", method.methodComponent.ActionParaName, returnVarName);
                }
                #endregion
                method.append(ref code, leftSpaceLevel + 1, "}, ref err);");
            }
            method.append(ref code, leftSpaceLevel + 1, "");
            method.append(ref code, leftSpaceLevel + 1, "if(!string.IsNullOrEmpty(err))");
            method.append(ref code, leftSpaceLevel + 1, "{");
            method.append(ref code, leftSpaceLevel + 2, "throw new Exception(err);");
            method.append(ref code, leftSpaceLevel + 1, "}");
            method.append(ref code, leftSpaceLevel, "}");
        }
Пример #5
0
        public string GetParametersBySqlParameter(string sql, string sqlVarName, MethodInformation method, DataOptType dataOptType, ref string dbParaListVarName)
        {
            string code            = "";
            string sql1            = sql;
            string executeDbHelper = "{ExecuteDbHelper#}";
            string leftSpace       = "";
            Regex  rg = rgParaField;

            if (string.IsNullOrEmpty(dbParaListVarName) || dbParaListVarName.ToLower().Equals("null"))
            {
                dbParaListVarName = "dbParaList";
                method.append(ref code, LeftSpaceLevel.one, "DbList<System.Data.Common.DbParameter> {0} = new DbList<System.Data.Common.DbParameter>();", dbParaListVarName);
            }

            string dbHelperVarName   = "dbHelper";
            string resultVarName     = "successVal";
            string funcResultVarName = method.methodComponent.ResultVariantName;

            if (baseTypeWithResult(method))
            {
                method.append(ref code, LeftSpaceLevel.one, "int {0} = 0;", resultVarName);
            }
            else
            {
                method.append(ref code, LeftSpaceLevel.one, "{0} {1} = default({0});", method.methodComponent.ResultType.FullName, resultVarName);
            }
            method.append(ref code, LeftSpaceLevel.one, "string err = \"\";");
            method.append(ref code, LeftSpaceLevel.one, "IDbHelper {0} = ImplementAdapter.DbHelper;", dbHelperVarName);

            if (rg.IsMatch(sql) && 0 < method.paraList.Count)
            {
                string LeftSign     = "";
                string EndSign      = "";
                string DbTag        = "";
                string FieldName    = "";
                string autoCallName = method.AutoCallVarName;
                Match  match        = null;

                EList <CKeyValue> sqlParaList1    = new EList <CKeyValue>();
                string            sqlParasVarName = "sqlParaList";
                method.append(ref code, LeftSpaceLevel.one, "EList<CKeyValue> {0} = new EList<CKeyValue>();", sqlParasVarName);
                int n = 0;
                while (rg.IsMatch(sql1) && 200 > n)
                {
                    match    = rg.Match(sql1);
                    LeftSign = match.Groups["LeftSign"].Value;
                    EndSign  = match.Groups["EndSign"].Value;
                    if (isEnabledField(LeftSign))
                    {
                        if (string.IsNullOrEmpty(DbTag))
                        {
                            DbTag = match.Groups["DbTag"].Value;
                        }
                        FieldName = match.Groups["FieldName"].Value;
                        method.append(ref code, LeftSpaceLevel.one, "{0}.Add(new CKeyValue(){ Key = \"{1}\", Value = \"{2}\", other = \"{3}\" });", sqlParasVarName, FieldName.ToLower(), FieldName, DbTag);
                        sqlParaList1.Add(new CKeyValue()
                        {
                            Key = FieldName.ToLower(), Value = FieldName, other = DbTag
                        });
                    }

                    sql1 = sql1.Replace(match.Groups[0].Value, "");
                    sql1 = EndSign + sql1;
                    n++;
                }

                Regex        rg1           = new Regex(@"\`[0-9]+\[");
                CKeyValue    kv            = null;
                PList <Para> paraList      = method.paraList;
                string       paraClassName = ""; //DJTools.GetParamertClassNameByDbTag(DbTag);

                foreach (Para para in paraList)
                {
                    if (para.ParaType.BaseType == typeof(System.MulticastDelegate) && rg1.IsMatch(para.ParaType.ToString()))
                    {
                        continue;
                    }
                    if (DJTools.IsBaseType(para.ParaType))
                    {
                        //方法参数为基本类型 string, int, bool 等
                        kv = sqlParaList1[para.ParaName.ToLower()];
                        if (null == kv)
                        {
                            continue;
                        }
                        method.append(ref code, LeftSpaceLevel.one, "{0}.Add(\"{2}\", {3});", dbParaListVarName, paraClassName, kv.Value.ToString(), para.ParaName);
                    }
                    else
                    {
                        LeftSpaceLevel leftSpaceLevel = LeftSpaceLevel.one;
                        if (null != para.ParaType.GetInterface("IEnumerable"))
                        {
                            //集合复杂类型
                            //ICollection collection = (ICollection)para.ParaValue;
                            method.append(ref code, LeftSpaceLevel.one, "");
                            method.append(ref code, LeftSpaceLevel.one, "System.Collections.ICollection collection = (System.Collections.ICollection){0};", para.ParaName);

                            method.append(ref code, LeftSpaceLevel.one, "");

                            if (null != para.ParaType.GetInterface("IDictionary"))
                            {
                                method.append(ref code, leftSpaceLevel, "//键值对情况");
                                method.append(ref code, leftSpaceLevel, "object vObj = null;");
                                method.append(ref code, leftSpaceLevel, "string key = \"\";");
                                method.append(ref code, leftSpaceLevel, "foreach (var item in collection)");
                                method.append(ref code, leftSpaceLevel, "{");
                                method.append(ref code, leftSpaceLevel + 1, "key = item.GetType().GetProperty(\"Key\").GetValue(item, null).ToString();");
                                method.append(ref code, leftSpaceLevel + 1, "vObj = item.GetType().GetProperty(\"Value\").GetValue(item, null);");
                                method.append(ref code, leftSpaceLevel + 1, "if (DJTools.IsBaseType(vObj.GetType())) break;");
                                method.append(ref code, leftSpaceLevel + 1, "if (null != vObj.GetType().GetInterface(\"IEnumerable\")) break;");
                                method.append(ref code, leftSpaceLevel + 1, "//值必须是简单类型:int, string, bool, float, double等");
                                method.append(ref code, leftSpaceLevel + 1, "");
                                //Type dataType, string dbTag, object data, string fieldName, List<DbParameter> dbParas
                                method.append(ref code, leftSpaceLevel + 1, "{0}.GetDbParaByBaseType(typeof(string),\"{1}\",vObj,key,{2});", autoCallName, DbTag, dbParaListVarName);
                                method.append(ref code, leftSpaceLevel + 1, "");

                                method.append(ref code, leftSpaceLevel, "}"); //foreach (var item in collection)
                            }
                            else if (null != para.ParaType.GetInterface("IList") || para.ParaType.IsArray)
                            {
                                leftSpace = method.StartSpace + method.getSpace((int)leftSpaceLevel);
                                method.append(ref code, leftSpaceLevel, "//List集合情况 或 数组情况");
                                method.append(ref code, leftSpaceLevel, "foreach (var item in collection)");
                                method.append(ref code, leftSpaceLevel, "{");
                                method.append(ref code, leftSpaceLevel + 1, "if (DJTools.IsBaseType(item.GetType())) break;");
                                method.append(ref code, leftSpaceLevel + 1, "if (null != item.GetType().GetInterface(\"IEnumerable\")) break;");
                                method.append(ref code, leftSpaceLevel + 1, "//集合元素必须是单体复杂对象(数据实体)");
                                //object entity, List<DbParameter> dbParas, EList<CKeyValue> paraNameList
                                method.append(ref code, leftSpaceLevel + 1, "{0}.GetDbParaListByEntity(item,{1},{2});", autoCallName, dbParaListVarName, sqlParasVarName);
                                code += "\r\n" + executeDbHelper;
                                method.append(ref code, leftSpaceLevel + 1, "");
                                method.append(ref code, leftSpaceLevel, "}"); //foreach (var item in collection)
                            }
                        }
                        else if (typeof(DataTable) == para.ParaType)
                        {
                            leftSpace = method.StartSpace + method.getSpace((int)leftSpaceLevel);
                            method.append(ref code, LeftSpaceLevel.one, "");
                            method.append(ref code, LeftSpaceLevel.one, "{0} = null == {0} ? new System.Data.DataTable() : {0};", para.ParaName);
                            method.append(ref code, LeftSpaceLevel.one, "System.Data.DataTable dtable = (System.Data.DataTable){0};", para.ParaName);
                            method.append(ref code, LeftSpaceLevel.one, "EList<CKeyValue> tableColumns = new EList<CKeyValue>();");
                            method.append(ref code, LeftSpaceLevel.one, "");

                            method.append(ref code, leftSpaceLevel, "foreach(System.Data.DataColumn c in dtable.Columns)");
                            method.append(ref code, leftSpaceLevel, "{");
                            method.append(ref code, leftSpaceLevel + 1, "tableColumns.Add(new CKeyValue(){ Key = c.ColumnName.ToLower(), Value = c.ColumnName, other = c.DataType });");
                            method.append(ref code, leftSpaceLevel, "}");
                            method.append(ref code, leftSpaceLevel, "");

                            method.append(ref code, leftSpaceLevel, "foreach(System.Data.DataRow dr in dtable.Rows)");
                            method.append(ref code, leftSpaceLevel, "{");
                            //GetDbParaByDataRow(DataRow row, List<DbParameter> dbParas, EList<CKeyValue> sqlParaNameList, EList<CKeyValue> tableColumns)
                            method.append(ref code, leftSpaceLevel + 1, "{0}.GetDbParaByDataRow(dr,{1},{2},tableColumns);", autoCallName, dbParaListVarName, sqlParasVarName);
                            code += "\r\n" + executeDbHelper;
                            method.append(ref code, leftSpaceLevel + 1, "");
                            method.append(ref code, leftSpaceLevel, "}");//foreach(var dr in dtable.Rows)
                        }
                        else
                        {
                            //单体复杂类型(数据实体)
                            //object entity, List<DbParameter> dbParas, EList<CKeyValue> paraNameList
                            method.append(ref code, LeftSpaceLevel.one, "");
                            method.append(ref code, LeftSpaceLevel.one, "//单体复杂类型(数据实体) ");
                            method.append(ref code, LeftSpaceLevel.one, "{0}.GetDbParaListByEntity({1},{2},{3});", autoCallName, para.ParaName, dbParaListVarName, sqlParasVarName);
                            method.append(ref code, LeftSpaceLevel.one, "");
                        }
                    }
                }
            }

            if (string.IsNullOrEmpty(leftSpace))
            {
                method.append(ref code, LeftSpaceLevel.one, "");
                ExecuteSqlCode(method, LeftSpaceLevel.one, dataOptType, sqlVarName, dbParaListVarName, dbHelperVarName, resultVarName, ref code);
            }
            else
            {
                string code1 = "";
                ExecuteSqlCode(method, LeftSpaceLevel.two, dataOptType, sqlVarName, dbParaListVarName, dbHelperVarName, resultVarName, ref code1);
                code = code.Replace(executeDbHelper, code1);
            }

            if (!string.IsNullOrEmpty(funcResultVarName))
            {
                method.append(ref code, LeftSpaceLevel.one, "");
                if (null == method.methodComponent.ActionType)
                {
                    ReturnResult(method, LeftSpaceLevel.one, dataOptType, funcResultVarName, resultVarName, ref code);
                }
                else
                {
                    method.append(ref code, LeftSpaceLevel.one, "{0} = {1};", funcResultVarName, resultVarName);
                }
            }

            return(code);
        }
Пример #6
0
        public T Exec <T>(MethodInformation method, DataOptType dataOptType, Action <T> action, string sql)
        {
            T        result   = default(T);
            AutoCall autoCall = (AutoCall)method.AutoCall;

            dynamicWhere(method, ref sql);

            IList <DataEntity <DataElement> > dataElements  = null;
            DataEntity <DataElement>          dataElements1 = null;
            DbList <DbParameter> dbParameters = null;

            if (0 < method.paraList.Count)
            {
                foreach (Para item in method.paraList)
                {
                    if (null != item.ParaValue)
                    {
                        if (null != item.ParaValue as IList <DataEntity <DataElement> > )
                        {
                            dataElements = item.ParaValue as IList <DataEntity <DataElement> >;
                            break;
                        }
                        else if (null != item.ParaValue as DataEntity <DataElement> )
                        {
                            dataElements  = new List <DataEntity <DataElement> >();
                            dataElements1 = item.ParaValue as DataEntity <DataElement>;
                            dataElements.Add(dataElements1);
                            break;
                        }
                    }
                }
            }

            if (null == dataElements)
            {
                dataElements = new List <DataEntity <DataElement> >();
            }

            string err           = "";
            bool   EnabledBuffer = method.methodComponent.EnabledBuffer;

            EnabledBuffer = method.methodComponent.IsAsync ? true : EnabledBuffer;

            if (DataOptType.select == dataOptType ||
                DataOptType.count == dataOptType ||
                DataOptType.procedure == dataOptType)
            {
                if (0 < dataElements.Count)
                {
                    dataElements1 = dataElements[0];
                }
                dbParameters = GetDbParameters(method, dataElements1, sql);
                GetSqlByProvider(method, dbParameters, ref sql);
                dbHelper.query(autoCall, sql, dbParameters, EnabledBuffer, (dt) =>
                {
                    DynamicCodeAutoCall dynamicCodeAutoCall = new DynamicCodeAutoCall();
                    string execClassPath  = "";
                    string execMethodName = "";
                    bool paraExsit        = false;
                    Type returnType       = dynamicCodeAutoCall.GetParaTypeOfResultExecMethod(method, ref execClassPath, ref execMethodName, ref paraExsit);
                    if (paraExsit)
                    {
                        Type resultExecMethodType = execClassPath.GetClassTypeByPath();

                        if (null == resultExecMethodType)
                        {
                            err = "The ClassPath '" + execClassPath + "' is not exist.";
                            autoCall.e(err, ErrorLevels.dangerous);
                            throw new Exception(err);
                        }

                        object clsObj         = null;
                        MethodInfo methodInfo = resultExecMethodType.GetMethod(execMethodName);
                        if (null != methodInfo)
                        {
                            if (methodInfo.ReturnType != typeof(T))
                            {
                                err        = "";
                                string msg = "The return value type of the method '{0}' of the class '{1}' and the method '{2}' of the interface '{3}' are not the same.";
                                method.append(ref err, 0, msg, execMethodName, execClassPath, method.methodInfo.Name, method.methodInfo.DeclaringType.FullName);
                                autoCall.e(err, ErrorLevels.dangerous);
                                throw new Exception(err);
                            }

                            object vData = dataTableTo(method, dt, returnType);
                            try
                            {
                                clsObj = Activator.CreateInstance(resultExecMethodType);
                                result = (T)methodInfo.Invoke(clsObj, new object[] { vData });
                            }
                            catch (Exception ex)
                            {
                                autoCall.e(ex.ToString(), ErrorLevels.dangerous);
                                //throw;
                            }
                        }
                    }
                    else
                    {
                        result = dataTableTo <T>(method, dt);
                    }

                    if (null != action)
                    {
                        action(result);
                    }
                }, ref err);
            }
            else
            {
                int           n          = 0;
                Func <int, T> funcResult = n1 =>
                {
                    object v = n1;
                    if (typeof(bool) == typeof(T))
                    {
                        v = 0 < n1;
                    }
                    return((T)v);
                };

                foreach (DataEntity <DataElement> item in dataElements)
                {
                    dbParameters = GetDbParameters(method, item, sql);
                    switch (dataOptType)
                    {
                    case DataOptType.insert:
                        dbHelper.insert(autoCall, sql, dbParameters, EnabledBuffer, (num) =>
                        {
                            n     += num;
                            result = funcResult(n);
                            if (null != action)
                            {
                                action(result);
                            }
                        }, ref err);
                        break;

                    case DataOptType.update:
                        dbHelper.update(autoCall, sql, dbParameters, EnabledBuffer, (num) =>
                        {
                            n     += num;
                            result = funcResult(n);
                            if (null != action)
                            {
                                action(result);
                            }
                        }, ref err);
                        break;

                    case DataOptType.delete:
                        dbHelper.delete(autoCall, sql, dbParameters, EnabledBuffer, (num) =>
                        {
                            n     += num;
                            result = funcResult(n);
                            if (null != action)
                            {
                                action(result);
                            }
                        }, ref err);
                        break;
                    }
                }

                result = funcResult(n);
            }
            return(result);
        }