Argentina
Mapa del sitio  | Home | Worldwide
Microsoft
Buscar en Microsoft.com:
Ayuda y Soporte Técnico  
| Seleccione un producto | Búsqueda Avanzada | Grupos de noticias | Contáctenos

Cómo invocar un procedimiento almacenado con consulta ADO que utiliza VBA/ C+ +/ Java

AVISO: Gracias por utilizar el servicio de Traducción Automática. Este artículo ha sido traducido por un sistema informático sin ayuda humana (Machine Translation). Microsoft ofrece estos artículos a los usuarios que no comprendan el inglés, exclusivamente, con el fin de que puedan entenderlos más fácilmente. Microsoft no se hace responsable de la calidad lingüística de las traducciones ni de la calidad técnica de los contenidos de los artículos así como tampoco de cualesquiera problemas, directos o indirectos, que pudieran surgir como consecuencia de su utilización por los lectores.
Id. de artículo : 185125
Última revisión : lunes, 14 de marzo de 2005
Versión : 1.2
En esta página

Resumen

Para abrir un procedimiento almacenado dentro de ActiveX Data Objects ( ADO ), primero debe abrir un relleno la Colección de Parámetros con un parámetro de la colección para cada parámetro de la consulta de objeto Connection, a continuación un Objeto de Comando, y utilizar luego el método Command.Execute() para abrir el Recordset de ADO.

Puede utilizar opcionalmente el método Parameters.Refresh para rellenar la Colección de Parámetros para el procedimiento almacenado. Si el procedimiento almacenado devuelve resultado o si devuelve parámetros, además debe cerrar el conjunto de registros antes de comprobar el valor de los parámetros de salida.

Se muestra esto en los miniprogramas siguientes de código que eliminan (si ya existe) crea un procedimiento almacenado, sp_adoTest en un SQL Server entrada, salida y parámetros devueltos, así como devolver un conjunto de registros a continuación.

En este artículo se demuestra cómo realizar esta operación que utiliza VBA/VBScript, C++ y Java.

Volver al principio

Más información

Estos fragmentos de código se abrevian a partir de los ejemplos ADO indicados en la sección "Referencie". Utilice los ejemplos completos ADO por favor si desea generar y ejecutar este código.

Volver al principio

VBA en Visual Basic o Microsoft Access & VBScript desde ASP

   Dim Conn1 As ADODB.Connection
   Dim Cmd1 As ADODB.Command
   Dim Rs1 As ADODB.Recordset


   Dim strTmp As String


   Dim Connect As String
   Dim Drop As String
   Dim Create As String
   Dim sp as string


   Dim i As Integer
   Dim l As Long


   sConnect= "driver={sql server};" & _


             "server=server_name;" & _
             "Database=pubs;UID=uder_id;PWD=password;"


   sCreate = "create proc sp_AdoTest( @InParam int, " & _


             "@OutParam int OUTPUT ) " & _
             "as "  & _
             "select @OutParam = @InParam + 10 " & _
             "SELECT * FROM Authors WHERE "   & _
             "State <> 'CA' "  &amp; _
             "return @OutParam +10"


   sDrop   = "if exists "  &amp; _


             "(select * from sysobjects where "  &amp; _
             "id = object_id('dbo.sp_AdoTest') and " &amp; _
             "sysstat &amp; 0xf = 4)"  &amp; _
             "drop procedure dbo.sp_AdoTest"


   sSP     = "sp_Adotest"


   ' Establish connection.
   Set Conn1 = New ADODB.Connection
   Conn1.ConnectionString = sConnect
   Conn1.Open


   ' Drop procedure, if it exists &amp; recreate it.
   Set Rs1 = Conn1.Execute(sDrop, l, adCmdText)
   Set Rs1 = Nothing


   Set Rs1 = Conn1.Execute(sCreate, l, adCmdText)
   Set Rs1 = Nothing


   ' Open recordset.
   Set Cmd1 = New ADODB.Command
   Cmd1.ActiveConnection = Conn1
   Cmd1.CommandText = "sp_AdoTest"
   Cmd1.CommandType = adCmdStoredProc
   Cmd1.Parameters.Refresh
   Cmd1.Parameters(1).Value = 10
   Set Rs1 = Cmd1.Execute()


   ' Process results from recordset, then close it.
   RS1.Close
   Set Rs1 = Nothing


   ' Get parameters (assumes you have a list box named List1).


   Debug.print vbTab &amp; "RetVal Param = " &amp; Cmd1.Parameters(0).Value
   Debug.print vbTab &amp; "Input  Param = " &amp; Cmd1.Parameters(1).Value
   Debug.print vbTab &amp; "Output Param = " &amp; Cmd1.Parameters(2).Value
				
Por ejemplo, si utilizan VBScript, reemplazará las instrucciones Dim con llamadas equivalentes CreateObject:
   Set conn1 = CreateObject( "ADODB.Connection.1.5" )
				
Ya que la versión ADO 1.x no es compatible binaria, es útil especificar a qué versión de ADO hacen referencia sus secuencias de comandos.

Volver al principio

C++ que utiliza import

   #import "C:\Program Files\Common Files\System\ado\msado15.dll" \ 

   _variant_t  vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);

           rename( "EOF", "adoEOF" )


   ...
   ADODB::_ConnectionPtr  Conn1;
   ADODB::_CommandPtr     Cmd1;
   ADODB::_RecordsetPtr   Rs1;


   _bstr_t    bstrConnect( L"driver={sql server};"


                           L"server=server_name;"
                           L"Database=pubs;UID=user_id;PWD=password;" );


   _bstr_t    bstrCreate ( L"create proc sp_AdoTest( @InParam int, "


                           L"@OutParam int OUTPUT ) "
                           L"as "
                           L"select @OutParam = @InParam + 10 "
                           L"SELECT * FROM Authors WHERE "
                           L"State <> 'CA' "
                           L"return @OutParam +10" );


   _bstr_t    bstrDrop   ( L"if exists "


                           L"(select * from sysobjects where "
                           L"id = object_id('dbo.sp_AdoTest') and "
                           L"sysstat &amp; 0xf = 4)"
                           L"drop procedure dbo.sp_AdoTest" );


   _bstr_t    bstrSP     ( L"sp_Adotest" );


   try
   {


       // Establish connection.
       Conn1.CreateInstance( __uuidof( ADODB::Connection ) );
       Conn1->ConnectionString = bstrConnect;
       Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty, -1 );


       // Drop procedure, if it exists &amp; recreate it.
       Conn1->Execute( bstrDrop, &amp;vtEmpty, ADODB::adCmdText);
       Conn1->Execute( bstrCreate, &amp;vtEmpty, ADODB::adCmdText);


       // Open recordset.
       Cmd1.CreateInstance( __uuidof( ADODB::Command ) );
       Cmd1->ActiveConnection = Conn1;
       Cmd1->CommandText      = bstrSP;
       Cmd1->CommandType      = ADODB::adCmdStoredProc;


       Cmd1->Parameters->Refresh();
       Cmd1->Parameters->Item[ _variant_t( (long) 1 ) ]->Value =
                                                  _variant_t( (long) 10 );


       Rs1 = Cmd1->Execute( &amp;vtEmpty, &amp;vtEmpty2,
ADODB::adCmdUnknown );


       // Process results from recordset, then close it.
       Rs1->Close();


       // Get parameters.
       TRACE( "\tRetVal Param = %s",
              CrackStrVariant( (tagVARIANT)
                    Cmd1->Parameters->Item[ _variant_t( 0L ) ]-
>Value ) );
       TRACE( "\tInput  Param = %s",
              CrackStrVariant( (tagVARIANT)
                    Cmd1->Parameters->Item[ _variant_t( 1L ) ]-
>Value ) );
       TRACE( "\tOutput Param = %s",
              CrackStrVariant( (tagVARIANT)
                    Cmd1->Parameters->Item[ _variant_t( 2L ) ]-
>Value ) );


   }
   catch( CException *e ) { e->Delete(); }
   catch(...)             {  }
				
Para una demostración sobre cómo utilizar un Parametrizar Consulta, cualquiera con clases generó por el ClassWizard de MFC o utilizando COM recto que programa, ve el ejemplo de ADOVC al que se hace referencia en la sección REFERENCIAS por favor.

CrackStrVariant es aquellos materiales (Si es posible) los contenidos de una Variante en un CString una función y se muestra en el ejemplo de Adovc.exe al que se hace referencia a continuación.

Volver al principio

Java

   msado15._Connection  Conn1   = new msado15.Connection();
   msado15._Command     Cmd1    = null;
   msado15._Recordset   Rs1     = new msado15.Recordset();


   Variant              v1 = new Variant();
   Variant              v2 = new Variant();


   String  bstrConnect = new String(


               "driver={sql server};" +
               "server=CharlotteTown;Database=pubs;UID=sa;PWD=;");


   String  bstrCreate  = new String(


               "create proc sp_AdoTest( @InParam int, " +
               "@OutParam int OUTPUT ) " +
               "as " +
               "select @OutParam = @InParam + 10 " +
               "SELECT * FROM Authors WHERE " +
               "State <> 'CA' " +
               "return @OutParam +10" );


   String  bstrDrop    = new String(


               "if exists " +
               "(select * from sysobjects where " +
               "id = object_id('dbo.sp_AdoTest') and " +
               "sysstat &amp; 0xf = 4)" +
               "drop procedure dbo.sp_AdoTest" );


   String  bstrSP      = new String( "sp_Adotest" );


   // Trap any error/exception.
   try
   {


       // Establish connection.
       Conn1.putConnectionString( bstrConnect );
       Conn1.Open( bstrEmpty, bstrEmpty, bstrEmpty, -1 );


       // Drop procedure, if it exists &amp; recreate it.
       vtEmpty.noParam();
       Conn1.Execute( bstrDrop, vtEmpty,
                                       msado15.CommandTypeEnum.adCmdText);
       vtEmpty.noParam();
       Conn1.Execute( bstrCreate, vtEmpty,
                                       msado15.CommandTypeEnum.adCmdText);


      // Open recordset.
       Cmd1= new msado15.Command();
       Cmd1.putActiveConnection( Conn1 );
       Cmd1.putCommandText     ( bstrSP );
       Cmd1.putCommandType     (msado15.CommandTypeEnum.adCmdStoredProc);


       Cmd1.getParameters().Refresh();
       v1.putInt( 1 );
       v2.putInt( 10 );
       Cmd1.getParameters().getItem( v1 ).putValue( v2 );


       vtEmpty.noParam();
       vtEmpty2.noParam();
       Rs1 = Cmd1.Execute( vtEmpty, vtEmpty2,
                                  msado15.CommandTypeEnum.adCmdUnknown );


       // Process results from recordset, then close it.
       Rs1.Close();


       // Get parameters (assumes you have a listbox named List1)
       v1.putInt( 0 );
       List1.addItem( "    RetVal Param = " +
                         Cmd1.getParameters().getItem( v1 ).getValue() );
       v1.putInt( 1 );
       List1.addItem( "    Input  Param = " +
                         Cmd1.getParameters().getItem( v1 ).getValue() );
       v1.putInt( 2 );
       List1.addItem( "    Output Param = " +
                         Cmd1.getParameters().getItem( v1 ).getValue() );
   }
   // Catch Blocks
   catch (com.ms.com.ComFailException e) { }
   catch(Exception e)                    { }
				

Volver al principio

Referencias

Para información adicional, consulte los artículos siguientes en el Microsoft Knowledge Base:

172403 (http://support.microsoft.com/kb/172403/EN-US/) EJEMPLO: Adovb.exe muestra cómo utilizar ADO con Visual Basic

220152 (http://support.microsoft.com/kb/220152/EN-US/) ARCHIVO: Adovc.exe muestra cómo utilizar ADO con Visual C++

Volver al principio


La información de este artículo se refiere a:
Microsoft ActiveX Data Objects 1.0
Microsoft ActiveX Data Objects 1.5
Microsoft ActiveX Data Objects 2.0
Microsoft ActiveX Data Objects 2.1
Microsoft ActiveX Data Objects 2.5
Microsoft ActiveX Data Objects 2.6
Microsoft ActiveX Data Objects 2.7

Volver al principio

Palabras clave: 
kbhowto kbdatabase kbmdacnosweep kbcode kbarttypeinf KB185125 KbMtes kbmt

Volver al principio

 

Buscar en

 
Búsqueda Avanzada

Seleccione idioma

 

Más soporte técnico

Herramientas


©2007 Microsoft Corporation. Todos los derechos reservados. Aviso legal |Marcas registradas |Privacidad