查询不可更新

时间:2015-01-22 06:40:43

标签: sql-server vba ms-access stored-procedures access-vba

我正在尝试使用BE SQL Server 2012 Express中的记录更新本地Access 2007表。 我在这里的步骤:

  1. 在SQL Server中存在具有4个参数的存储过程以获取所需记录;

  2. 在Access VBA中,有一个函数可以调用SP并进行临时查询:

  3. 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."操作必须使用可更新的查询"。

    它有什么问题?

1 个答案:

答案 0 :(得分:4)

Access始终将包含已加入的传递查询的UPDATE视为只读。即使UPDATE没有尝试改变传递中的值,也是如此。

正如您在评论中提到的,您可以将传递结果集存储在Access表中。加入该表代替UPDATE中的传递应该有效。但是,你也提到过看起来有点脏。那里没有争论。 : - )

因此,您可能希望使用DLookup来获取UPDATE qryTemp.GraphHrs 值。这个应该可行,但我不知道执行速度是否可以接受......

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

如果 EmplCodeID0 的数据类型是文本而不是数字,则在其值附近包含引号...

        "EmplCodeID0='" & EmplCodeID0 & "'"