列定义格式
View 对象的 MsiViewGetColumnInfo 和 ColumnInfo 属性使用以下格式来描述数据库列定义。 每个列由函数或属性返回的相应记录字段中的字符串来说明。 定义字符串包含单个字母(表示数据类型)和列宽度(如果适用,则以字符为单位,否则以字节为单位)。 宽度为零表示宽度不受限制(例如,长文本字段和流)。 大写字母表示在列中允许使用 Null 值。
列描述符 | 定义字符串 |
---|---|
s? | 字符串,可变长度 (?=1-255) |
s0 | 字符串,可变长度 |
i2 | 短整数 |
i4 | Long integer |
v0 | 二进制流 |
g? | 临时字符串 (?=0-255) |
j? | 临时整数 (?=0,1,2,4) |
O0 | 临时对象 |
用于描述列的字符串与 CREATE 和 ALTER 使用的 SQL 查询字符串之间的关系如下。 有关详细信息,请参阅 SQL 语法。
返回值 | SQL 语法 |
---|---|
s0 | LONGCHAR |
l0 | LONGCHAR LOCALIZABLE |
s # | CHAR(#) |
s # | CHARACTER(#) |
l # | CHAR(#) LOCALIZABLE |
l # | CHARACTER(#) LOCALIZABLE |
i2 | SHORT |
i2 | INT |
i2 | INTEGER |
i4 | LONG |
v0 | OBJECT |
如果字母未大写,则 SQL 语句应追加 NOT NULL。
返回值 | SQL 语法 |
---|---|
s0 | LONGCHAR NOT NULL |
安装程序不会在内部将列的长度限制为列定义格式指定的值。 如果输入到字段中的数据超过指定的列长度,则包无法通过包验证。 在这种情况下,若要通过验证,必须更改数据或数据库架构。 要更改标准表的列长度,唯一方法是使用 MsiDatabaseExport 导出表,编辑导出的 .idt 文件,然后使用 MsiDatabaseImport 导入表。 作者不能更改标准表中任何列的列数据类型、为 Null 性或本地化属性。 作者可以创建具有任何列属性的列的自定义表。
使用 MsiDatabaseMerge 将引用数据库合并到目标数据库时,列名称、主键数和列数据类型必须匹配。 MsiDatabaseMerge 忽略本地化属性和列长度属性。 如果引用数据库中的列的长度为 0 或大于该列在目标数据库中的长度,则 MsiDatabaseMerge 会将目标数据库中的列长度增加到引用数据库中的长度。
使用 Mergmod.dll 版本 2.0 时,将合并模块应用于 .msi 文件永远不会更改列的长度或现有数据库表的列类型。 但是,如果合并模块向有效添加列的表添加新列,则合并模块的应用程序可以更改现有数据库表的架构。 使用低于版本 2.0 的 Mergemod.dll 时,合并模块的应用程序永远不会更改列的长度,也永远不会更改目标数据库的架构。