易截截图软件、单文件、免安装、纯绿色、仅160KB

C#自动数据库代码生成的思路

C#操作数据库,写来写去就那么几句套话,烦。尽管有SqlHelper之类的辅助类,但还是有一堆参数要自己填,继续烦。最近有朋友问起自动代码生成工具的原理,那今天就说说我的思路吧。我只会MS SQL SERVER,所以就只拿它说事儿了。
其实大的思路很简单,获取数据库中的比较原子的对象,比如字段、参数等,并找出数据库各字段类型与C#中各种类型之间的对应关系即可。但具体到细节,诸如是不是需要引号,是不是需要提供长度,默认值的确定,参数的方向等等还是需要比较费些心思的。
举个简单例子吧,我们要从表中生成一个实体类,每个表字段也是实体对象的字段。很显然,只要知道表结构就可以精确的产生这个类定义。所以现在问题暂时就转换到了“知道表名,如何获取它包含的字段名和类型”。
最简单的方法,sp_columns '表名或视图名' 即可。不难发现,TYPE_NAME和COLUMN_NAME是我们想要的。
当然这样查出来的还都只是sql的类型,需要自己写个函数做下转换,转换成C#的类型。比如,将"varchar"转为"string"。
select * from sys.types order by name可以获取全部SQL的类型。
自动生成参数化的SELECT,INSERT,UPDATE等语句也可以用类似的方法获取字段名,然后参数就在字段名前加@符号,同样也可以依次拼装Parameters.AddWith("@字段名",....)语句。喜欢继续用SqlHelper的同学也可以生成参数列表。当然实际操作中还要考虑字段名的空格、保留字等因素。比如可以约定SQL字段的空格转换到C#变量的时候就用下划线代替,字段都用方括号引起来。
存储过程稍复杂点。首先当然根据存储过程名获取参数了。
select parameter_name,DATA_TYPE,PARAMETER_MODE,CHAR_LENGTH = isnull(CHARACTER_MAXIMUM_LENGTH,0)
from INFORMATION_SCHEMA.PARAMETERS
where specific_name='存储过程名' and Parameter_name <> ''
我们需要另外一套转换机制,从SQL类型转换到SqlDbType.XXX。比如,SQL类型是char(20),那么对应的C#有可能就是cmd.Parameters.Add("@参数名",SqlDbType.Char,20);。如果SQL类型是int型的,那就可以不需要考虑长度了。另外就是该参数的方向,并且体现在ParameterDirection上。
至于获取全部数据库常用对象,比如表、视图、存储过程、标量函数、表值函数等,可以用select * from sys.objects where type = 'U' and is_ms_shipped = 0 order by [name]语句。注意这里的 type,等于U是表,等于V就是视图,等于P是存储过程,等于FN是


相关文档:

C# 关键字extern用法

修饰符用于声明在外部实现的方法。extern 修饰符的常见用法是在使用 Interop 服务调入非
托管代码时与 DllImport 属性一起使用;在这种情况下,该方法还必须声明为 static,如下面的示例所示:[DllImport("avifil32.dll")]
private static extern void AVIFileInit();
注意
extern 关键字还可以定义外部程序集别名,使 ......

asp.net(C#)中文乱码问题

asp.net默认的编码是UTF-8
js文件里的编码也是UTF-8
当你要在aspx页面上进行传中文参数时会出现乱码
<-----request.aspx--接收参数页----->
<----response.aspx--传送参数页----->
例一:<a href="request.aspx?str=中国人"></a>
解决办法一:
1.可以和改webconfig的编码 如:
   ......

c# 的namespace以及assembly

1 NameSapce

1 1个namespace里面可以有多个类
2  namespace和cs文件是多对多的关系。
3  调用另一个namespace的声明,可以使用using <namespace> ,然后直接调用类名,或者使用namespace.类名来调用
4  namespace支持别名(alias)   using namespace = namespace.classname,如using m ......

C#开发实例

c#改变系统鼠标
---------------------------------------------------------------------------------------------------
using System.Runtime.InteropServices;
 
[DllImport("User32.DLL")]
public static extern bool SetSystemCursor(IntPtr hcur, uint id);
public const uint OCR_NORMAL = 32512;
publ ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号