您的位置:首页 > 数据库

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

2011-04-04 20:11 288 查看
首先使用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)文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐