ODBCNet
ODBCNet
ODBCNet
NET
En este artculo se describe paso a paso cmo llamar a un procedimiento almacenado parametrizado de Microsoft SQL Server mediante el proveedor administrado de Conectividad abierta de bases de datos (ODBC, Open Database Connectivity) .NET y Microsoft Visual C++ .NET. La ejecucin de un procedimiento almacenado parametrizado mediante el proveedor ODBC .NET es ligeramente distinta de la ejecucin del mismo procedimiento con el proveedor de datos OLE DB o SQL Server .NET. Por ejemplo, con el proveedor ODBC .NET es necesario usar la sintaxis de CALL de ODBC para llamar al procedimiento almacenado, en lugar de usar el nombre del procedimiento. Para obtener informacin adicional acerca de la sintaxis de CALL de ODBC, consulte la pgina "Procedure Calls" en la referencia para el programador de ODBC en MSDN Library.
#include "stdafx.h" #using <mscorlib.dll> #include <tchar.h> #using <system.xml.dll> using namespace System::Xml; #using <system.dll> using namespace System; #using <system.data.dll> using namespace System::Data; #using <Microsoft.Data.Odbc.dll> using namespace Microsoft::Data::Odbc;
int _tmain(void) {
OdbcConnection *myCon = new OdbcConnection("Driver={Sql Server};server=mySQL;trusted_connection=yes;database=northwind;"); try{ myCon->Open(); OdbcCommand *myCmd = new OdbcCommand("{call CustOrderHist(?)}",myCon);
//The following does not work: //OdbcCommand *myCmd = new OdbcCommand("CustOrderHist",myCon); //myCmd->CommandType=CommandType::StoredProcedure;
myReader->Close(); }
Cambie la cadena de conexin como corresponda. Presione CTRL+F5 para compilar y ejecutar el proyecto. Resultado: Este cdigo llama al procedimiento almacenado CustOrderHist, pasa el identificador de cliente como nico parmetro de entrada y devuelve un conjunto de resultados. En la ventana de resultados debe ver la lista de productos ordenados por el cliente de Northwind ALFKI.
El cargo promedio por pedido abonado por el cliente como parmetro de salida. El nmero de pedidos realizados por el cliente como valor de retorno.
En el Analizador de consultas, cree el procedimiento almacenado siguiente en la base de datos de ejemplo Northwind.
CREATE PROCEDURE MultiParamSP @CustID CHAR(5), @AvgFreight MONEY OUTPUT AS SELECT @AvgFreight = AVG(Freight) FROM Orders WHERE CustomerID = @CustID SELECT * FROM Orders WHERE CustomerID = @CustID RETURN @@ROWCOUNT
Repita los pasos 2 a 5 de la seccin "Parmetro de entrada nico" de este artculo, pero con el cdigo siguiente:
#include "stdafx.h" #using <mscorlib.dll> #include <tchar.h> #using <system.xml.dll> using namespace System::Xml; #using <system.dll> using namespace System; #using <system.data.dll> using namespace System::Data; #using <Microsoft.Data.Odbc.dll> using namespace Microsoft::Data::Odbc;
// This is the entry point for this application int _tmain(void) { OdbcConnection *myCon = new OdbcConnection("Driver={Sql Server};server=mySQL;trusted_connection=yes;database=northwind;");
try{ myCon->Open(); OdbcCommand *myCmd = new OdbcCommand("{?=call MultiParamSP(?,?)}",myCon); myCmd->Parameters->Add("RetVal",OdbcType::Int); myCmd->Parameters->Item[0]->Direction=ParameterDirection::ReturnValue; myCmd->Parameters->Add("CustId",OdbcType::Char,5); myCmd->Parameters->Item[1]->Value=S"ALFKI"; myCmd->Parameters->Add("AvgFr",OdbcType::Double); myCmd->Parameters->Item[2]->Direction=ParameterDirection::Output; //The following does not work: //OdbcCommand *myCmd = new OdbcCommand("MultiParamSP",myCon); //myCmd->CommandType=CommandType::StoredProcedure;
OdbcDataReader *myReader = myCmd->ExecuteReader(); while (myReader->Read()) { Console::WriteLine(); for(Int32 i=0;i<myReader->FieldCount;i++) { Console::WriteLine("{0}:{1}",(myReader->GetName(i))->ToString(),(myReader->GetValue(i))->ToString()); } } myReader->Close(); Console::WriteLine("OutputParamVal={0};ReturnVal={1}",myCmd->Parameters->Item[2]->Value,myCmd>Parameters->Item[0]->Value); } catch(OdbcException *myEx) { for (int i=0;i<myEx->Errors->Count;i++) {
Resultado: El cdigo llama al procedimiento almacenado MultiParamSP, creado en la seccin "Parmetro de entrada nico", pasa el identificador de cliente como nico parmetro de entrada y devuelve un conjunto de resultados, un parmetro de salida y un valor de retorno. En la ventana de resultados debe ver la lista de pedidos realizados por el cliente de Northwind ALFKI, el cargo promedio que el cliente pag por cada pedido y el nmero de pedidos.
Solucionar problemas
Con el proveedor administrado ODBC .NET no puede usar la sintaxis de ADO que normalmente se utiliza para llamar a los procedimientos almacenados; por lo general, slo se especifica el nombre del procedimiento como CommandText. Con el controlador de SQL Server, cuando un procedimiento almacenado devuelve un conjunto de resultados, los parmetros de salida y el valor de retorno no estn disponibles hasta que se ha tenido acceso al conjunto de resultados y se ha cerrado. Por ejemplo, si omite la lnea
dr.Close()
del segundo ejemplo de cdigo, no podr recuperar los valores del parmetro de salida ni el valor de retorno. El proveedor administrado ODBC .NET, al igual que el proveedor OLE DB .NET, procesa los parmetros segn su posicin ordinal (que comienza en cero) y no por su nombre. El proveedor administrado ODBC .NET no est incluido en Visual Studio .NET; es necesario descargarlo por separado.
REFERENCIAS
Para obtener informacin adicional, consulte la documentacin de referencia del proveedor de datos ODBC .NET incluida con este producto y la pgina "Procedure Calls" de la referencia del programador de MSDN Library: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcprocedure_calls.asp.