2015-11-04 34 views
0

我是使用SQL Server Express來升級Access(2007-2010)前端的新手。Pass Through通過查詢訪問

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

但是試圖INSERT語句我遇到一個問題,做同樣的當 SQL直通查詢:

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; 

是執行poassthrough當運行在SQL Management Studio中返回一列記錄罰款查詢我得到:

「Passtrhough與returnrecords屬性設置爲true沒有找到任何記錄」

貝婁訪問代碼:

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 

在哪裏抓到?

回答

0

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

也是一個不錯的主意,包括:

set nocount on 

爲您的直通查詢的第一線 - 訪問似乎並不明白返回的消息,你會在SSMS看到的例子。

+0

我知道......但你怎麼才能檢測到一個成功的操作。 –

+0

如果從DAO返回沒有錯誤,那麼您可以假定該語句已成功完成。我想你可以再次查詢數據庫檢查插入,但我認爲這可能是不必要的開銷。 –