编写适合于自己的代码生成器(二)

      上次写了如何在SQL SERVER 2000 上实现代码生成器的基本原理,可是在 vista 下无法安装 SQL SERVER 2000,所以今天花了一个下午的时间,特意研究了一下遍历SQL SERVER 2005的方法,用于实现代码生成器对vista的兼容.注:由于写作时时间仓促,以下内容均在SQL Server Management Studio Express下测试通过,当然也有其他的方法可以实现.若有不足或错误之处,请读者给我留言.

      在SQL SERVER 2005 中查询系统信息都是通过视图来完成的,数据库在系统视图sys.databases中
查询系统中存在的数据库:
SELECT  *  FROM sys.databases

查询数据库中的用户表:
SELECT  *  FROM sys.objects WHERE type = ' u '

查询表中的字段(本例使用的表是member):
SELECT sys.columns. * ,sys.columns.name 列名,
    CASE WHEN sys.columns.is_identity 
=   1  THEN  ' '  ELSE  ''  END 标识,
    CASE WHEN sys.columns.name 
=  INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME THEN  ' '  ELSE  ''  END 主键,
    sys.types.name 类型,
    sys.columns.max_length 占用字节数,
    COLUMNPROPERTY(sys.columns.object_id, sys.columns.name, 
' PRECISION ' ) AS 长度,
    isnull(COLUMNPROPERTY(sys.columns.object_id, sys.columns.name, 
' Scale ' ),  0 ) 小数位数,
    sys.default_constraints.definition 默认值,
    (CASE WHEN sys.columns.is_nullable 
=   1  THEN  ' '  ELSE  ''  END) 允许空
FROM sys.columns
    INNER JOIN sys.objects ON sys.columns.object_id
= sys.objects.object_id  AND sys.objects.type = ' u '
    INNER JOIN sys.types ON sys.columns.system_type_id
= sys.types.system_type_id 
    LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ON INFORMATION_SCHEMA.KEY_COLUMN_USAGE.TABLE_NAME
= sys.objects.name
    LEFT JOIN sys.default_constraints ON sys.columns.default_object_id
= sys.default_constraints.object_id
WHERE sys.objects.name
= ' member '


在视图sys.columns中可以得到表格的列
在视图sys.types中可以得到系统的字段类型
主键信息INFORMATION_SCHEMA.KEY_COLUMN_USAGE.COLUMN_NAME.这个不容易找到,费了我好长时间才找到.

另外还有字段的描述没有找到是如何与sys.columns建立关联的,描述信息可以在视图sys.extended_properties中查询到:

select  *  from sys.extended_properties

有了上面的SQL语句相信读者能够实现在SQL SERVER 2005下使用的代码生成器了。当然你也可以将两个版本的SQL SERVER写成两个实现同一接口的类,然后实现兼容两个版本的代码生成器,当然也可以实现对ACCESS的兼容。

你可能感兴趣的:(代码生成)