【问题标题】:Null date in MS Access form causes error in SQL Server when table is updated using ADO & VBA使用 ADO 和 VBA 更新表时,MS Access 表单中的空日期会导致 SQL Server 出错
【发布时间】: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


【解决方案1】:

道歉 - 答案很简单。我将需要传递 null 的参数的参数类型从 adDAte 更改为 adDBDate 并且它起作用了。还有一个编码错误 - 我在日期的参数中留下了“大小”值 - 在之前的尝试中,我曾尝试将日期作为字符串传递。-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多