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
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' " & _
"return @OutParam +10"
sDrop = "if exists " & _
"(select * from sysobjects where " & _
"id = object_id('dbo.sp_AdoTest') and " & _
"sysstat & 0xf = 4)" & _
"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 & 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 & "RetVal Param = " & Cmd1.Parameters(0).Value
Debug.print vbTab & "Input Param = " & Cmd1.Parameters(1).Value
Debug.print vbTab & "Output Param = " & 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 & 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 & recreate it.
Conn1->Execute( bstrDrop, &vtEmpty, ADODB::adCmdText);
Conn1->Execute( bstrCreate, &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( &vtEmpty, &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 & 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 & 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
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