设计数据库存取层生成工具(四) 生成业务方法
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)文件。
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)文件。
相关文章推荐
- 设计数据库存取层生成工具(三) 定义DAL输出
- 设计数据库存取层生成工具(六) 配置、使用与小结
- 设计数据库存取层生成工具(一) 不用中间件很麻烦,用起来更麻烦
- 设计数据库存取层生成工具(七) 设计操作界面和最终工具下载
- 设计数据库存取层生成工具(零) 数据库操作很零散
- 设计数据库存取层生成工具(二) 定义工具目标
- 设计数据库存取层生成工具(五) 定义用户输入并生成Assembly
- 按Sybase的PowerDesigner工具设计的数据库模型 ---> 解析生成能兼容多种数据库的相应的C#底层代码
- 用PDMReader工具生成数据库设计文档
- 按Sybase的PowerDesigner工具设计的数据库模型 ---> 解析生成能兼容多种数据库的相应的C#底层代码
- windows自带的可生成各种数据库连接字符串工具打开方法
- 按Sybase的PowerDesigner工具设计的数据库模型 ---&gt; 解析生成能兼容多种数据库的相应的C#底层代码
- 用PDMReader工具生成数据库设计文档(转载)
- 基于Java的简单数据库设计生成工具(生成Excel文档)
- sql2005(含“说明”字段)数据库设计文档自动生成方法
- 按Sybase的PowerDesigner工具设计的数据库模型 ---> 解析生成能兼容多种数据库的相应的C#底层代码
- EA强大的画图工具---设计数据库表格
- 数据库设计方法、规范与技巧(2)
- 在会计电算化软件中设计凭证数据库的几种方法转摘(粗浅)
- Entity Framework (先创建数据库Model类,以及操作数据库的方法。 最后从代码生成数据库和数据库模型)