Invocación de procedimientos almacenados con tipo débil en SQL mediante el modelo de servicio WCF
Cuando se invoca un procedimiento que aparece en el nodo Procedimientos del complemento Agregar referencia de servicio de adaptador, la salida tiene el formato de una matriz DataSet. En este tema se proporcionan instrucciones sobre cómo crear un cliente WCF para invocar un procedimiento almacenado en SQL Server que devuelve una matriz DataSet.
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 User-Defined Tipos mediante el adaptador de SQL 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 de Execute_StoredProc, 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 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 ) | Procedures_[schema]Client |
[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 | System.Data.DataSet[] [procedure_name](param1, param2, ...) |
[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 Procedures_dboClient : System.ServiceModel.ClientBase<Procedures_dbo>, Procedures_dbo {
public System.Data.DataSet[] GET_EMP_DETAILS(System.Nullable<int> emp_id, out int ReturnValue);
}
En este fragmento de código,
Procedures_dboClient
es el nombre de la clase de cliente WCF. En este ejemplo, se usa esta clase para crear un cliente para invocar el procedimiento almacenado.public System.Data.DataSet[] 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 una matriz DataSet.
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. 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 es una matriz DataSet. 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 . 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.
Procedures_dboClient client = new Procedures_dboClient("SqlAdapterBinding_Procedures_dbo"); client.ClientCredentials.UserName.UserName = "<Enter username here>"; client.ClientCredentials.UserName.Password = "<Enter password here>";
En este fragmento de código,
Procedures_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_Procedures_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 procedimiento almacenado GET_EMP_DETAILS. Antes de invocar el procedimiento GET_EMP_DETAILS, debe agregar el
System.Data
espacio de nombres al código.DataSet[] dataArray; int returnCode; try { Console.WriteLine("Calling a stored procedure..."); dataArray = 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("*************************************************"); foreach (DataSet dataSet in dataArray) { foreach (DataTable tab in dataArray[0].Tables) { foreach (DataRow row in tab.Rows) { for (int i = 0; i < tab.Columns.Count; i++) { Console.WriteLine(row[i]); } } } } 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. Los detalles del empleado, para el que usted pr
El identificador se muestra en la consola.