首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Access中的PassThrough查询

Access中的PassThrough查询
EN

Stack Overflow用户
提问于 2015-11-04 06:15:56
回答 1查看 343关注 0票数 0

我刚开始使用来提升访问权限(2007-2010年)的前端。

我编写了一个管理SQL连接的类模块。为了自动调用函数、调用过程和动态SQL字符串,最后两个函数成功地返回一个表,使用我附加到DAO.recordset的SELECT语句来进一步提取结果。

但是,当试图对insert语句执行相同的操作时,我遇到了一个问题,SQLpass身查询是:

代码语言:javascript
复制
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;

这在返回一列记录的上运行良好,但在执行poass身查询时,我得到:

“返回记录属性设置为true的Passtrhough没有返回任何记录”

将访问代码下垂:

代码语言:javascript
复制
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

渔获物在哪里?

EN

回答 1

Stack Overflow用户

发布于 2015-11-04 08:21:47

您需要将查询的ReturnsRecords属性设置为False,因为插入查询不会返回任何内容。

还有一个好主意,包括:

代码语言:javascript
复制
set nocount on

作为您的直通查询访问的第一行,似乎无法理解您将在SSMS中看到的返回消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33514935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档