【发布时间】:2021-01-27 17:17:46
【问题描述】:
我在 MS Access 中的表单上有 10 个字段 - 三个是按顺序更新的日期字段 - (“开始日期”、“预期结束日期”、“实际结束日期”。)实际结束日期第一次始终为 NULL表单已更新,前几次编辑的预期结束日期也可能为空。
当我编辑表单并单击更新按钮时,VBA 例程调用 SQL Server 存储过程以使用更改/新值更新数据库。
一切正常 - 除非我将任何日期字段保留为 NULL(它们必须用于业务流程),当 VBA 执行存储过程时出现错误。请查看我迄今为止使用的代码(我已经花了很多时间在这上面没有运气)
错误详情:3421 应用程序为当前操作使用了错误类型的值。
Private Sub cmdUpdate_Click()
Dim Con As ADODB.Connection
Dim cmd As ADODB.Command
Dim rtn As Integer
Dim dtStartDate As Date
Dim dtProjectedEnd As Date
Dim dtActualEnd As Date
On Error GoTo HandleErr
Set Con = New ADODB.Connection
Con.ConnectionString = fnProvider
Con.Open
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = Con
.CommandType = adCmdStoredProc
Select Case frmStatus
Case "Add"
.CommandText = "dbo.spAddProjectPhaseDetail"
Case "Edit"
.CommandText = "dbo.spEditProjectPhaseDetail"
End Select
.Parameters.Append .CreateParameter("@PhaseDetailID", adinteger, adparaminput, , Me.txtPhaseDetailID)
.Parameters.Append .CreateParameter("@ProjPhaseID", adinteger, adparaminput, , Me.cboProjPhase)
.Parameters.Append .CreateParameter("@ProjectID", adVarChar, adparaminput, 10, Me.txtProjectID)
.Parameters.Append .CreateParameter("@PhaseLead", adinteger, adparaminput, , Me.cboTestLead)
If IsNull(Me.txtStartDt) Then
MsgBox "You must include a phase start date - this can be an estimate", vbExclamation, "Input Error"
GoTo ExitSub
End If
.Parameters.Append .CreateParameter("@PhaseStartDate", adDate, adparaminput, 9, Me.txtStartDt)
.Parameters.Append .CreateParameter("@PhaseProjectedEndDate", adDBDate, adparaminput, 9, Nz(Me.txtProjectedEnd, Null))
.Parameters.Append .CreateParameter("@PhaseActualEndDate", adDBDate, adparaminput, 9, Nz(Me.txtActualEnd, Null))
.Parameters.Append .CreateParameter("@SoftwareBuild", adVarChar, adparaminput, 20, Nz(Me.txtSoftwareBuild, ""))
.Parameters.Append .CreateParameter("@SysEnvironmentID", adVarChar, adparaminput, 50, Nz(Me.txtSysEnvironment, ""))
.Parameters.Append .CreateParameter("@IsCurrent", adinteger, adparaminput, , Nz(Me.chkCurrent, 0))
.Execute rtn
End With
If rtn = 0 Then
Err.Raise 10005, , "Could not add record to database."
Else
MsgBox IIf(frmStatus = "Edit", "Record Updated", "Record Added"), vbInformation, "Data Update"
End If
ExitSub:
Con.Close
Set Con = Nothing
Set cmd = Nothing
frmStatus = ""
DoCmd.Close acForm, "frmAddProjectPhases"
Exit Sub
HandleErr:
MsgBox "[" & Err.Number & "] " & Err.Description & vbCrLf & "If the error persisits, please contact support."
Call sbSysErrorLogUpdate(Err.Number, Err.Description, "Target:frmAddProjectProjectPhases/cmdUpdate_Click()")
Err.Clear
GoTo ExitSub
存储过程:
ALTER PROCEDURE [dbo].[spEditProjectPhaseDetail]
@PhaseDetailID Integer,
@ProjPhaseID Integer,
@ProjectID varchar(10),
@PhaseLead integer,
@PhaseStartDate DATE,
@PhaseProjectedEndDate date = NULL,
@PhaseActualEndDate date = NULL,
@SoftwareBuild varchar(50) = NULL,
@SysEnvironmentID varchar(50) = NULL,
@IsCurrent bit = 0
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.tblProjPhaseDetail
Set
fPROJ_PHASE_ID = @ProjPhaseID,
fPROJECT_ID = @ProjectID,
fPHASE_LEAD = @PhaseLead,
PHASE_START_DT = @PhaseStartDate,
PHASE_PROJECTED_END_DT = @PhaseProjectedEndDate,
PHASE_ACTUAL_END_DT = @PhaseActualEndDate,
SOFTWARE_BUILD = @SoftwareBuild,
SYS_ENVIRONMENT_ID = @SysEnvironmentID
WHERE PHASE_DETAIL_ID = @PhaseDetailID
END
如果能在 Null 日期下运行此程序,我将不胜感激。谢谢
【问题讨论】:
标签: sql-server datetime ms-access stored-procedures ado