SQL सर्वर में मान को प्राप्त करने के लिए कैसे संग्रहीत कार्यविधियाँ ADO के साथ


308049 इस आलेख के एक Microsoft Visual Basic .NET संस्करण के लिए, देखें।

सारांश


महत्वपूर्ण समस्याओं पर विचार करें जब मुद्रण/RAISERROR/वापसी मान SQL सर्वर से प्राप्त करने का प्रयास कर ActiveX डेटा ऑब्जेक्ट (ADO) के माध्यम से संग्रहीत प्रक्रियाएँ हैं। तीन समस्याएँ हैं:

  • RAISERROR कथन SQL सर्वर में कोई गंभीरता स्तर 11-18 का होना आवश्यक है।
  • मुद्रण कथन SQL सर्वर में भी ADO त्रुटियाँ संग्रह को पॉप्युलेट कर सकते हैं। हालांकि, इसलिए गंभीरता स्तर शून्य (0) मुद्रण कथन है, कम से कम एक RAISERROR कथन संग्रहीत कार्यविधि में कोई ADO के साथ मुद्रण कथन त्रुटियाँ संग्रह के माध्यम से प्राप्त करने के लिए आवश्यक है।
  • वापसी मान एक संग्रहीत प्रक्रिया में कम से कम एक resultset के साथ संबद्ध होना आवश्यक है।

अधिक जानकारी


निम्न कोड नमूने प्रदर्शित करता है कि SQL सर्वर संग्रहीत कार्यविधि एकाधिक resultsets दे रहा है से एक RAISERROR/प्रिंट/वापसी विवरण तक पहुँचने के लिए ADO त्रुटियाँ संग्रह ब्राउज़:

  1. चिपकाएँ और उपयोग ADO नमूने के चरण 4 के लिए संग्रहीत कार्यविधि को बनाने के लिए ISQL_W विंडो में निम्न कोड निष्पादित:
          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. एक मानक बना है। EXE प्रोजेक्ट Visual Basic में है। Form1 डिफ़ॉल्ट रूप से बनाया जाता है।
  3. प्रोजेक्ट मेनू से संदर्भ का चयन करें, और Microsoft ActiveX डेटा ऑब्जेक्ट लायब्रेरी का चयन करें। नोट: आपके पास ADO संस्करण 2.0 या बाद के लिए कोड सही रूप से कार्य करने के लिए उपयोग करना चाहिए। आप निम्न URL पर वेब पर नवीनतम Microsoft डेटा एक्सेस घटकों (MDAC) घटक प्राप्त कर सकते हैं:

  4. कोई आदेश बटन को प्रपत्र पर रखें, और तब सामान्य घोषणा प्रपत्र के अनुभाग में निम्न कोड चिपकाएँ: नोट: डेटाबेस को बदलने के लिए आपको पड़ सकता है अपने परिवेश के लिए स्ट्रिंग कनेक्ट करें।
          '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. दो से सात मुद्रण कथन और/या RAISERROR कथन की संख्या परिवर्तित करने के लिए संग्रहीत कार्यविधि द्वारा जनरेट किया गया और ADO के माध्यम से वापस पैरामीटर का मान परिवर्तित करें। Visual Basic कोड नमूने फिर से चलाएँ, और नोट करें कि ADO त्रुटियाँ संग्रह के माध्यम से और प्रिंट RAISERROR कथन दिए गए हैं। मुद्रण/RAISERROR कथन से भिन्न resultsets के भिन्न संयोजन के साथ experiment करने के लिए मान परिवर्तित करें। विशेष मामले के विशिष्ट वैकल्पिक हलों के लिए SQL संग्रहीत कार्यविधियाँ करने के लिए कृपया देखें।


    नोट: एक वापसी प्राप्त करने के लिए मान ADO में वहाँ कोई संग्रहीत कार्यविधि से कम से कम एक resultset होना चाहिए। जब कोई resultsets (ADO नमूना कोड में) एक का चयन करें इस प्रकार वापसी मान पॉपुलेट कर रहा है ADO करने के लिए एक नल resultset वापस जाने के लिए नल निष्पादित करता है संग्रहीत कार्यविधि निर्दिष्ट नहीं हैं, तो इस समस्या के आसपास काम करने के लिए। इसके अलावा, कोई RAISERROR कथन और मुद्रण कथन का कोई संयोजन निर्दिष्ट करने की समस्या को हल करने के लिए, डिफ़ॉल्ट RAISERROR कथन ADO के माध्यम से मुद्रण कथन लौटाने के लिए एक संदर्भ प्रदान करने के लिए तैयार हैं। 11-18 की गंभीरता स्तर केवल ADO त्रुटियाँ संग्रह के माध्यम से दिया, क्योंकि संग्रहीत कार्यविधि में दिखाए गए स्वरूप में RAISERROR कथन कोड होना चाहिए।

संदर्भ


लेनदेन करें-SQL मदद: पर खोजें: "मुद्रण/RAISERROR कथन"


अधिक जानकारी के लिए, कृपया निम्न आलेख को Microsoft ज्ञानकोश में देखें:

190988 एसिन्क्रॉनस रूप में उपयोग WithEvents का उपयोग करके ADO अभिलेख सेट को खोलने के लिए कैसे