2

我正在处理旧的 C++ MFC 项目(> 10 岁)。数据库应用程序适用于从 MS Access (2007) 迁移到 MS SQL Server (2008 R2),我在此过程中遇到了一些障碍。对于导出数据,我使用了 MS SQL Management Studio(菜单中的“导入”选项)众所周知,Access 和 MS SQL 之间的数据类型存在一些差异。这变成了一些麻烦。

  1. Access 中的“ID”列(Autonumber,不是 NULL,主键)成为 SQL Server 中的普通列(int,不是 NULL 并且没有任何自动增量)。所以我在向表中插入新行时遇到了很多错误。

  2. Access 中的Yes/No类型(-1/0;不允许 NULL)变为位(1/0/NULL),工作逻辑不应被破坏,因为在大多数情况下它是不等于的比较0:

    query.Select() .Buff("ID", &code) .FromS("%Table_Name%", NULL) .Where().Str("Aktiv <> 0") .Execute();

在寻找解决方案时,我看到了使用 SSMA(SQL Server 迁移助手)进行访问的建议。它更好,更智能,因为它重新创建了主键/外键,创建了 CHECK,索引。但不幸的是,许多 FOREIGN KEYs 的操作 Update/Delete 操作不是Cascade而是No Action。架构导入后的警告消息:

MS Access 表 %Table1% 上的 FOREIGN KEY 约束“Reference77”可能会导致循环或多个级联路径。从表%Table2%到表%Table1%的级联选项在 SQL Server 中设置为无选项。

这并不奇怪应用程序在删除对象时会出现一些错误,尽管在 Access 中一切正常。为了测试,我选择了一个出现错误的删除操作(在应用程序中)。我查看了错误消息并通过 SSMS(SQL Server Management Studio)更改了所涉及的外键的无操作->级联。之后应用程序中的删除操作成功。

我的问题是:

  1. 我对吗?我只需要更改No Action -> Cascade for the FOREIGN KEYs 即可让数据库应用程序完全正常工作?还是会出现其他我不知道的问题?
  2. 如何实现?我希望它是在客户的 SQL Server 上应用它的一个很好的解决方案。

感谢您的帮助,我真的很感激!

4

2 回答 2

4

感谢您的回答。我的问题的解决方案是......将数据直接从 Access (2010) 导出到 SQL Server。我试过:

  1. “SQL Server 导入和导出数据”,结果 - 仅复制 Access 数据库中的数据,没有任何主 oк 外键,没有将自动编号转换为具有 IDENTITY 和自动增量的列。

  2. 用于 Access 的 SQL Server 迁移助手,结果 - 很多外键丢失了更新/删除操作的 CASCADE 属性。但其他一切都还好。

  3. 访问 2010!数据库工具-> SQL Server-> ...使用向导-> 架构和数据一切正常。应用程序适用于从 Access 导入的 SQL Server 数据库。

所以直接从 Access 导出到 SQL Server给出了所需的结果。

于 2013-01-22T09:46:58.717 回答
2
  1. 可能,但你仍然需要测试。

  2. 对于可重用的解决方案,我将为 SSMA 创建的数据库编写脚本(检查所有类型和外键是否正确)。有了这个脚本,您可以在任意数量的服务器上创建一个空的 SQL Server 数据库。要填充这些数据库,我将使用集成服务包。使用导入向导很容易创建:完成所有步骤,但保存包而不是立即运行它。然后您可以打开此包并对其进行编辑(如有必要,添加数据转换或任何其他逻辑)。

于 2013-01-10T10:36:03.210 回答