我正在尝试使用 BE SQL Server 2012 Express 中的记录更新本地 Access 2007 表。
我的步骤在这里:
-
SQL Server中存在带有4个参数的存储过程来获取所需的记录;
-
Access VBA中有调用SP并进行临时查询的函数:
Public Function UpdateLocalSQLTable(strTable As String, strSQL As
String, strSQL1 As String) As Boolean
On Error GoTo Err_Handler
Dim qdf As DAO.QueryDef
Dim strQuery As String
Dim conConnectString As String
strQuery = "qryTemp"
DoCmd.Close acTable, strTable
If IsQueryExists(strQuery) Then DoCmd.DeleteObject acQuery, strQuery
conConnectString = GetUserParams(NetConnDat)
Set qdf = CurrentDb.CreateQueryDef(strQuery)
With qdf
.Connect = conConnectString
.SQL = strSQL
.Close
End With
CurrentDb.Execute strSQL1
UpdateLocalSQLTable = True
qdf.Close
Exit_Handler:
Set qdf = Nothing
Exit Function
Err_Handler:
Call LogError(Err.Number, Err.Description, "UpdateLocalSQLTable", , True)
Resume Exit_Handler
End Function
以下是传递给子例程的两个 SQL 字符串:
strSQL=EXEC [dbo].[usp_TabelMakeTmpTable] @strEmp='0033111',@strMon='2014.12',@strDep='STR',@strPam='STR3'
strSQL1=UPDATE tbl_tmp_Tab_s INNER JOIN qryTemp ON tbl_tmp_Tab_s.EmplCodeID0 = qryTemp.EmplCodeID0 SET tbl_tmp_Tab_s.GraphHrs = [qryTemp]![GraphHrs];
我很好地创建了查询“qryTemp”,但在 UPDATE 语句中出现错误 3073。“操作必须使用可更新查询”。
它出什么问题了?
Access 总是对待一个UPDATE
其中包括只读的联接传递查询。即使当UPDATE
不会尝试改变传递中的值。
正如您在评论中提到的,您可以将传递结果集存储在 Access 表中。加入该表来代替传递UPDATE
应该管用。但是,您也提到这似乎有点肮脏。没有争论。 :-)
所以也许你更喜欢使用DLookup
获取qryTemp.GraphHrs的值UPDATE
。这个应该可以,但不知道执行速度是否可以接受......
UPDATE tbl_tmp_Tab_s
SET tbl_tmp_Tab_s.GraphHrs =
DLookup(
"GraphHrs",
"qryTemp",
"EmplCodeID0=" & EmplCodeID0
);
如果数据类型为员工代码ID0是文本而不是数字,在其值周围包含引号...
"EmplCodeID0='" & EmplCodeID0 & "'"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)