Kako pridobiti vrednosti v shranjenih procedurah strežnika SQL Server s ADO


Za Microsoft Visual Basic .NET za različico tega članka glejte 308049 .

Povzetek


Pri poskusu, da pridobite RAISERROR/PRINT/Return Values iz strežnika SQL Server shranjene procedure prek podatkovnih predmetov ActiveX (ADO), lahko razmislite o pomembnih težavah. Tukaj so tri težave:
  • RAISERROR izjave v strežniku SQL Server morajo biti raven resnosti 11-18.
  • TISKANJE izjav v strežniku SQL Server lahko zapolni tudi zbirko napak ADO. Vendar pa je tiskanje izjav raven resnosti nič (0), zato je v shranjeni proceduri zahtevano vsaj eno RAISERROR izjavo, da pridobite izjavo za tiskanje z ADO prek zbirke napak.
  • VRNJENe vrednosti v shranjeno proceduro morajo biti povezane z vsaj enim predmetom resultset.

Več informacij


Ta vzorčna koda prikazuje, kako lahko v zbirki podatkov strežnika SQL Server v shranjenem postopku za dostop do RAISERROR/tiskanja/VRNITVE poiščete podatke o napakah, ki se vračajo.
  1. Prilepite in izvedite naslednjo kodo v oknu ISQL_W, da ustvarite shranjen postopek, ki se uporablja za vzorec ADO v koraku 4:
          use pubs      GO      if exists (select * from sysobjects where id =        object_id('dbo.ADOTestRPE') and sysstat & 0xf = 4)      drop procedure dbo.ADOTestRPE      GO      create procedure ADOTestRPE      (      @SetRtn  INT=0 OUTPUT,      @R1Num   INT=1,      @P1Num   INT=1,      @E1Num   INT=1,      @R2Num   INT=2,      @P2Num   INT=2,      @E2Num   INT=2      )      AS      DECLARE @iLoop     INT      DECLARE @PrintText VARCHAR(255)      DECLARE @iErrNum   INT      /*   Check for no Resultsets - needed to get the RETURN value back */       IF @R1Num + @R2Num = 0 SELECT NULL      /*   Resultset 1  ******************************* */       IF @R1Num > 0      BEGIN         SET ROWCOUNT @R1Num         SELECT 'Resultset 1' RsNum, Title         FROM Pubs..Titles         SET ROWCOUNT 0      END         /* Must raise a default error context in which to return the PRINT */         /*  statement */        /* (if none present) since PRINT statements are a severity level of */       /*0. */       IF (@P1Num > 0) AND (@E1Num = 0) RAISERROR ("RAISERROR.PError1",         11, 2)      IF @P1Num > 0      BEGIN         SELECT @iLoop = 0         WHILE @iLoop < @P1Num         BEGIN            SELECT @iLoop = @iLoop + 1            SELECT @PrintText = 'PRINT.Resultset.1: Line ' +      CONVERT(char(2), @iLoop)         PRINT @PrintText        END      END      IF @E1Num > 0      BEGIN         SELECT @iLoop = 0         WHILE @iLoop < @E1Num         BEGIN            SELECT @iLoop = @iLoop + 1            SELECT @iErrNum = @iLoop + 201000            RAISERROR ("RAISERROR.Resultset.1", 11, 2)         END      END      /*   Resultset 2  ******************************* */       IF @R2Num > 0      BEGIN         SET ROWCOUNT @R2Num         SELECT 'Resultset 2' RsNum, Title         FROM Pubs..Titles         SET ROWCOUNT 0      END      /* Must raise a default error context in which to return the PRINT */       /*  statement */       /* (if none present) since PRINT statements are a severity level of */       /*  0. */       IF (@P2Num > 0) AND (@E2Num = 0) RAISERROR ("RAISERROR.PError2",      11, 2)      IF @P2Num > 0      BEGIN         SELECT @iLoop = 0         WHILE @iLoop < @P2Num         BEGIN            SELECT @iLoop = @iLoop + 1            SELECT @PrintText = 'PRINT.Resultset.2: Line ' +       CONVERT(char(2), @iLoop)            PRINT @PrintText         END      END      IF @E2Num > 0      BEGIN         SELECT @iLoop = 0         WHILE @iLoop < @E2Num         BEGIN            SELECT @iLoop = @iLoop + 1            SELECT @iErrNum = @iLoop + 202000            RAISERROR ("RAISERROR.Resultset.2", 11, 2)         END      END      /*   Return & Output ************************************ */             select @SetRtn = -1      RETURN @SetRtn      GO
  2. Ustvarjanje standarda. Project EXE v programu Visual Basic. Obrazec1 je privzeto ustvarjen.
  3. V meniju» projekt «izberite» sklici «in izberite» Microsoft ActiveX Data Objects Library «. Opomba: Če želite, da koda deluje pravilno, morate uporabiti ADO različico 2,0 ali novejšo. Najnovejše komponente Microsoft Data Access Components (MDAC) lahko pridobite v spletu na tem spletnem mestu:
  4. V obrazec postavite ukazni gumb in nato prilepite to kodo v razdelek splošne deklaracije v obrazcu: Opomba: morda boste morali spremeniti niz za povezovanje zbirke podatkov za okolje.
          'This Code demonstrates RAISERROR/PRINT/RETURN values with ADO and      'multiple resultsets.      Sub CreateParms()      Dim ADOCmd As New ADODB.Command      Dim ADOPrm As New ADODB.Parameter      Dim ADOCon As ADODB.Connection      Dim ADORs As ADODB.Recordset      Dim sParmName As String      Dim strConnect As String      Dim rStr As String      On Error GoTo ErrHandler      strConnect = "driver={SQL        Server};server=(local);uid=sa;pwd=;database=pubs"      Set ADOCon = New ADODB.Connection      With ADOCon          .Provider = "MSDASQL"          .CursorLocation = adUseServer  'Must use Server side cursor.          .ConnectionString = strConnect          .Open      End With      Set ADOCmd.ActiveConnection = ADOCon      With ADOCmd          .CommandType = adCmdStoredProc          .CommandText = "ADOTestRPE"      End With      'Parameter 0 is the stored procedure Return code.      sParmName = "Return"      Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _        adParamReturnValue, , 0)      ADOCmd.Parameters.Append ADOPrm      ADOCmd.Parameters(sParmName).Value = -1      'Parameter 1 is the setting for the stored procedure Output      ' parameter.      sParmName = "Output"      Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _        adParamOutput)      ADOCmd.Parameters.Append ADOPrm      ADOCmd.Parameters(sParmName).Value = 999      'Parameter 2      sParmName = "R1Num"     'Number of rows to return in Resultset 1.      Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _        adParamInput)      ADOCmd.Parameters.Append ADOPrm      ADOCmd.Parameters(sParmName).Value = 1      'Parameter 3      sParmName = "P1Num"     'Number of PRINT statements in Resultset 1.      Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _       adParamInput)      ADOCmd.Parameters.Append ADOPrm      ADOCmd.Parameters(sParmName).Value = 0      'Parameter 4      sParmName = "E1Num"     'Number of RAISERROR statements in Resultset                              '1.      Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _        adParamInput)      ADOCmd.Parameters.Append ADOPrm      ADOCmd.Parameters(sParmName).Value = 0      'Parameter 5      sParmName = "R2Num"     'Number of rows to return in Resultset 2.      Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _        adParamInput)      ADOCmd.Parameters.Append ADOPrm      ADOCmd.Parameters(sParmName).Value = 2      'Parameter 6      sParmName = "P2Num"     'Number of PRINT statements in Resultset 2.      Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _        adParamInput)      ADOCmd.Parameters.Append ADOPrm      ADOCmd.Parameters(sParmName).Value = 0      'Parameter 7      sParmName = "E2Num"     'Number of RAISERROR statements in Resultset                              ' 2.      Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _       adParamInput)      ADOCmd.Parameters.Append ADOPrm      ADOCmd.Parameters(sParmName).Value = 0      Set ADORs = ADOCmd.Execute      Do While (Not ADORs Is Nothing)          If ADORs.State = adStateClosed Then Exit Do          While Not ADORs.EOF              For i = 0 To ADORs.Fields.Count - 1                  rStr = rStr & " : " & ADORs(i)              Next i              Debug.Print Mid(rStr, 3, Len(rStr))              ADORs.MoveNext              rStr = ""          Wend          Debug.Print "----------------------"          Set ADORs = ADORs.NextRecordset      Loop      Debug.Print "Return: " & ADOCmd.Parameters("Return").Value      Debug.Print "Output: " & ADOCmd.Parameters("Output").Value      GoTo Shutdown      ErrHandler:          Call ErrHandler(ADOCon)          Resume Next      Shutdown:          Set ADOCmd = Nothing          Set ADOPrm = Nothing          Set ADORs = Nothing          Set ADOCon = Nothing      End Sub      Private Sub Command1_Click()      Call CreateParms      End Sub      Sub ErrHandler(objCon As Object)      Dim ADOErr As ADODB.Error      Dim strError As String      For Each ADOErr In objCon.Errors       strError = "Error #" & ADOErr.Number & vbCrLf & ADOErr.Description _          & vbCr & _           "   (Source: " & ADOErr.Source & ")" & vbCr & _           "   (SQL State: " & ADOErr.SQLState & ")" & vbCr & _           "   (NativeError: " & ADOErr.NativeError & ")" & vbCr       If ADOErr.HelpFile = "" Then           strError = strError & "   No Help file available" & vbCr & vbCr       Else           strError = strError & "   (HelpFile: " & ADOErr.HelpFile & ")" _       & vbCr & _                       "   (HelpContext: " & ADOErr.HelpContext & ")" & _       vbCr & vbCr       End If       Debug.Print strError      Next      objCon.Errors.Clear      End Sub
  5. Spremenite vrednost parametrov od 2 do 7, če želite spremeniti število izjav za tiskanje in/ali RAISERROR izjav, ustvarjenih s shranjeno proceduro, in jih vrniti prek ADO. Znova zaženite vzorčno Visual Basicovo kodo in si zapomnite, da so izjave RAISERROR in tiskanja vrnjene v zbirki napak ADO. Spremenite vrednosti, da eksperimentirate z različnimi kombinacijami izjav PRINT/RAISERROR z različnimi resultsets. Oglejte si shranjene procedure SQL za določene rešitve za posebne primere. Opomba: Če želite pridobiti VRNJENo vrednost v ADO s shranjeno proceduro, mora biti vsaj en resultset. Če se ta težava lahko odpravite, ko ne določite nobenih resultsets (v vzorčni kodi ADO) shranjeno proceduro izvede polje SELECT NULL, da vrne ničelno vrednost» NULL «, če želite, da se s tem popolnijo VRNJENe vrednosti. Poleg tega, da se obrnete na težavo z določanjem nobenega RAISERROR izjav in kombinacije izjav za tiskanje, so privzeto ustvarjene RAISERROR izjave, da zagotovite kontekst za vrnitev izjave PRINT prek ADO. Izjave RAISERROR morate kodirati v obliki zapisa, ki je prikazana v shranjeni proceduri, ker se le raven resnosti 11-18 vrne skozi zbirko napak ADO.

Reference


Pomoč za Transact-SQL: iskanje po:» Natisni/RAISERROR izjava «če želite več informacij, preberite ta članek v Microsoftovi zbirki znanja:
190988 Kako asinhrono odpreti svoje množice zapisov v storitvi WithEvents