文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>设计数据库存取层生成工具(三) 生成业务方法

设计数据库存取层生成工具(三) 生成业务方法

时间:2011-04-04  来源:hejiang's blog

首先使用Emit生成一个业务类。显然这个类应该从我们预先准备好的DbOperation继承而来,以便支持事务:

        public TypeBuilder BuildClass(ModuleBuilder module, string typeName)
        {
            TypeBuilder type = module.DefineType(typeName,
                TypeAttributes.Public | TypeAttributes.AutoClass |
                TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit,
                typeof(DbOperation));

            BuildConstructor(type);

            return type;
        }

然后我们来生成一个业务方法:

        public void BuildMethod(TypeBuilder type,
            string methodName, string methodType,
            string sqlText, CommandType sqlType,
            IList<DbParamEntry> sqlParams,
            string retTypeName, string retTypeFlag)
        {
            // 1. build parameter name and type array
            string[] methodParamNames = new string[sqlParams.Count];
            Type[] methodParamTypes = new Type[sqlParams.Count];
            for (int i = 0; i < sqlParams.Count; ++i)
            {
                DbParamEntry pe = (DbParamEntry)sqlParams[i];

                // build methodParamNames
                char[] arr = pe.Name.ToCharArray(1, pe.Name.Length - 1);
                arr[0] = char.ToLower(arr[0]);
                methodParamNames[i] = new string(arr);

                methodParamTypes[i] = ConvertDbTypeToDotNetType(pe.DbType);
            }

            // 2. get return type
            string dbCommandMethodName = GetDbOperationMethodName(methodType);
            Type originalType = GetDbCommandReturnType(dbCommandMethodName);
            Type returnType = GetReturnType(originalType,
                methodName, methodParamTypes, retTypeName, retTypeFlag);

            // 3. create method and set parameter name
            MethodBuilder mBuilder = type.DefineMethod(methodName,
                MethodAttributes.Public | MethodAttributes.HideBySig,
                returnType, methodParamTypes);
            for (int i = 0; i < methodParamNames.Length; ++i)
                mBuilder.DefineParameter(i + 1, ParameterAttributes.None,
                    methodParamNames[i]);

            // 4. get ILGenerator
            ILGenerator gen = mBuilder.GetILGenerator();

            // 5. Call Db Command Method
            EmitCallDbCommandMethod(gen, dbCommandMethodName,
                sqlText, sqlType, sqlParams);

            // 7. Convert return type
            EmitConvertReturnType(gen, methodName, originalType, returnType);

            // 8. Seal method
            gen.Emit(OpCodes.Ret);
        }

这里的type就是我们刚才BuildClass的返回值;methodName是生成的业务方法名称;methodType指方法的类型(查询方法Query或非查询方法NonQuery);sqlText是SQL正文;sqlType是sqlText的类型(Text, StoredProcedure或Table);sqlParams是查询参数列表;retTypeName是返回参数类型名称(这个类型可以根据sql自动生成,将来我们可以看到);retTypeFlag可以是"Vector"或"Scalar",以指明是返回标量(单个记录)或向量(一组记录)。

到这里,我们的工具主体就定义完整了。明天我们来定义输入的xml文件,将需要用到的信息维护进去,然后由生成工具读取,生成DAL类(DLL)文件。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载