String-Pool 验证
Windows Installer 将所有数据库字符串存储在单个共享字符串池中,以减少数据库的大小并提高性能。 验证字符串池的唯一方式是在 Windows Installer SDK 中找到的 MsiInfo 工具。
字符串池验证由两个主要检查组成:
DBCS 字符串测试
DBCS 字符串测试扫描数据库中每个字符串的两个条件:对于标记为中性代码页的包,如果任何字符是扩展字符(大于 127),则会标记该字符串,并显示一条消息,指出数据库的代码页无效,因为这些字符要求在所有系统上一致呈现特定的代码页。
如果数据库有一个代码页,则会扫描每个字符串以获取无效的 DBCS 指示器。 如果未正确标记非中性字符串,则字符将无法正确呈现。 (这通常是通过将代码页强制使用数据库中已有非中性字符串的_ForceCodepage表的特定值引起的。请注意,此检查要求在系统上安装数据库的代码页。
如果代码页出现问题,则用户可能会通过使用 _ForceCodepage 表来强制数据库的代码页转换为适当的值来修复错误。 有关详细信息,请参阅 代码页处理。
参考计数验证
若要验证所有字符串的引用计数,会扫描每个表以获取字符串值、保留每个非重复字符串的计数,并将结果与数据库字符串池中存储的引用计数进行比较。
如果出现字符串引用计数问题,用户应立即使用 MsiDatabaseExport导出数据库的每个表,创建新数据库,并使用 MsiDatabaseImport将表导入到新数据库中。 然后,新数据库的内容与旧数据库相同,但字符串引用计数正确。 从具有损坏字符串池的数据库添加或删除数据可能会增加数据库损坏和数据丢失,因此快速执行这些步骤对于防止进一步数据丢失非常重要。
重新生成数据库时,请记住在新数据库中嵌入任何必要的存储和流(请参阅 _Streams 表 和 _Storages 表),并注意代码页问题。 还记得设置每个必需的 摘要信息流 属性。