كيفيه استرداد القيم في الإجراءات المخزنة في SQL Server مع ADO

للحصول علي إصدار Microsoft Visual Basic .NET من هذه المقالة ، راجع .

الملخص

توجد مشاكل هامه يجب أخذها في الاعتبار عند محاولة استرداد قيم رايسيرور/PRINT/RETURN من الإجراءات المخزنة في SQL Server عبر كائنات بيانات ActiveX (ADO). فيما يلي ثلاثه مشاكل:

  • يجب ان تكون عبارات رايسيرور في SQL Server مستوي الخطورة 11-18.

  • يمكن ان تقوم "عبارات الطباعة" في SQL Server أيضا بملء مجموعه أخطاء ADO. علي الرغم من ذلك ، تكون بيانات الطباعة ذات مستوي الاهميه صفرا (0) التالي تكون عبارة رايسيرور واحده علي الأقل مطلوبه في الاجراء المخزن لاسترداد عبارة الطباعة مع ADO عبر المجموعة أخطاء.

  • يجب ان تكون القيم المرجعة في اجراء مخزن مقترنة بمجموعه نتائج واحده علي الأقل.

مزيد من المعلومات

يوضح نموذج التعليمات البرمجية التالية استعراض مجموعه أخطاء ADO للوصول إلى الرايسيرور/الطباعة/الإرجاع من الإجراءات المخزنة في SQL Server التي ترجع ريسولتسيتس متعددة:

  1. قم بلصق التعليمات البرمجية التالية في نافذه الISQL_W وتنفيذها لإنشاء الاجراء المخزن المستخدم لنموذج ADO في الخطوة 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. إنشاء مقياس. EXE project في Visual Basic. يتم إنشاء Form1 بشكل افتراضي.

  3. من قائمه Project ، اختر المراجع وحدد مكتبه كائنات بيانات Microsoft ActiveX. ملاحظه: يجب عليك استخدام الإصدار 2.0 من ADO أو أحدث لكي تعمل التعليمات البرمجية بشكل صحيح. يمكنك الحصول علي أحدث مكونات Microsoft Data Access (MDAC) علي الويب علي عنوان URL التالي:

  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. غير قيمه المعلمات من اثنين إلى سبع لتغيير عدد جمل الطباعة و/أو عبارات رايسيرور التي تم إنشاؤها بواسطة الاجراء المخزن والتي يتم إرجاعها عبر ADO. قم بتشغيل نموذج التعليمات البرمجية ل Visual Basic مره أخرى ولاحظ انه يتم إرجاع عبارات رايسيرور و PRINT عبر مجموعه أخطاء ADO. يمكنك تغيير القيم لتجربتها باستخدام مجموعات مختلفه من البيانات PRINT/رايسيرور مع ريسولتسيتس مختلفه. يرجى الرجوع إلى الإجراءات المخزنة في SQL للحصول علي حلول بديله خاصه للحالات الخاصة. ملاحظه: لاسترداد القيمة المرجعة في ADO مع اجراء مخزن يجب ان يكون هناك مجموعه واحده علي الأقل. لحل هذه المشكلة ، عند عدم تحديد اي ريسولتسيتس (في التعليمات البرمجية النموذجية في نموذج ADO) ، ينفذ الاجراء المخزن قيمه فارغه لإرجاع مجموعه نتائج خاليه إلى ADO التالي يتم نشر القيمة المرجعة. بالاضافه إلى ذلك ، لحل مشكله تحديد البيانات غير الرايسيروره ومجموعه من عبارات الطباعة ، يتم إنشاء عبارات الرايسيرور الافتراضية لتوفير سياق لإرجاع بيان الطباعة عبر ADO. يجب ان رايسيرور عبارات التعليمات البرمجية بالتنسيق المبين في الاجراء المخزن لان مستويات الخطورة فقط من 11-18 التي ترجع عبر مجموعه أخطاء ADO.

المراجع

العمليات-تعليمات SQL: البحث في: "PRINT/رايسيرور البيان" للحصول علي مزيد من المعلومات ، يرجى مراجعه المقالة التالية في قاعده معارف Microsoft:

كيفيه فتح مجموعات سجلات ADO بشكل غير متزامن باستخدام WithEvents

هل تحتاج إلى مزيد من المساعدة؟

توسيع المهارات
استكشاف التدريب
الحصول على الميزات الجديدة أولاً
الانضمام إلى Microsoft Insider

هل كانت المعلومات مفيدة؟

نشكرك على ملاحظاتك!

شكراً لك على الملاحظات! يبدو أنه من المفيد إيصالك بأحد وكلاء دعم Office لدينا.

×