【问题标题】:Invalid object name, but object is clearly valid对象名称无效,但对象显然有效
【发布时间】:2019-05-15 15:37:07
【问题描述】:

我正在尝试在 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 更改为我发布的第一个查询时,它会失败。我的所有其他查询都使用这种方法。

【问题讨论】:

  • 我唯一能想到的是 objCmd ConnectionString 不正确,如果表存在
  • 为什么要使用游标来更新表格?这应该是一条更新语句,而不是一次更新一行,速度非常慢。
  • 你的数据库的排序规则是什么?在您声明有效的代码中,您有一个大写 E,但在您失败的代码中,它是 e
  • 你明白了,肖恩·兰格。是小写的 e 把所有东西都扔掉了。我有点沮丧,因为我错过了这么简单的东西,但我会注意到 Access VBA 自动将“e”小写,因为它有时喜欢为您格式化代码。我复制并粘贴了所有这些,所以我认为这可能不是问题,但我忘记了 Access VBA 的自动格式化。
  • 还有,肖恩,您建议如何更新表格?来自数据库源的 ID 带有空格和句点,我认为我需要循环并使用 Replace() 删除它们。有没有更有效的方法来做到这一点?

标签: sql sql-server ms-access


【解决方案1】:

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

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

【讨论】:

  • 谢谢你,肖恩,这段代码效率更高。
【解决方案2】:

Sean Lange 指出很明显,我正在向 [EWOM].[dbo].[equipment] 提出请求,而它本应是 [Equipment]。复制文本时字母大写,但 Access VBA 将其粘贴后将其更改为小写,这让我陷入了循环。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2013-05-17
  • 2018-06-15
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多