Access QueryDef не обновляет связанные таблицы - PullRequest
0 голосов
/ 29 апреля 2019

SETUP:

Я использую базу данных SQL Server, связанную с файлом MS Access, поэтому я могу использовать формы доступа.

Я использую несвязанные формы с пользовательскими запросами, так как имею дело с несколькими таблицами (если есть более эффективный способ, я за это).

В SQL Server я настроил базу данныхроль с разрешениями для таблицы, я дважды проверил, позволил ли роли обновить таблицу.

ВЫПУСК:

Всякий раз, когда я использую свой запрос на обновление в Access, используя QueryDef (показанный ниже), он выполняется успешно, но фактически не обновляет таблицу.

ДЕТАЛИ:

У меня тоже была проблема с моим запросом вставки, однако это было только потому, что я не обновил запрос новыми столбцами, которые добавил в базу данных.Я также убедился, что я сделал то же самое для запроса на обновление.

Кроме того, я знаю, что запрос на обновление работает, поскольку я могу обновить запись непосредственно из SSMS.

Поскольку это выглядело как другой вопрос о доступе / sql-сервере, который у меня был, Нашел здесь .Я обязательно попробовал решение для этого, обновив ссылку на таблицу.Однако это не имеет значения.

КОД:

Запрос:

UPDATE con_people 
SET people_first_name = @firstName,
    people_last_name = @lastName,
    people_title = @title,
    people_group = @group,
    people_email = @email,
    people_shift = @shift,
    people_hiredate = @hireDate,
    people_location = @location,
    people_reportsTo = @reportsTo,
    people_versionCount = people_versionCount + 1,
    people_datelastupdated = @dateUpdated,
    people_isActive = @isActive
WHERE people_employeeID = @empID;

QueryDef:

Public Function UpdatePeople(firstName As String, _
                                lastName As String, _
                                title As Integer, _
                                group As Integer, _
                                Email As Variant, _
                                isActive As Boolean, _
                                Shift As Integer, _
                                Location As Integer, _
                                HireDate As Variant, _
                                ReportsTo As Variant, _
                                employeeID As Integer)

    OtherFunctions.Initialize

    Dim QDF As DAO.QueryDef

    If FindQuery("UpdatePeople") = True Then OtherFunctions.dbs.QueryDefs.Delete "UpdatePeople"

    Set QDF = OtherFunctions.dbs.CreateQueryDef("UpdatePeople", SQLUpdatePeople)

    QDF.Parameters("@firstName").Value = firstName
    QDF.Parameters("@lastName").Value = lastName
    QDF.Parameters("@title").Value = title
    QDF.Parameters("@group").Value = group
    QDF.Parameters("@email").Value = Email
    QDF.Parameters("@isActive").Value = isActive
    QDF.Parameters("@empID").Value = employeeID
    QDF.Parameters("@shift").Value = Shift
    QDF.Parameters("@hireDate").Value = HireDate
    QDF.Parameters("@location").Value = Location
    QDF.Parameters("@reportsTo").Value = ReportsTo
    QDF.Parameters("@dateUpdated").Value = ConvertTimeUnix.ConvertDateToUnix(Now())
    QDF.Execute

    If FindQuery("UpdatePeople") = True Then OtherFunctions.dbs.QueryDefs.Delete "UpdatePeople"

End Function

Любая помощь приветствуется,

Спасибо.

1 Ответ

1 голос
/ 30 апреля 2019

Благодаря комментарию @Andre мне удалось найти источник проблемы.

Я использовал неправильный тип данных, когда обновлял запись. SQL-сервер ожидал INT (для внешнего ключа), когда я предоставлял его логическое значение (SQL-Server BIT).


Подробности О решении:

Ссылки предоставлены Андре: Объект ошибки - Объект доступа к данным и Определить реальную причину сбоя ODBC (ошибка 3146) с помощью ms-доступа? . Для получения дополнительной информации об объекте DAO.Error, пожалуйста, обратитесь к ним.

Вот пример того, как он используется:

    Dim myerror As DAO.Error
    For Each myerror In DBEngine.Errors
        With myerror
            If .Number <> 3146 Then 'prevents the system from returning the basic error.
                MsgBox "Error #:" & .Number & ", Description: " & .Description & ", Source: " & .Source
            End If
        End With
    Next

Как только я запустил его, он вернулся, что позволило мне найти основную причину:


Ошибка №: 547,

Описание: [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Оператор UPDATE вступил в конфликт с ограничением FOREIGN KEY «FK_people_isActive». Конфликт произошел в базе данных «непрерывное улучшение», таблица «dbo.con_isactive», столбец «isActive_id».,

Источник: ODBC.QueryDef

Опять спасибо Андре.

...