所以这是一天前开始出现的问题。
我有一个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连接存在稳定性问题的问题?为什么在更新时将值更改为完全不同的值?任何见识将不胜感激。
答案 0 :(得分:0)
虽然没有可重现的示例来帮助您解决特定情况,但请考虑运行带有绑定参数的纯SQL UPDATE
查询。您的 area 条件逻辑可以重写为嵌套的IIF
表达式。可能会简化您的问题并简化您的需求,而无需进行DLookup
或多个记录集更新。另外,您也不必重新分配到RowSource
。下面利用参数化,这是在应用程序层中运行SQL时的最佳实践:
SQL (下面将它们另存为Access查询)
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;
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