首页 > 解决方案 > 对象名称无效,但对象显然有效

问题描述

我正在尝试在 MS Access 中运行一些 SQL 查询,但是某个查询的行为非常奇怪,并且抛出了一个错误,我认为该错误掩盖了实际问题。这是有问题的查询:

objCmd.CommandText = "DECLARE @equipID varchar(50) DECLARE d 
CURSOR FOR SELECT equipmentID FROM [EWOM].[dbo].[equipment] OPEN d" 
& _
" FETCH NEXT FROM d INTO @equipID WHILE @@FETCH_STATUS = 0 BEGIN" & 
_
" UPDATE [EWOM].[dbo].[Equipment] SET eqNum = 
REPLACE(REPLACE(equipmentID, ' ', ''), '.', '') WHERE equipmentID = 
@equipID" & _
" FETCH NEXT FROM d INTO @equipID End Close d DEALLOCATE d"

这会引发错误

无效的对象名称“EWOM.dbo.Equipment”

但是,我已经使用这个完全相同的对象使用了几个查询,这些查询运行得非常好。下面是一个完全可操作的查询示例:

objCmd.CommandText = "TRUNCATE TABLE [EWOM].[dbo].[Equipment]" & _
" INSERT INTO [EWOM].[dbo].[Equipment] (equipmentID, make, model, 
equipmentName, status)" & _
" SELECT Equipment, Manufacturer, Model, Description, Status" & _
" FROM [Vp].[dbo].[bEMEM]"

让我感到困惑的是,我展示的第一个查询在 SQL Server Management Studio 中运行良好,但是当我将它转换到 Access 时却失败了。真正的问题来自第一个查询的语法问题吗?任何帮助,将不胜感激。

这是工作查询的完整代码:

Dim Cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim objCmd As New ADODB.Command

Set Cnn = New ADODB.Connection
Set rst = New ADODB.Recordset

Cnn.Open "DBName", "username", "password"
objCmd.ActiveConnection = Cnn

objCmd.CommandText = "TRUNCATE TABLE [EWOM].[dbo].[Equipment]" & _
" INSERT INTO [EWOM].[dbo].[Equipment] (equipmentID, make, model, 
equipmentName, status)" & _
" SELECT Equipment, Manufacturer, Model, Description, Status" & _
" FROM [Vp].[dbo].[bEMEM] WHERE EMGroup = 20"
objCmd.CommandType = adCmdText

Set rst = objCmd.Execute
MsgBox "Update successful."

Cnn.close
Set Cnn = Nothing
Set rst = Nothing

当 objCmd.commandText 更改为我发布的第一个查询时,它会失败。我所有的其他查询都使用这种方法。

标签: sqlsql-serverms-access

解决方案


即使这是简单的语法错误,您确实应该考虑不要使用游标来做一些简单的事情。这应该是一种基于集合的方法,而不是 RBAR(逐行痛苦)。您的整个光标逻辑可以简化为此。您可能会考虑使用存储过程,而不是将所有 sql 逻辑隐藏在应用程序中。为您提供更多控制权,并且几乎在每个方面都更容易。

UPDATE [EWOM].[dbo].[Equipment] SET eqNum = 
REPLACE(REPLACE(equipmentID, ' ', ''), '.', '')

推荐阅读