2009-07-15 21 views
0

我们有一个使用DAO将数据存储在Access数据库中的Visual C++ 6应用程序。数据库类使用ClassWizard进行制作,基于CDaoRecordset将VC++ 6应用程序数据库从Access更改为SQL Server - 我可以使用链接表吗?

我们需要从访问SQL Server移动,因为有些客户有那些上运行(使用Crystal Reports和不同的应用程序)的报告很慢巨大(为1.5Gb +)数据库。

我们并不太在意这个VC++应用程序的性能 - 它正在从数据记录器下载数据并将其放入数据库。

我使用“Microsoft SQL Server迁移助理2008 for Access”将我的数据库从Access迁移到SQL Server,然后将原始Access数据库中的表链接起来。如果我打开Access数据库,则可以浏览SQL Server数据库中的数据。

然后我试着用我的应用程序使用该数据库,并继续遇到问题。

我已经改变了我所有的记录是dbOpenDynaset而不是dbOpenTable。我还将myrecordsetptr->open()调用更改为myrecordsetptr->open(dbOpenDynaset, NULL, dbSeeChanges),以便我不会发生异常。

但是...我现在卡住得到一个例外,3251 - “不支持操作这种类型的对象是为了我的一个表,当我尝试设置使用myrecordsetptr->->SetCurrentIndex(_T("PrimaryKey"));

在当前指数有任何让连接表工作而不重写所有数据库访问代码的技巧?

[更新17/7/09 - 感谢您的提示 - 我会改变所有的Seek()引用FindFirst()/FindNext()并更新此基础上我怎么走]

+0

那么,这是什么问题?什么是代码行,提出“操作不支持”? – shahkalpesh 2009-07-15 03:06:53

回答

0

是的,但我不认为您可以设置/更改记录集中链接表的索引,因此您必须相应地更改代码。

例如:如果您的代码期望设置一个索引&调用seek,则基本上必须改写它,而不是使用Find方法。

0

为什么在将表从Access移动到SQL Server时使用SetCurrentIndex?
我的意思是 - 你只在链接表中使用Access。

而且,按照this页面 - 它说,SetCurrentIndex可用于表类型的记录。

0

在什么情况下使用命令SetCurrentIndex?如果它是使用SEEK的子例程,则不能在链接的表中使用它。

此外,它只是Jet,并不会有不同的后端任何价值。

我建议不要使用SEEK(即使在Jet表接入),除了你需要围绕一个表数千次跳跃在一个循环中最不寻常的情况的。在所有其他DAO情况下,您应该通过使用限制性WHERE子句(如果您使用SEEK获取单个记录)来检索有限数量的记录,或者您应该使用.FindFirst/FindNext。是的,后两者相比SEEK要慢得多,但它们更便携,而且绝对的性能差异只有在你做了成千上万的时候才会相关。另外,如果您的SEEK位于有序字段上,则可以通过检查所查找的值大于还是小于当前记录的值,然后选择.FindPrevious或.FindNext来优化导航(因为DAO记录集查找操作通过索引顺序工作)。

相关问题