查询不可更新
Query not updateable
我正在尝试使用来自 BE SQL Server 2012 Express 的记录更新本地 Access 2007 table。
我的步骤:
在SQL服务器中存在带有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 table 中。加入 table 代替 UPDATE
中的传递应该有效。但是,您还提到这似乎有点脏。那里没有争论。 :-)
所以您可能更愿意使用 DLookup
来获取 UPDATE
的 qryTemp.GraphHrs 值。这个应该可以,但是不知道执行速度会不会acceptable ...
UPDATE tbl_tmp_Tab_s
SET tbl_tmp_Tab_s.GraphHrs =
DLookup(
"GraphHrs",
"qryTemp",
"EmplCodeID0=" & EmplCodeID0
);
如果 EmplCodeID0 的数据类型是文本而不是数字,请在其值周围加上引号 ...
"EmplCodeID0='" & EmplCodeID0 & "'"
我正在尝试使用来自 BE SQL Server 2012 Express 的记录更新本地 Access 2007 table。 我的步骤:
在SQL服务器中存在带有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 table 中。加入 table 代替 UPDATE
中的传递应该有效。但是,您还提到这似乎有点脏。那里没有争论。 :-)
所以您可能更愿意使用 DLookup
来获取 UPDATE
的 qryTemp.GraphHrs 值。这个应该可以,但是不知道执行速度会不会acceptable ...
UPDATE tbl_tmp_Tab_s
SET tbl_tmp_Tab_s.GraphHrs =
DLookup(
"GraphHrs",
"qryTemp",
"EmplCodeID0=" & EmplCodeID0
);
如果 EmplCodeID0 的数据类型是文本而不是数字,请在其值周围加上引号 ...
"EmplCodeID0='" & EmplCodeID0 & "'"