【发布时间】:2013-11-22 20:02:03
【问题描述】:
我们有一个旧版 FoxPro(版本 9)应用程序可以访问 SQL Server 数据库 (2008 R2)。我们开始开发新版本的系统(不使用 FoxPro),它需要更改数据模型但需要提供与原始应用程序的向后兼容性。不幸的是,有很多 FoxPro 代码,对其进行更改并不是一个非常有吸引力的选择。还有一些情况,比如处理空值,我不确定在 FoxPro 中能不能做到。
为了提供与遗留代码的兼容性,我的第一个想法是使用视图和触发器在数据库中创建一个接口。视图将与旧表命名相同,并在选择数据时执行任何必要的转换或映射。我还将创建一系列将来自 FoxPro 的 DML 语句映射到新的数据库结构的触发器。这样 FoxPro 会认为它正在查询相同的数据库结构,而新的应用程序代码将直接访问新的数据库表。
我创建了几个视图和相关触发器,使用直接 SQL 一切正常。在 SQL Server Management Studio 中运行的语句以及在 FoxPro 中使用“execsql”命令执行的语句按预期工作。但是,FoxPro 使用的光标适配器中似乎有些东西给我带来了问题。据我所知,游标适配器基本上是 ADO 对象的包装器,但我对此并不肯定。
我遇到了两个问题。第一个似乎是由于游标适配器确定它正在查询视图并尝试获取基础表。如果视图是一个简单的“select * from some_table”,那么对视图的任何更新都会直接在基础表上执行。这会导致它绕过视图上的任何触发器,并且不会发生任何所需的数据转换(例如 0 到空值)。
第二个问题发生在视图更复杂时,可能是由于连接或对数据的某些操作。游标适配器仍然能够毫无问题地读取数据,但任何插入或更新都会导致有用的错误消息“Microsoft 游标引擎:多步操作生成错误。”
我猜这是一种相当独特的情况,很可能是无法解决的。但我想我会把它贴在这里以防万一有人遇到过这类问题。
感谢您提供任何信息、指点或建议。
编辑
经过更多挖掘后,我得出结论,光标适配器是可更新 ADO 记录集的前端。它生成的一些错误消息涉及 OLE DB,我还发现了一个 old article,它讨论了 ADO 将如何获取查询的基表和列并将其用于更新。这符合我看到的行为。
鉴于上述情况,我不认为有任何方法可以解决这种行为(作者称之为“优雅”,但我会使用一个非常不同的术语)。但是,如果有人有更多关于 ADO 内部运作的信息,可能会更清楚地说明这个问题,我很想听听。
再次感谢。
【问题讨论】:
标签: sql-server-2008 triggers foxpro