查询不可更新

Query not updateable

我正在尝试使用来自 BE SQL Server 2012 Express 的记录更新本地 Access 2007 table。 我的步骤:

  1. 在SQL服务器中存在带有4个参数的存储过程来获取所需的记录;

  2. 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 来获取 UPDATEqryTemp.GraphHrs 值。这个应该可以,但是不知道执行速度会不会acceptable ...

UPDATE tbl_tmp_Tab_s
SET tbl_tmp_Tab_s.GraphHrs =
    DLookup(
        "GraphHrs",
        "qryTemp",
        "EmplCodeID0=" & EmplCodeID0
        );

如果 EmplCodeID0 的数据类型是文本而不是数字,请在其值周围加上引号 ...

        "EmplCodeID0='" & EmplCodeID0 & "'"