列定义格式

View 对象的 MsiViewGetColumnInfoColumnInfo 属性使用以下格式来描述数据库列定义。 每个列由函数或属性返回的相应记录字段中的字符串来说明。 定义字符串包含单个字母(表示数据类型)和列宽度(如果适用,则以字符为单位,否则以字节为单位)。 宽度为零表示宽度不受限制(例如,长文本字段和流)。 大写字母表示在列中允许使用 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 时,合并模块的应用程序永远不会更改列的长度,也永远不会更改目标数据库的架构。