返回首页

简介
此应用程序生成并保存在运行时的大会,它代表了SQL表结构作为输入传递。在运行时生成的汇编集定义的属性和每列的DB table.nbsp访问器;
此应用程序(工具)允许应用程序开发,集成这个库,生成SQL表结构,这是作为输入运行时程序集中的类型。因此,他可以创造anbsp;收集这些类型的大会,并做所需的操作。代码是如何工作的呢?
代码检索从SQL数据库(SQL服务器主要)的SQL表的架构,然后返回到DynamicCreator。每一行迭代后,ColumnName和数据类型是确定和等效的。NET类型的SQL类型映射。然后根据现有资料,运行时大会与物业产生并保存到磁盘。
的代码3部分/章节:SqlWorkerSQLToMangedTypeMappingAttributeDynamicTypeCreatorSqlWorker
SqlWorker类有助于在连接和检索根据输入值的数据从SQL。从SQL并返回到DynamicCreator获取输入表的架构。

command = new SqlCommand(string.Concat

("Select Column_name as ColumnName,data_type as DataType from 

information_schema.columns where table_name='", tableName,"'"),  connection);

                

SqlDataReader reader = command.ExecuteReader();

             

table.Load(reader);

按照上面的代码,我只是尝试仅列,其数据类型是所有在运行时产生的类型,并保存作为大会以来的检索表的架构。此架构的DataTable,然后装上。SQLToMangedTypeMappingAttribute
SQLToManagedTypeMapping其中从SQL数据类型的自定义属性。NET转换或映射为列生成的属性。{C}
这CustomAttribute类帮助SQL类型管理(NET / C#),而不是存储在的RESX或TXT文件类型的映射。自定义属性没有得到resx文件损坏或其他来源的选择。尽管这样,我们就必须使用反射,这是缓慢的过程。但要在运行时生成的类型,再反思,必须使用。匹配模式是基于字符串的输入,这是一个SQL数据库类型的名称,即。 BIGINT,VARCHAR,截至目前,SQL Server 2005的类型也支持。不久, 我会添加SQL Server 2008类型以及。但是,嘿,随时修改或做一些重构。谢谢!DynamicTypeCreator
DynamicTypeCreator使用反射和Reflection.Emit API的生成类型和装配关联,基于从SQL检索DataTable的运行时类型。
Type mapTypeHelper = Assembly.GetExecutingAssembly().GetType

("ConsoleApplication1.SqlToManagedTypeMappingHelper", true, true);

SQLMapping helper类加载使用上面的代码。这个助手类所有的映射方法,在稍后需要被调用,以确定哪些是确切的。NET类型从SQL DB型转换。
AppDomain appDomain = Thread.GetDomain();

AssemblyName assmblyName = new AssemblyName();

            

assmblyName.Name = new StringBuilder(DBCatalog).Replace(DBCatalog[0], 

DBCatalog[0].ToString().ToUpper()[0],0,1).ToString();

    

AssemblyBuilder assemBuilder = appDomain.DefineDynamicAssembly

(assmblyName, AssemblyBuilderAccess.RunAndSave);

ModuleBuilder module = assemBuilder.DefineDynamicModule

			(tableName, assmblyName.Name + ".dll");

    

TypeBuilder typeBuilder = module.DefineType( new StringBuilder(tableName).Replace

(tableName[0],tableName[0].ToString().ToUpper()[0],0,1).ToString(),

TypeAttributes.Public);



mapTypeHelperInstance = Activator.CreateInstance(mapTypeHelper);

按上面的代码,这是动态创建的程序集名称,这是作为输入提供的目录或数据库名称命名。动态程序集是指给运行和保存访问。对于每个大会,应当有一个模块又名类。因此一个模块构建器定义表的名称作为类名。对于刚刚建成的模块,我们需要提供的访问修饰符。因此,一个typebuilder内置该模块。然后前面加载的映射类被实例化,使CLR加载在内存中从而帮助我们调用它的方法执行它。
FieldBuilder fieldBuilder = 

	typeBuilder.DefineField(string.Concat("_", columnName.ToLower()),

	dTableColumnType, FieldAttributes.Private);

              

PropertyBuilder propBuilder = typeBuilder.DefineProperty(

	new StringBuilder(dRow["ColumnName"].ToString()).Replace

	(columnName[0], columnName.ToUpper()[0], 0, 1).ToString(),

	System.Reflection.PropertyAttributes.HasDefault, 

	dTableColumnType, Type.EmptyTypes);



MethodBuilder getMethodBuilder = typeBuilder.DefineMethod("Get" + propBuilder.Name,

	MethodAttributes.Public | MethodAttributes.SpecialName | 

	MethodAttributes.HideBySig, dTableColumnType, null);

类型和模块已定义至今。现在的时间为我们在类定义的字段。这些字段的数据库表列。因此,我们需要遍历从先前这是从数据库加载的DataTable的每一行。所有字段被定义为这个类的私有变量。对于那些使用FieldBuilder类定义的字段,属性也应界定。因此,一个PropertyBuilder类是使用。既然我们已经知道在C#中,获取和设置属性实际上是一个方法内部。因此MethodBuilder类是用来产生这些方法。 MethodAttributes.SpecialName | |如MethodAttributes.Public的特殊属性MethodAttributes.HideBySig MethodBuilder的参数传递。
ILGenerator ilGenerator = getMethodBuilder.GetILGenerator();



ilGenerator.Emit(OpCodes.Ldarg_0);



ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);

ilGenerator.Emit(OpCodes.Ret);



                propBuilder.SetGetMethod(getMethodBuilder);

到目前为止,我们都定义Get和Set方法相关的模块,类型和字段。现在这些领域的每个生成的数据库表列的类型和名称的基础上,我们需要生成与它相关的IL。因此是一个属性的Get方法,例如在上面所示的代码。在这里,我们使用ILGenerator类来生成IL代码。 Reflection.Emit API是用来产生适当的操作码的IL代码。首先因为这是一个Get方法,相应的私有字段值将被返回。因此以下步骤进行:加载该实例是使用Ldarg_0操作码。fieldBuilder又名价值的私人领域已经被装载到内存。因此OpCodes.LdFld的操作码是用于装载值。然后OpCodes.Ret是用来返回先前已加载的值。
同样,沿着这个OpCodes.Stfld代码的方法是用来设置这是作为一个参数传递的值。
这一套建立和Get方法是从DataTable中读取的所有行。
Type myCustomType = typeBuilder.CreateType();



assemBuilder.Save(string.Concat(assmblyName.Name, ".dll"));

由于建设的各个领域和相关属性做了,现在是thenbsp的时间来创建我们刚才生成的类型,然后将它保存起来以后使用的磁盘。因此被称为AssemblyBuilder的方法保存。
private Type GetSqlToManagedType(object p)

{

Type type = null;

foreach (MethodInfo method in mapTypeHelper.GetMethods())

{

var attrList = method.GetCustomAttributes(typeof

		(SQLToManagedTypeMappingAttribute), false).Where(item => 

(item as SQLToManagedTypeMappingAttribute).TypeName.Equals(p));



if (attrList.Count() == 1)

{

type = Type.GetType(method.Invoke(mapTypeHelperInstance, null).ToString());

break;

}

}

return type;

}

上述方法中的每个数据库表的列的数据类型的映射thenbsp。相应的净输入,在运行时产生的大会。要做到这一点,我们做了以下步骤:从MapType helper类,我们可以得到所有可用的方法。一旦方法是可用的,那么,我们该方法所有CustomAttributes。请注意,搜索条件是必要的GetCustomAttributes()方法。类型SQLToManagedTypeMappingAttribute是通过参数作为搜索条件。如果没有提供这个搜索标准,CLR对象层次结构中的所有方法看起来,这System.Object类的方法有时会抛出一个异常。对于每一个这些自定义属性,循环运行相匹配的类型,我们希望。当attrList中有1个项目,这意味着我们有一个匹配的方法需要调用。如果有更多的项目,再有就是重复的属性,这是不对的。匹配的方法是使用method.Invoke API调用。随意使用,新增的功能,等!享受!!| zenwalker1985

回答

评论会员:游客 时间:2012/02/04
尝试:codeprespanclass="code-keyword"Dim/spanshorterspanclass="code-keyword"As/spanspanclass="code-keyword"String/span=longString.SubString(spanclass="code-digit"0/span,spanclass="code-digit"50/span)/pre/code
thatraja
评论会员:游客 时间:2012/02/04
喜欢的子串,长度使用字符串函数,左您也可以设置文本框的最大长度