Здравствуйте, широкий мир стекопотока,
ВЫПУСК:В настоящее время я работаю над созданием базы данных 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.