Access не разрешает INSERT или UPDATE пустых значений в столбце SQL-Server (Access Run-Ошибка 3162) - PullRequest
1 голос
/ 24 апреля 2019

Здравствуйте, широкий мир стекопотока,

ВЫПУСК:В настоящее время я работаю над созданием базы данных sql-сервера, которая использует формы доступа для получения и вставки данных.До вчерашнего дня все работало нормально.Теперь проблема в том, что я получаю следующую ошибку при попытке выполнить мой запрос на вставку.

Access Runtime Error '3162': You tried to assign the Null value to a variable that is not a Variant data type.

ОПИСАНИЕ ВЫПУСКА:Кажется, это результат того, что Access не позволил мне ввести пустые значения INSERT или UPDATE в столбце таблицы SQL, который допускает нулевые значения.Далее, поддерживая это, если я выполняю те же запросы в Microsoft SQL Server Management Studio, я могу вставлять и ОБНОВЛЯТЬ пустые значения.Вы можете увидеть запрос INSERT, который я сейчас использую, в разделе СТАРЫЕ ИЗДАНИЯ.

РЕШЕНИЕ 24.04.19 13:35 PST:Похоже, что ссылка на таблицу доступа не использовала последнюю версию таблицы SQL.После обновления ссылки все заработало как надо


ДЕТАЛИ СТАРЫХ ВЫПУСКОВ:ОБНОВЛЕНИЕ: 24.04.19, 10:33 PST: Понял, я забыл сообщить, где происходит ошибка.Ошибка возникает в функции InsertProject на QDF.Execute

Насколько я видел, я этого не делаю.Все столбцы таблицы, которые могут быть нулевыми, установлены как таковые, и переменные внутри vba, кажется, установлены правильно из того, что я вижу.

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

Вот запрос, который я использую:


    INSERT INTO ci_project 
    (project_id, 
    project_group, 
    project_projecttype, 
    project_hasmilestones, 
    project_hasgantt, 
    project_category, 
    project_difficulty, 
    project_notes, 
    project_completiondetails, 
    project_statuscode, 
    project_inprogressdate, 
    project_completeddate, 
    project_datecreated, 
    project_lastupdated, 
    project_canceleddate, 
    project_isActive) 
    VALUES (@projectID
    ,@projectGroup
    ,@projectType
    ,@projectHasMilestones
    ,@projectHasGantt
    ,@projectCategory
    ,@projectDifficulty
    ,@projectNotes
    ,@projectCompletionDetails
    ,@projectStatus
    ,@projectDateInProgress
    ,@projectDateComplete
    ,@projectDateCreated
    ,@projectDateUpdated
    ,@projectCanceledDate
    ,@projectIsActive);

Вот функция, которую я сделал, чтобы облегчить ее многократный вызов:


    'This is located in another Module called OtherFunctions
    Dim dbs as DAO.Database

    Public Function InsertProject(projectID As String, _
                                  projectGroup As Integer, _
                                  projectType As Integer, _
                                  projectHasMilestones As Boolean, _
                                  projectHasGantt As Boolean, _
                                  projectCategory As Integer, _
                                  projectDifficulty As Integer, _
                                  projectNotes As Variant, _
                                  projectCompletionDetails As Variant, _
                                  projectStatus As Integer, _
                                  projectDateInProgress As Variant, _
                                  projectDateComplete As Variant, _
                                  projectCanceledDate As Variant, _
                                  projectIsActive As Integer)

        OtherFunctions.Initialize

        Dim QDF As DAO.QueryDef

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

        Set QDF = OtherFunctions.dbs.CreateQueryDef("InsertProject", SQLInsertProject)

        QDF.Parameters("@projectID").Value = projectID
        QDF.Parameters("@projectGroup").Value = projectGroup
        QDF.Parameters("@projectType").Value = projectType
        QDF.Parameters("@projectHasMilestones").Value = projectHasMilestones
        QDF.Parameters("@projectHasGantt").Value = projectHasGantt
        QDF.Parameters("@projectCategory").Value = projectCategory
        QDF.Parameters("@projectDifficulty").Value = projectDifficulty
        QDF.Parameters("@projectNotes").Value = projectNotes
        QDF.Parameters("@projectCompletionDetails").Value = projectCompletionDetails
        QDF.Parameters("@projectStatus").Value = projectStatus
        QDF.Parameters("@projectDateInProgress").Value = ConvertDateToUnix(projectDateInProgress)
        QDF.Parameters("@projectDateComplete").Value = ConvertDateToUnix(projectDateComplete)
        QDF.Parameters("@projectDateCreated").Value = ConvertDateToUnix(Now())
        QDF.Parameters("@projectDateUpdated").Value = ConvertDateToUnix(Now())
        QDF.Parameters("@projectIsActive").Value = projectIsActive
        QDF.Parameters("@projectCanceledDate").Value = ConvertDateToUnix(projectCanceledDate)

        QDF.Execute

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

        Set QDF = Nothing

    End Function

Вот где я вызываю функцию:


    'These are set in the same sub as the insert project call
    Dim projectID As String
    Dim CancelDate As Variant
    Dim canceledStatus As Integer

    'These are located in a different module called OtherFunctions
    Public IDEASUGGESTION_HASGANT As Boolean
    Public IDEASUGGESTION_HASMILESTONES As Boolean
    Public IDEASUGGESTION_PROJECTTYPE As Integer


    ' /\/\/\ THERE IS CODE ABOVE THIS /\/\/\
        canceledStatus = 12
    If Me.IdeaStatus = canceledStatus And DatabaseQueries.CheckIdeaSuggestion(Me.IdeaID) = True Then
       CancelDate = Now()
       If MsgBox("Are you sure you want to do this? Canceling a idea will make it un-editable.", vbYesNo) = vbYes Then
           GoTo IdeaCancel
       Else
           GoTo GotoEnd
       End If
    ElseIf Me.IdeaStatus = canceledStatus And DatabaseQueries.CheckIdeaSuggestion(Me.IdeaID) = False Then
       MsgBox "You cannot cancel an idea that does not exist.", vbExclamation
       CancelDate = Null
       GoTo GotoEnd
    Else
       'other code run here not pertaining to the insert
    End If

    Call DatabaseQueries.InsertProject(
         projectID, _
         Me.IdeaGroup, _
         OtherFunctions.IDEASUGGESTION_PROJECTTYPE, _
         OtherFunctions.IDEASUGGESTION_HASMILESTONES, _
         OtherFunctions.IDEASUGGESTION_HASGANT, _
         Me.IdeaCategory, _
         Me.IdeaDifficulty, _
         Null, _
         Null, _
         Me.IdeaStatus, _
         Me.IdeaInprogressDate, _
         Me.IdeaCompleteDate, _
         CancelDate, _
         1)

    ' \/\/\/ THERE IS CODE BELOW THIS \/\/\/

Когда я запускаю это, это значения формы:


    Me.ideaID = Null
    Me.IdeaGroup = 1
    Me.IdeaCategory = 2
    Me.IdeaDifficulty = 1
    Me.IdeaStatus = 1
    Me.IdeaInprogressDate = Null
    Me.IdeaCompleteDate = Null
    OtherFunctions.IDEASUGGESTION_PROJECTTYPE = 1
    OtherFunctions.IDEASUGGESTION_HASMILESTONES = False
    OtherFunctions.IDEASUGGESTION_HASGANT = False

Структура таблицы:

    Column Name                 Data Type   Can be Null
    project_id                  varchar(45) No
    project_group               int         No
    project_projecttype         int         No
    project_hasmilestones       bit         No
    project_hasgantt            bit         No
    project_category            int         No
    project_difficulty          int         No
    project_notes               text        Yes
    project_completiondetails   text        Yes
    project_statuscode          int         No
    project_inprogressdate      bigint      Yes
    project_completeddate       bigint      Yes
    project_datecreated         bigint      No
    project_lastupdated         bigint      No
    project_canceleddate        bigint      Yes
    project_isActive            int         No

Мои извинения за стену кодовых блоков.

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

ОБНОВЛЕНИЕ 24.04.19 11:10 PST: Основано на комментариях от HansUp, которые я создалальтернативный метод вставки с использованием метода RST.AddNew Более подробную информацию можно найти здесь .После этого я обнаружил, что переменная, вызывающая горе, - это projectCanceledDate в функции InsertProject.Единственная проблема заключается в том, что я не знаю почему, переменная определена как вариант.

ОБНОВЛЕНИЕ 24.04.19 11:43 AM PST: после еще некоторого тестирования.Я обнаружил, что могу вставлять и обновлять значения NULL для project_cancleddate внутри Microsoft SQL Server Management Studio.

Ответы [ 2 ]

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

После еще нескольких экспериментов я нашел проблему. Похоже, что изменение в SQL-сервере не было отражено в базе данных доступа (а именно: project_canceleddate принимает пустые значения). После обновления ссылки на таблицу ci_project все заработало нормально.

0 голосов
/ 24 апреля 2019

В вызове InsertProject поля projectID и CancelDate не имеют каких-либо значений. Что для них используется?

Добавьте этот простой код, чтобы посмотреть, что там в параметрах.

Dim parm As DAO.Parameter
For Each parm In QDF.Parameters
    Debug.Print parm.Name, parm.Value
Next parm

Вот что я получил

  @projectID                  MyProjId
  @projectGroup               1
  @projectType                1
  @projectHasMilestones       0
  @projectHasGantt            0
  @projectCategory            2
  @projectDifficulty          1
  @projectNotes               Null
  @projectCompletionDetails   Null
  @projectStatus              1
  @projectDateInProgress      Null
  @projectDateComplete        Null
  @projectDateCreated         1556103601
  @projectDateUpdated         1556103601
  @projectCanceledDate        Null
  @projectIsActive            1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...