将 MS Access 2000 转换为 2010

5
我正在将MS Access 2000转换为MS Access 2010。我遇到的问题是,转换后,MS Access 2010非常缓慢(甚至会冻结)。

先前的配置:在XP上运行的MS Access 2000,并使用链接表连接到位于Windows 2000上的Sql server 2000

新的配置:在Windows 7上运行的MS Access 2010,并使用链接表连接到位于Windows 2000上的Sql server 2000

新配置下的Access非常缓慢,有时会挂起和崩溃。Visual Studio桌面应用程序也是如此,在Win7上运行非常缓慢,而在XP上运行良好。
我尝试了以下几件事情:
  1. 通过创建新的MS Access 2010并从2000版本导入所有对象来转换MS Access 2000
  2. 刷新链接表等
  3. 更改注册表中的MS Office最大缓冲区大小为55000(根据一些MS支持网站的建议)
目前为止,改进很小或没有改进。

1
你没有将 SQL Server 2000 升级到像 SQL Server 2008 Express 这样的版本,有什么原因吗? - HK1
2
你看到了 http://social.technet.microsoft.com/Forums/en/office2007deploymentcompatibility/thread/88542372-0fcb-4521-87ec-e2ab72e688dd 吗? - Fionnuala
@MattDonnan 这不是微软在Access 2010中推荐的做法。有支持的链接表。 - Fionnuala
1
@Remou 完全正确,虽然我期望Microsoft维护和支持其产品特性。我只提到ADO方法是因为当关联表方法遇到优化问题时,它总是能够很好地为我服务。但是,当使用Access作为数据库后端时,我仍然支持使用关联表。 - Matt Donnan
你的SQL Server客户端软件是否是最新的? - iDevlop
显示剩余9条评论
4个回答

2
很难回复,因为问题的根源可能有多个。 由于两个客户端的操作系统配置不同,我们不能排除问题来自两个操作系统之间配置差异的可能性。
首先,您可以确定连接缓慢是因为计算机、访问或数据库的原因:
测试:直接连接
您可以尝试使用直接连接而不是链接表格直接连接到 SQL Server。为此,您可以创建一个新的 Access 项目并连接到 SQL Server。Access 项目是一种类型的 Access 数据库,它直接连接到 SQL Server,而不是链接表格。它使用本地客户端。您可以在 Access 中直接查看 SQL Server 数据库的表格,并对其进行编辑。Access 项目的扩展名不是 MDB,而是 ADP。Access 2010 中隐藏了 Access 项目,但得到了良好的支持。
要创建 Access 项目,请转到“文件”菜单 ->“新建”,然后单击文件图标,然后选择“另存为类型”:“Microsoft Access 项目(*.adp)”。
创建 ADP 后,它应该会要求您输入现有 SQL Server 数据库的参数。输入您的参数。
然后转到表面板,尝试浏览一些表格并检查它是缓慢还是快速的。
如果速度很慢 => 那么问题可能来自您的电脑或连接。您可以尝试使用另一个软件测试直接连接,如果有一个可以连接到SQL Server。
如果速度很快 => 那么缓慢来自ACCDB或ODBC链接。
还要检查:
- Ms Access已更新为最新版本和Ms Office补丁 - 您的ODBC系统和“ODBC驱动程序到SQL Server”已更新为最新版本(采用MDAC的最新版本) - 您的Windows 7、Ms Access和ODBC版本具有相同的位范围(32位或64位) - 您用于ODBC连接到SQL Server的DSN字符串已标准化 - 如果您的DSN是系统DSN,则重新创建一个作为用户DSN并尝试。

2

你尝试过保持连接吗?这可能仅适用于另一个accdb中的链接表,不确定。

我曾经遇到过这个问题,所以现在只要Access在运行,我就会保持连接打开,这是我的子程序的简化版本:

Public Sub updateTables(bClose As Boolean)

Dim dbsCurrent As Database
Dim tdfSingle As TableDef
Dim tdfCollection As TableDefs
Dim sBasePath As String, sPath As String
Set dbsCurrent = CurrentDb
Set tdfCollection = dbsCurrent.TableDefs
Set dbsHold = dbsCurrent

Static dbsOpen As DAO.Database

If bClose Then
    dbsOpen.Close
Else
    sBasePath = Left(CurrentDb.Name, InStrRev(CurrentDb.Name, "\")) & "SB-Support\"
    sPath = GetUNC(sBasePath & "data.dat")

    Set dbsOpen = OpenDatabase(sPath, False, False, "MS Access;")
    For Each tdfSingle In tdfCollection
        If tdfSingle.SourceTableName <> "" Then
            If tdfSingle.Fields.Count = 0 Then
                tdfSingle.Connect = ";DATABASE=" & sPath
                tdfSingle.RefreshLink
            End If
        End If
    Next
End If

Exit Sub

结束子程序

我认为最初是从这里检索到的: http://www.fmsinc.com/microsoftaccess/performance/linkeddatabase.html

我没有SQL服务器要求,但是快速搜索给了我以下内容,用于建立SQL连接的OpenDatabase:

Dim cs As String
Dim cn As DAO.Database
Dim ws As DAO.Workspace
Set ws = DBEngine.Workspaces(0)
cs = "ODBC;DRIVER=SQL Server;SERVER=Main\SQLEXPRESS;DATABASE=Workwise;APP=Visual Basic"      'UID=Peter;PWD="
Set cn = ws.OpenDatabase("Workwise", dbDriverNoPrompt, True, cs)

http://www.vbforums.com/archive/index.php/t-572723.html


2

当出现冻结情况时,我会检查实际在SQL Server中运行的查询。例如,运行以下命令:

select (SELECT text FROM ::fn_get_sql(s1.sql_handle)), *
from sys.sysprocesses s1

我曾经调试过一个响应缓慢的应用程序,其中访问查询没有被很好地转换为sql-server。 在access查询中的一些简单操作导致运行了许多低效的sql-server查询。 我们将其中一些查询重写为sql-server视图并解决了这个问题。


1
首先,确保您拥有最新的MDAC。接下来我建议在SQL中创建存储过程或表值函数,而不是从Access本身运行查询。Access将预解析查询以确保其针对SQL Server运行,这可能会减慢速度。如果Access正在执行更新和删除操作,则会使用SQL Server TIMESTAMP列来确保在您打开表单时没有其他人更改该记录。如果SQL没有这样的列,Access必须进行所有跟踪。我们刚刚自己经历了这个过程-我会向开发人员询问任何提示,并在评论中发布。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接