2011-08-08 41 views
2

我正在将一组MS Access后端数据库升迁为SQL Server。我编写了SQL脚本来在SQL Server中创建表格模式。现在我正试图填充表格。大多数表具有自动编号的主键。这是我的一般方法:强制SET SET IDENTITY_INSERT从MS Access更快地生效

For each TblName in LinkedTableNames 
    'Create linked table "temp_From" that links to the existing mdb' 
    'Create linked table "temp_To" that links to the new SQL server table 
    ExecutePassThru "SET IDENTITY_INSERT " & TblName & " ON" 
    db.Execute "INSERT INTO temp_To SELECT * FROM temp_From", dbFailOnError 
    ExecutePassThru "SET IDENTITY_INSERT " & TblName & " OFF" 
Next TblName 

第一次插入立即发生。随后的插入尝试失败,并显示以下错误:“IDENTITY_INSERT设置为OFF时,无法在表'TblName'中插入标识列的显式值。”

我添加了一个Resume语句为那个特定的错误和一个计时器。事实证明,错误持续600秒(十分钟),然后插入成功。

MS Access会每隔10分钟自动刷新其ODBC会话吗?有没有办法强制这种情况发生得更快?我是否缺少明显的东西?

这些背景信息谁就会立刻想说“使用升迁向导”:我不使用
内置的升迁是因为我需要能够从脚本启动整个操作完。目标是在执行客户端位置的交换机之前使其在测试环境中运行。

回答

2

我找到了第一个问题的答案。十分钟是埋在注册表中的Jet引擎项下的设置:

'Jet WinXP/ Win7 32-bit:' 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\ODBC\ConnectionTimeout 

'Jet Win7 64-bit:' 
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\ODBC\ConnectionTimeout 

'ACE WinXP/ Win7 32-bit:' 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Access Connectivity Engine\Engines\ODBC\ConnectionTimeout 

'ACE Win7 64-bit:' 
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MicrosoftAccess Connectivity Engine\Engines\ODBC\ConnectionTimeout 

这是documented here的ACE:

ConnectionTimeout: The number of seconds a cached connection can remain idle before timing out. The default is 600 (values are of type REG_DWORD).

这个键被设定为600默认这是600秒10分钟。我减少了10秒,代码相应地加快了。

这绝不是完整的解决方案,因为将默认值设置为低会导致其他地方出现问题。实际上,Tony Toews once recommended,使用无DSN连接时默认情况下最好是增加

我仍然希望找到答案,我的问题的第二部分,即是否有办法强制刷新更快地发生。

1

两个想法,但不知道是否会有用,因为这是我不熟悉的领土。

不MS Access自动刷新其ODBC会议每10分钟?有没有办法迫使这种情况发生得更快?我失去了一些东西明显?

在Access 2003中选项对话框,在高级选项卡中,有一个“ODBC刷新间隔”设置以及重试设置。调整这些帮助是否......或者有任何影响?

我想知道是否可以通过创建SQL Server列作为普通数字而不是自动编号,插入数据,然后ALTER TABLE ... ALTER COLUMN在数据插入后更改它们来避免此问题。

如果表中包含数据,Access将不允许我将数字列转换为自动编号,但ISTR SQL Server在该分数上更灵活。

+0

+1好主意。我没有尝试第一个建议,因为我找到了我在埋入注册表后的设置(我将添加它作为单独的答案)。第二种方法直接使用SQL Server Mgmt Studio,但隐藏了所需的内在低效率。它实际上涉及将所有记录复制到临时表(使用SET IDENTITY_INSERT ON/OFF),删除原始表并将临时表重命名为原始表。我的一张桌子上有200万条记录,所以我想避免这种低效率。 – mwolfe02