Invocar procedimientos almacenados fuertemente tipados en SQL mediante el modelo de servicio WCF
Cuando se invoca un procedimiento que aparece en el nodo Procedimientos fuertemente tipados en el complemento Add Adapter Service Reference Plug-in, la salida tiene el formato de un conjunto de resultados fuertemente tipado. En este tema se proporcionan instrucciones sobre cómo crear un cliente WCF para invocar procedimientos almacenados en SQL Server que devuelven un conjunto de resultados fuertemente tipado.
Nota
Si está realizando operaciones en tablas que tienen columnas de tipos definidos por el usuario, asegúrese de hacer referencia a Operaciones en tablas y vistas con tipos User-Defined antes de empezar a desarrollar la aplicación.
Acerca de los ejemplos usados en este tema
En el ejemplo de este tema se usa el procedimiento almacenado GET_EMP_DETAILS. Este procedimiento almacenado toma un identificador de empleado como parámetro de entrada y devuelve todas las columnas correspondientes para el empleado con ese identificador. El GET_EMP_DETAILS procedimiento almacenado se crea mediante la ejecución del script SQL proporcionado con los ejemplos. Para obtener más información sobre los ejemplos, vea Ejemplos de adaptador. También se proporciona un ejemplo, Execute_TypedStoredProcedure, que se basa en este tema, con los ejemplos del adaptador de SQL.
Clase de cliente WCF
El nombre del cliente WCF generado para invocar procedimientos almacenados en el nodo Procedimientos fuertemente tipados mediante el adaptador de SQL se muestra en la tabla siguiente.
artefacto de base de datos de SQL Server | Nombre del cliente WCF |
---|---|
Procedimiento (en el nodo Procedimientos fuertemente tipados ) | TypedProcedures_[esquema]Cliente |
[schema] es el esquema al que pertenece el procedimiento; por ejemplo, "dbo".
Firma de método para invocar procedimientos almacenados
En la tabla siguiente se muestra la firma del método expuesto para invocar los procedimientos almacenados.
Operación | Firma del método |
---|---|
Nombre del procedimiento | [PROC_NS] [procedure_name] (param1, param2, ...) |
[PROC_NS] es el espacio de nombres del procedimiento; por ejemplo, schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS. StoredProcedureResultSet0[]
[procedure_name] es el nombre del procedimiento; por ejemplo, GET_EMP_DETAILS
Por ejemplo, la firma del método para invocar el procedimiento GET_EMP_DETAILS se muestra en el siguiente fragmento de código.
public partial class TypedProcedures_dboClient : System.ServiceModel.ClientBase<TypedProcedures_dbo>, TypedProcedures_dbo{
public schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[]
GET_EMP_DETAILS(System.Nullable<int> emp_id, out int ReturnValue);
}
En este fragmento de código,
TypedProcedures_dboClient
es el nombre de la clase . En este ejemplo, se usa esta clase para crear un cliente para invocar el procedimiento almacenado.public schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[] GET_EMP_DETAILS(System.Nullable<int> emp_id, out int ReturnValue)
es el método que se invoca en este ejemplo para invocar el procedimiento almacenado. Este procedimiento almacenado toma un identificador de empleado y devuelve un conjunto de resultados fuertemente tipado.
Crear un cliente WCF para invocar un procedimiento almacenado en SQL Server
El conjunto genérico de acciones necesarias para realizar una operación en SQL Server mediante un cliente WCF implica un conjunto de tareas descritas en Información general del modelo de servicio WCF con el adaptador de SQL. En esta sección se describe específicamente cómo crear un cliente WCF que invoca un procedimiento almacenado, el conjunto de resultados para el que está fuertemente tipado. En este tema, como ejemplo, se invoca el GET_EMP_DETAILS procedimiento almacenado. Este procedimiento almacenado se crea mediante la ejecución del script SQL proporcionado con cada ejemplo.
Cree un proyecto de Visual C# en Visual Studio. Para este tema, cree una aplicación de consola.
Genere la clase de cliente WCF para el procedimiento almacenado GET_EMP_DETAILS. Asegúrese de seleccionar el procedimiento en el nodo Procedimientos fuertemente tipados . Para obtener más información sobre cómo generar una clase de cliente WCF, vea Generar un cliente WCF o un contrato de servicio WCF para SQL Server Artefactos.
Importante
Antes de generar la clase de cliente WCF, asegúrese de establecer la propiedad de enlace EnableBizTalkCompatibilityMode en false.
En el Explorador de soluciones, agregue referencia a
Microsoft.Adapters.Sql
yMicrosoft.ServiceModel.Channels
.Abra el archivo Program.cs y cree un cliente como se describe en el fragmento de código siguiente.
TypedProcedures_dboClient client = new TypedProcedures_dboClient("SqlAdapterBinding_TypedProcedures_dbo"); client.ClientCredentials.UserName.UserName = "<Enter username here>"; client.ClientCredentials.UserName.Password = "<Enter username here>";
En este fragmento de código,
TypedProcedures_dboClient
es el cliente WCF definido en SqlAdapterBindingClient.cs. El complemento Add Adapter Service Reference (Agregar referencia del servicio de adaptador) genera este archivo.SqlAdapterBinding_TypedProcedures_dbo
es el nombre de la configuración del punto de conexión de cliente y se define en el app.config. El complemento Agregar referencia del servicio de adaptador también genera este archivo y contiene las propiedades de enlace y otras opciones de configuración.Nota
En este fragmento de código, se usa el enlace y la dirección del punto de conexión del archivo de configuración. También puede especificar explícitamente estos valores en el código. Para obtener más información sobre las distintas formas de especificar el enlace de cliente, vea Configurar un enlace de cliente para el adaptador de SQL.
Abra el cliente como se describe en el fragmento de código siguiente:
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
Invoque el GET_EMP_DETAILS procedimiento almacenado tal y como se describe en el fragmento de código siguiente.
// Create array of type as specified in the method signature schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[] resultSet = new schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[1]; int returnCode; try { Console.WriteLine("Calling a stored procedure..."); resultSet = client.GET_EMP_DETAILS(10001, out returnCode); //Invoke the stored procedure } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; } Console.WriteLine("The details for the employee with ID '10001' are:"); Console.WriteLine("*************************************************"); for (int i = 0; i < resultSet.Length; i++) { Console.WriteLine("Employee Name : " + resultSet[i].Name); Console.WriteLine("Employee Designation : " + resultSet[i].Designation); Console.WriteLine("Employee Salary : " + resultSet[i].Salary); } Console.WriteLine("*************************************************");
Cierre el cliente como se describe en el fragmento de código siguiente:
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
Compile el proyecto y ejecútelo. El nombre, la designación y el salario del identificador de empleado se muestran en la consola.