Cómo llamar a procedimientos almacenados en VC
_ ConnectionPtr m _ Conn
_CommandPtr m_Command
_ variante _ t vNULL // se define como sin parámetros.
vNULL.vt = VT _ ERROR
v null scode = DISP _ E _ PARAMNOTFOUND
m _ Conn crear instancia(_ _ uuidof(ADODB). ::Conexión)); //Inicializar conexión
m_command. crear instancia(__uuidof(ADODB::Comando)); //Comando de inicialización
m_conn-gt; open(" Proveedor = SQL oledb; fuente de datos = yjf directorio inicial = pub; ID de usuario = saPassword=sa ", "", "", admode desconocido); // Utilice su declaración directa aquí.
_ bstr _ t sp _ execstr
sp _ execstr = " Exec sp _ name//sp_name es el nombre del procedimiento almacenado y debe ejecutarse directamente en SQL Server.
m_Command->ActiveConnection = m_Conn
m_Command->m_CommandTxt = sp_execstr
m_pRecordset = m_p comando-gt;execute(ampv null amp;vNULL, ADC mdtext) ;
************************************ ******** ***************************************** ***
_ ConnectionPtr m _ pConnection
_ CommandPtr m _ pCommand
//cpp en función
//Establecer conexión ado
HRESULT hr
hr = m _connection crear instancia(_ _ uuidof(Conexión));
Probar
{
if (éxito(hora))
{
hr = m_connection-gt;open(_ bstr_t(L " Proveedor = SQL oledb.1; Información de seguridad persistente = ID de usuario falso = sa Directorio inicial = Viper; Fuente de datos = Viper "), _bstr_t (L" sa "), _bstr_t (L " "), admode desconocido);
}
} p>
catch(_ com _ error amp; uh)
{
AfxMessageBox(error.Descripción (), MB_OK, 0);
AfxMessageBox(Error.
ErrorMessage(), MB_OK, 0);
AfxMessageBox("No se puede conectar al servidor SQL SERVER, el programa se cerrará. Verifique el dispositivo de red", MB_OK, 0);
Salir (0);
}
//Ejecutar procedimiento almacenado
CString cvar1, cvar2
int cvar3
CVaR 1 = " DDD ";
cvar2 =
CVaR 3 = 0;
Probar
{ p>
m_pComando. crear instancia(_ _ uuidof(Command));
m _command-gt;conexión activa = app-gt;m_connection;
m _command-gt;CommandType = adCmdStoredProc
m _command-gt; CommandText = _ bstr _ t(" pr _ zs _ dzdy ");
_variant_t vvar1, vvar2, vvar3
vvar 1 = _ variante _ t(_ bstr _ t(CVaR 1));
vvar 2 = _ variante _ t(_ bstr _ t(CVaR 2));
vvar 3 = _ variante _ t(CVaR 3);
_ParameterPtr mp_var1, mp_var2, mp_var3
mp_var1. crear instancia(_ _ uuidof(Parámetro));
mp_var2. crear instancia(_ _ uuidof(Parámetro));
mp_var3.
crear instancia(_ _ uuidof(Parámetro));
MP _ var 1 = m _ p comando- gt; Crear parámetro
(
_bstr_t(" var1 "),
adVarChar,
adParamInput,
3,
vvar1
); p>
p>
m _command-gt;parameter-gt;append(MP_var 1);
MP_var 2 = m_p command-gt;crear parámetro
(
_bstr_t("var2 "),
adVarChar,
adParamOutput,
3,
vvar2
);
m_command - gt; parámetro - gt; append(MP_var 2);
MP_var 3 = m_p comando- gt;
(
_bstr_t("var3 "),
adinger,
adParamOutput,
p>
9,
vvar3
);
m_command-gt;parameter-gt;append(MP_var 3);
_ variante _ t vNull
vNull.vt = VT _ ERROR
v null scode = DISP _ E _ parámetro no encontrado
m_command->Execute(ampv null amp; vNull, adCmdStoredProc);
CVaR 2 = MP_var 2->Value.bstrVal
CVaR 3 = MP_var 3- gt;
}
catch(_ com _ error amp; error)
{
Cuadro de mensaje ( error.errormessage(), "¡Error de ADO!"
);Cuadro de mensaje (error.descripción(), "¡Error de ADO!"
}
***************** ********************************** **************** ************
Si utiliza ODBC para acceder a la base de datos, puede consultar el siguiente código:
c base de datos * p base de datos = nuevo c base de datos;
Pruebe
{
p base de datos - gt; OpenEx(_ T(" DSN = nombre odbc; UID = * * *PWD=* ** ", base de datos c:: noOdbcDialog);
}
CATCH (CDBException, e)
{
Eliminar pDatabase
Regreso;
}End_capture
SQL. format(" exec sp _ Name "); //Escribe directamente después del parámetro.
pDatabase->ejecutar SQL(SQL);
pDatabase->cerrar();
Eliminar pDatabase
**** **************************
El siguiente es un artículo de MSDN, si busca "procedimientos almacenados y VC" , puede encontrar muchos artículos técnicos en MSDN
Buena suerte
Pasos para reproducir el comportamiento
En SQL Server 7.0 Query Analyzer, seleccione Probar DatabasePubs.
Cree el siguiente procedimiento almacenado. El procedimiento almacenado devuelve un conjunto de registros y un recuento de parámetros de salida.
Si existe (seleccione * de sysobjects, donde id = object_id(N'[dbo]).
[GetJobs]') y OBJECTPROPERTY(id, N'IsProcedure') = 1)
Eliminar proceso GetJobs
Ir
crear proc GetJobs @id como int , @count as int [out] as
Inicio
select @ Count = Count(*)from trabajo donde trabajo _ id gt @id
Seleccionar; * de trabajos donde trabajo _ id gt@id
Fin
Ir
Utilice el Asistente de aplicaciones VC para crear una nueva aplicación de consola y modificar El código es el siguiente sigue:
#Incluye "stdafx.h"
#Incluye "stdio.h"
# import "C:\PROGRA ~ 1 \COMMON~1 \System\ado\msado 15.dll "no_namespace rename("EOF","EOF2")
Inicialización de estructura {
InitOle(){:: CoInitialize(NULL);}
~ InitOle(){::coun inicialize();}
} _ init _ InitOle _
int main(int argc, char* argv[ ])
{
_variant_t varErr((long)0, VT _ ERROR);
_ CommandPtr comm(_ _ uuidof (Comando));
_ Conexión ptr conn(_ _ uuidof(Conexión));
_ bstr _ t connstr = " Proveedor = SQL oledb . 1; Información de seguridad persistente = ID de usuario falso = sa inicial directorio = pub; fuente de datos = (local)";
conn- gt; Open (connstr, "", "", adconnect sin especificar);
comm- gt; ActiveConnection = conn
comm- gt; CommandText = " GetJobs
comm- gt; CommandType = adCmdStoredProc
comm- gt; Parámetros- gt ;refresh();
_ variante _ t recs
comm- gt; parámetro- gt; artículo[_ variante _ t((corto)1)]- gt = _variante_t((largo)5 );
_RecordsetPtr RS = comm- gt; ejecutar(amprec amp; vtMissing, adCmdStoredProc);
_variant_t recuento de registros = comm- gt;parameter-gt;item[_ variante _ t((corto)2)]- gt;valor;
printf("recordcount = l
i\n ", recuento de registros (largo);
Devuelve 0;
}
Cambiar la fuente de datos, el ID de usuario y la contraseña.
El tipo de variable de recuento de registros devuelta por el código anterior es VT_NULL, no el número de registros devueltos por el procedimiento almacenado.