簡體   English   中英

Access 中的直通查詢

[英]PassThrough Query in Access

我是使用 SQL server express 來升級 Access (2007-2010) 前端的新手。

我寫了一個管理 SQL 連接的類模塊。 為了自動調用函數、被調用過程和動態 SQL 字符串,最后兩個使用 SELECT 語句成功返回一個表,我將其附加到 DAO.recordset 以進一步提取結果。

但是,當嘗試對插入語句執行相同操作時,我遇到了一個問題 SQL passthrough 查詢是:

DECLARE @ret int;
BEGIN TRANSACTION T1;
BEGIN TRY
INSERT INTO dbo.[Munten](Munt, Decimalen, Volgorde) VALUES ('XYZ', 4, 99)
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION T1;
END CATCH;
IF @@TRANCOUNT = 0
SET @ret = 0
ELSE
BEGIN
        COMMIT TRANSACTION T1;
    SET @ret = 1
END;
SELECT @ret as Retval;

在 SQL 管理工作室上運行良好,返回一列記錄,但在執行 poassthrough 查詢時,我得到:

“將 returnrecords 屬性設置為 true 的 Passtrhough 沒有返回任何記錄”

訪問代碼如下:

Public Function AddRecord(TblName As String, Connectstring As String,      ParamArray Pars()) As Boolean
Dim s As String, I As Integer, str As String, sc As String, sv As String, rs As DAO.Recordset
ProcList.Start procmodule, "AddRecord", TblName, Connectstring, Pars()
On Local Error GoTo ErrHandler
With appdb.CreateQueryDef("")
    If Len(Connectstring) = 0 Then
       .Connect = StConnectstr
    Else
       .Connect = Connectstring
   End If
   For I = 0 To UBound(Pars)     ' ubound=-1 if no pars are passed
       If I Mod 2 = 0 Then     ' list of columns
          If I > 0 Then sc = sc & ", "
          sc = sc & Pars(I)
       Else                    '  list of values
          If I > 1 Then sv = sv & ", "
          If IsDate(Pars(I)) Then
              sv = sv & DateForSQL(Pars(I))
          ElseIf IsNumeric(Pars(I)) Then
              sv = sv & ConvDecimal(Pars(I), True)
          Else
              sv = sv & cSquote & Pars(I) & cSquote
         End If
       End If
   Next
   s = "INSERT INTO " & Me.WithSchema(TblName, IsTable) & "(" & sc & ") VALUES (" & sv & ")"
   str = EmbedTryCatch(s, .Connect)
   .ReturnsRecords = True
   .SQL = str
   AddRecord = (.OpenRecordset(, dbSQLPassThrough).Fields(0) <> 0)
   .Close
End With
Exit_Here:
     ProcList.Leave
     Exit Function
ErrHandler:
     If Error_message() Then Resume 0
     Resume Exit_Here
End Function

Private Function EmbedTryCatch(SQLstring As String, Connectstr As String) As String
EmbedTryCatch = "DECLARE @ret BIT;" & vbCrLf _
    & "BEGIN TRANSACTION T1;" & vbCrLf _
    & "BEGIN TRY" & vbCrLf _
        & SQLstring & vbCrLf _
    & "END TRY" & vbCrLf _
    & "BEGIN CATCH" & vbCrLf _
        & "IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION T1;" & vbCrLf _
    & "END CATCH;" & vbCrLf _
    & "IF @@TRANCOUNT = 0" & vbCrLf _
        & "SET @ret = 0" & vbCrLf _
    & "ELSE" & vbCrLf _
        & "BEGIN" & vbCrLf _
            & "COMMIT TRANSACTION T1;" & vbCrLf _
            & "SET @ret = 1" & vbCrLf _
        & "END;" & vbCrLf _
    & "SELECT @ret as Retval;"
End Function

漁獲在哪里?

您需要將查詢的 ReturnsRecords 屬性設置為 False,因為插入查詢不返回任何內容。

包括以下內容也是一個好主意:

set nocount on

作為您的直通查詢的第一行 - 例如,Access 似乎無法理解您將在 SSMS 中看到的返回消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM