使用数据源


  数据源,即定义数据库的元数据,也称之为 Schema,包括表、字段、关系等等。数据源是生成代码的原材料,必不可少。

  CodeBuilder 支持 Database、 Power Designer 及 PDManernew 三种。

一、从数据库读取

  从主菜单【数据源】处打开【Database】,显示 【数据源管理】 界面,如下图:

  CodeBuider 支持 SqlServer、MySql、Oracle、SQLite、PostgreSql、Firebird 等等,此 Provider 基于 Fireasy.Data 提供 Schema,如果需要对接其他类型的数据库,你可以参阅 扩展数据源提供者。点击【添加】选择一种类型的数据库。

  输入连接字符串,或是通过单击【向导】按钮打开向导界面,根据表单来输入数据库连接的参数。

  配置好数据源后,在 数据源管理 的数据源列表中,双击打开数据库链接,将遍列数据库中的所有表。如下图:

  通过关键字筛选,勾选需要生成的表,你可以【暂存】多次筛选结构,最后一起返回。通过【SQL构造器】,通过输入多条 SQL 语句,返回特殊的结构,如下图:



💡 如何读取视图

  数据库视图默认是关闭的,如需读取视图,你可以在【文件】-【首选项】中勾选【读取视图】。


二、从 Power Designer 读取

  从主菜单【数据源】处打开【Power Designer】,打开选择 Power Designer 设计文件的对话框,选择文件后打开,显示模型浏览器,如下图所示:

  模型浏览器列出文档中的所有的 Package 和 Diagram 模型,以及 Table 对象,勾选好表对象后点击【确定】即可。


三、从 PDManer 读取

  操作与 Power Designer 类似。

四、调整数据源

  通过以上方法选择好数据源后,CodeBuilder 将读取所有表的字段信息,显示到【对象列表中】,如下图所示:

  主键、外键和普通字段通过不同颜色的图标进行区分,同时,选中行并单击备注列,可以立即修改备注文本,回车即可生效。

  2.9.3 版本支持拖拽调整表或字段的前后顺序。


  当你选中表或字段时,在【属性】窗口实时显示表或字段的详细信息,在属性窗口里调整也会实时更新到【对象列表】中。如下图所示:

  外键可以通过以下步骤打开【外键关联】窗口,选择主表及主键进行【绑定】,点击【解绑】取消关系,如下所示:



💡 多说两句

  • 表的 ClassName 和字段的 PropertyName 是通过一定的规则进行自动转换的,可查阅 使用变量
  • 字段的 PropertyType 是依照 DbType 枚举来映射的,可查阅 架构扩展,如果有类型转换错误,可定位到文件 extensions\schema\base.cs,或在【扩展】窗口中找到 base.cs,找到方法 GetCSharpType 进行修改。代码如下:
// 获取 CSharp 的类型名称
public static string GetCSharpType(Column column)
{
    var propertyType = column.PropertyType;
    if (column.DbType == null)
    {
        return propertyType;
    }

    switch ((DbType)column.DbType)
    {
        case DbType.String:
        case DbType.StringFixedLength:
        case DbType.AnsiString:
        case DbType.AnsiStringFixedLength:
            propertyType = "string";
            break;
        case DbType.Int16:
            propertyType = "short";
            break;
        case DbType.UInt16:
            propertyType = "ushort";
            break;
        case DbType.Int32:
            propertyType = "int";
            break;
        case DbType.UInt32:
            propertyType = "uint";
            break;
        case DbType.Int64:
            propertyType = "long";
            break;
        case DbType.UInt64:
            propertyType = "ulong";
            break;
        case DbType.Decimal:
            propertyType = "decimal";
            break;
        case DbType.Single:
            propertyType = "float";
            break;
        case DbType.Double:
            propertyType = "double";
            break;
        case DbType.Boolean:
            propertyType = "bool";
            break;
        case DbType.Byte:
        case DbType.SByte:
            propertyType = column.Name.StartsWith("Is") ? "bool" : "int";
            break;
        case DbType.Date:
        case DbType.DateTime:
        case DbType.DateTime2:
        case DbType.DateTimeOffset:
            propertyType = "DateTime";
            break;
        case DbType.Guid:
            propertyType = "Guid";
            break;
        case DbType.Binary:
            propertyType = column.DataType == "timestamp" ? "DateTime" : "byte[]";
            break;
    }

    if (column.IsNullable && propertyType != "string" && column.DbType != DbType.Binary)
    {
        propertyType += "?";
    }

    return propertyType;
}

  而 Power Designer 数据源的 DbType 则是根据 config\pd.cfg 文件来进行类型映射。如下所示:

{
    "MYSQL": {
        "smallint": "Int16",
        "int": "Int32",
        "real": "Double",
        "single": "Single",
        "float": "Double",
        "double": "Double",
        "money": "Decimal",
        "currency": "Decimal",
        "decimal": "Decimal",
        "numeric": "Decimal",
        "bit": "Boolean",
        "yesno": "Boolean",
        "logical": "Boolean",
        "bool": "Boolean",
        "boolean": "Boolean",
        "tinyint": "Byte",
        "integer": "Int64",
        "counter": "Int64",
        "autoincrement": "Int64",
        "identity": "Int64",
        "long": "Int64",
        "bigint": "Int64",
        "binary": "Binary",
        "varbinary": "Binary",
        "blob": "Binary",
        "image": "Binary",
        "general": "Binary",
        "oleobject": "Binary",
        "varchar": "String",
        "nvarchar": "String",
        "memo": "String",
        "longtext": "String",
        "note": "String",
        "text": "String",
        "ntext": "String",
        "string": "String",
        "char": "String",
        "nchar": "String",
        "datetime": "DateTime",
        "smalldate": "DateTime",
        "timestamp": "DateTime",
        "date": "DateTime",
        "time": "DateTime",
        "uniqueidentifier": "Currency",
        "guid": "Currency"
    },
    "MSSQLSRV": {
        "smallint": "Int16",
        "int": "Int32",
        "real": "Single",
        "float": "Double",
        "money": "Decimal",
        "smallmoney": "Decimal",
        "bit": "Boolean",
        "tinyint": "Byte",
        "bigint": "Int64",
        "timestamp": "Binary",
        "binary": "Binary",
        "image": "Binary",
        "text": "String",
        "ntext": "String",
        "decimal": "Decimal",
        "numeric": "Decimal",
        "datetime": "DateTime",
        "smalldatetime": "DateTime",
        "sql_variant": "Object",
        "xml": "String",
        "varchar": "String",
        "char": "String",
        "nchar": "String",
        "nvarchar": "String",
        "varbinary": "Binary",
        "uniqueidentifier": "String",
        "date": "DateTime",
        "time": "Object",
        "datetime2": "DateTime",
        "datetimeoffset": "Object"
    },
    "ORA": {
        "bfile": "Binary",
        "blob": "Binary",
        "char": "String",
        "clob": "String",
        "date": "DateTime",
        "float": "Decimal",
        "interval day to second": "Object",
        "interval year to month": "Int32",
        "long": "String",
        "integer": "Int32",
        "long raw": "Binary",
        "nchar": "String",
        "nclob": "String",
        "number": "Decimal",
        "nvarchar2": "String",
        "raw": "Binary",
        "rowid": "String",
        "timestamp": "DateTime",
        "timestamp with local time zone": "DateTime",
        "timestamp with time zone": "DateTime",
        "varchar2": "String"
    }
}

  如果你需要配置其他类型的数据库,需要找到 Power Designer 的 pdm 文件中的路径 //Model/o:RootObject/c:Children/o:Model/c:DBMS/o:DBMS/a:Code,根据 Code 的值来进行配置。


  表 Table 的基本元素:

编码 类型 名称
Index int 索引,从 1 开始
Name string 表的名称
Description string 表的注释
ClassName string 生成的对应的类名
Columns List<Column> 字段集合
PrimaryKeys List<Column> 主键集合
ForeignKeys List<Reference> 外键集合,可遍列主表
SubKeys List<Reference> 子键集合,可遍列子表

  字段 Column 的基本元素:

编码 类型 名称
Index int 索引,从 1 开始
Name string 字段的名称
Description string 字段的注释
ColumnType string 字段类型定义,如 varchar(20)、integer、decimal(20,2) 等等
DataType string 字段类型,如 varchar、ingeter、decimal 等等
DbType DbType? 对应到 System.Data.DbType 枚举
PropertyName string 生成的对应的属性名称
PropertyType string 属性的类型,比如 C# 的 string、DateTime、int? 等等
IsPrimaryKey boolean 是否是主键
AutoIncrement boolean 是否为自增
IsNullable boolean 是否可为空
ForeignKey Reference 对应的外键对象 (Reference)
Length int? 字段长度,如 varchar(20) 长度为 20
Precision int? 精度
Scale int? 小数位数

  关系 Reference 的基本元素:

编码 类型 名称
PkTable Table 主表
PkColumn Column 主键
FkTable Table 关联的表
FkColumn Column 关联的字段
OnUpdate Constraint 更新时的级联行为
OnDelete Constraint 删除时的级联行为