Неверное имя объекта, но объект явно действителен - PullRequest
2 голосов
/ 15 мая 2019

Я пытаюсь выполнить некоторые запросы SQL в MS Access, но определенный запрос ведет себя очень странно и выдает ошибку, которая, как мне кажется, скрывает реальную проблему.Вот вопрос в вопросе:

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 изменяется на первый отправленный мной запрос, он завершается неудачно.Все остальные мои запросы работают с использованием этого метода.

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Даже при том, что это была простая синтаксическая ошибка, вы действительно должны НЕ использовать курсор для чего-то простого. Это должен быть подход, основанный на множестве, а не RBAR (строка с мучительной строкой). Вся ваша логика курсора может быть упрощена до этого. Вы можете рассмотреть возможность использования хранимых процедур вместо того, чтобы хоронить всю свою логику sql в вашем приложении. Дает вам больше контроля и намного легче почти во всех аспектах.

UPDATE [EWOM].[dbo].[Equipment] SET eqNum = 
REPLACE(REPLACE(equipmentID, ' ', ''), '.', '')
0 голосов
/ 15 мая 2019

Шон Ланге указал на очевидное, я обращался к [EWOM]. [Dbo]. [Equipment], когда это должно было быть [Equipment].Письмо было написано заглавными буквами, когда я скопировал текст, но Access VBA изменил его на строчные после того, как я вставил его, что привело к циклу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...