更新MySQL和Access的问题

时间:2019-02-28 19:10:00

标签: mysql ms-access access-vba odbc

所以这是一天前开始出现的问题。

我有一个Access数据库文件,该文件存储用于创建作业,更新作业扇区并将其从MySQL表中删除的表单。

此表有两个表:一个存储在Access中的本地表,称为“作业路由”,另一个是通过MYSQL ODBC驱动程序(ANSI 5.3版本,称为“待办事项”)存储的。本地表存储用户提交的数据,其中包含有关所有作业区域和状态的信息,而MYSQL表一次仅显示一个作业区域。

创建新条目时,“访问”表单中的文本框详细信息将存储到两个表中。每个工作最多包含4个不同的部门(例如[开始日期],[区域1],[负责人1],[描述1],... [区域4],[负责人4],[描述4])。每当数据更新到下一个状态时,在本地表中仅作业计数器字段就会增加,而MYSQL表中称为“待办事项”的每个字段都将更新到其下一个状态字段。

与服务器的连接良好,一切正常,直到更新功能中出现问题为止。

该功能的基本工作原理是,在列表框控件上,正在从“待办事宜”表中查询所有当前作业数据。用户选择一个条目,然后单击一个按钮,该按钮将从“作业路径”中加载下一个扇区信息数据到各种文本框控件上。用户可以根据需要更改这些文本框输入-函数运行时唯一更改的是“待办事项”。 “作业路由”中的信息保持不变。当用户单击“更新”按钮时,下一个扇区字段数据将更新为“待办事项”,而“作业路径”中的计数器只会递增以表示当前扇区。

我的问题是这个。在大多数情况下,几乎所有内容都可以正常运行,但对于“待办事项”表中的某个字段,其值不会从文本框中更新。因此,例如,如果将文本框控件设置为“ Wyntile”,则应将字段名称设置为该名称,但由于某种原因,会显示一个不同的值,例如example =“ Apples”。这是代码:

Private Sub moveJob2_Click()

'get the job number
JobNum = Text31

CurrArea = DLookup("[Area]", "[To_Do]", "[Job_Number] =""" & JobNum & """")
area1 = DLookup("[Area1]", "[Job Route]", "[Job Number] =""" & JobNum & """")
area2 = DLookup("[Area2]", "[Job Route]", "[Job Number] =""" & JobNum & """")
area3 = DLookup("[Area3]", "[Job Route]", "[Job Number] =""" & JobNum & """")
area4 = DLookup("[Area4]", "[Job Route]", "[Job Number] =""" & JobNum & """")

'get what the current area is
Current = DLookup("[Current]", "[Job Route]", "[Job Number] =""" & JobNum & """")

'if the current area is the first area then check to make sure there is a second
'if so, then set the new area to it
If Current = 1 Then
    If area2 = "---" Then
        MsgBox area1 + " was the last area in the route. The job cannot be moved."
        Exit Sub
    End If
    newArea = area2
ElseIf Current = 2 Then
    If area3 = "---" Then
        MsgBox area2 + " was the last area in the route. The job cannot be moved."
        Exit Sub
    End If
    newArea = area3
ElseIf Current = 3 Then
    If area4 = "---" Then
        MsgBox area3 + " was the last area in the route. The job cannot be moved."
        Exit Sub
    End If
    newArea = area4
Else
    MsgBox area4 + " was the last area in the route. The job cannot be moved."
    Exit Sub
End If

'set up link to both the To_Do and Job Route tables
Dim dbJobNumbers As DAO.Database
Dim rstJob As DAO.Recordset
Dim jobRoute As DAO.Recordset

Set dbJobNumbers = CurrentDb
Set rstJob = dbJobNumbers.OpenRecordset("To_Do")
Set jobRoute = dbJobNumbers.OpenRecordset("Job Route")

' >> Edit the job in the To_Do table
****' ERROR: Out of all these, only [Person_In_Charge] is being set to something
****' completely different from Text33, which wasn't changed by the user.

rstJob.FindFirst "[Job_Number]=""" + Text31 + """"
rstJob.Edit
rstJob("[Area]").Value = newArea
rstJob("[Person_In_Charge]").Value = Text33  
rstJob("[Equipment]").Value = Text37
rstJob("[Description]").Value = Text35
rstJob.Update

'update the current area for the Job Route
jobRoute.FindFirst "[Job Number]=""" + Text31 + """"
jobRoute.Edit
jobRoute("[Current]").Value = CInt(Current) + 1
jobRoute.Update

'success message
MsgBox Text31 + " has been moved from " + CurrArea + " to " + newArea + "."

'requery the listboxes
Dim selectParas As String
selectParas = "SELECT [a].[Job_Number] as [Job Number], [a].[Description], [a].[Person_In_Charge] as [Person in Charge], [a].[Area] " & _
              " FROM [To_Do] As [a];"

listRemoveJobs.RowSource = selectParas
listRemoveJobs.Requery
listChangeJobArea.RowSource = selectParas
listChangeJobArea.Requery

End Sub

该功能一直运行良好,即使现在当我再次对其进行测试时,它仍按程序运行。尽管今天我收到了“在“待办事项”上的ODBC插入失败”的错误,但这是针对其他功能的。所以我当时在想ODBC连接/ MySQL表中出了点问题,但是当我在phpmyadmin中检查该表的大部分内容时,该表遵循与Access中使用的其他mysql表类似的格式。

还要注意,告诉我此问题的人在旧的Windows XP版本上运行,在该计算机上曾经有一次已定义的OBDC ANSI 5.3驱动程序实例的已知问题完全从Access的“数据源”列表中消失。 (驱动程序仍安装在Windows上)。那个时候,显然,驱动程序实例后来在重新启动计算机时再次神奇地再次出现在D.S.列表中。 ...我知道这很长,但是我似乎找不到导致Access中发生此更新错误的原因。是否存在一个已知的ODBC连接存在稳定性问题的问题?为什么在更新时将值更改为完全不同的值?任何见识将不胜感激。

1 个答案:

答案 0 :(得分:0)

虽然没有可重现的示例来帮助您解决特定情况,但请考虑运行带有绑定参数的纯SQL UPDATE查询。您的 area 条件逻辑可以重写为嵌套的IIF表达式。可能会简化您的问题并简化您的需求,而无需进行DLookup或多个记录集更新。另外,您也不必重新分配到RowSource。下面利用参数化,这是在应用程序层中运行SQL时的最佳实践:

SQL (下面将它们另存为Access查询)

  1. mySavedJoinUpdateQuery

    PARAMETERS Text33Param Text(255), Text35Param Text(255)
               Text37Param Text(255), JobNumberParam Text(255);
    UPDATE [To_Do] d
    INNER JOIN [Job Route] r
    ON d.Job_Number = r.Job_Number
    
    SET [Area] = IIF([Current] = 1 AND [Area2] != '---', [Area2], 
                     IIF([Current] = 2 AND [Area3] != '---', [Area3], 
                         IIF([Current] = 3 AND [Area4] != '---', [Area4], [Area1)
                     )
                 ),
        [Person_In_Charge] = Text33Param,
        [Equipment] = Text37Param,
        [Description] = Text35Param
    
    WHERE r.[Job Number] = JobNumberParam;
    
  2. mySavedSimpleUpdateQuery

    PARAMETERS JobNumberParam Text(255);
    UPDATE [Job Route] r
    SET r.[Current] = r.[Current] + 1
    WHERE r.[Job Number] = JobNumberParam;
    

VBA

Private Sub moveJob2_Click()
   Dim qdef As QueryDef
   Dim selectParas As String

   ' UPDATE JOIN QUERY
   Set qdef = CurrentDb.QueryDefs("mySavedJoinUpdateQuery")

   qdef!JobNumberParam = Text31
   qdef!Text33Param = Text33
   qdef!Text35Param = Text35
   qdef!Text37Param = Text37

   qdef.Execute dbFailOnError 
   Set qdef = Nothing

   ' UPDATE SIMPLE QUERY
   Set qdef = CurrentDb.QueryDefs("mySavedSimpleUpdateQuery")

   qdef!JobNumberParam = Text31   
   qdef.Execute dbFailOnError 
   Set qdef = Nothing

   ' REQUERY LIST BOXES
   listRemoveJobs.Requery
   listChangeJobArea.Requery
End Sub