Cómo ejecutar SQL parametrizada procedimientos almacenados mediante el proveedor ODBC .NET y Visual C# .NET

Para una versión de Microsoft Visual Basic .NET de este artículo, consulte 309486 .

Para una versión de Microsoft Visual C++ .NET de este artículo, consulte 310142 .


Este artículo hace referencia al siguiente espacio de nombres de biblioteca de clases de Microsoft.NET Framework:

  • Microsoft.Data.Odbc

EN ESTA TAREA

Resumen

Este paso a paso describe cómo llamar a un procedimiento de SQL Server almacenado parametrizado mediante el proveedor administrado de ODBC .NET y Visual C#.

Mientras se ejecuta un procedimiento almacenado parametrizado mediante el proveedor ODBC .NET es ligeramente diferente a la ejecución del mismo procedimiento mediante el SQL o el proveedor OLE DB, existe una diferencia importante: el procedimiento almacenado debe llamarse utilizando la sintaxis CALL de ODBC en lugar del nombre del procedimiento almacenado. Para obtener información adicional sobre la sintaxis CALL, consulte el tema "Procedure Calls" en referencia del programador de ODBC en MSDN Library.

Ejemplos de sintaxis de llamada

  1. Aquí es un ejemplo de la sintaxis de call para un procedimiento almacenado real de la base de datos de ejemplo Neptuno que espera un parámetro de entrada:
    {CALL CustOrderHist (?)}
  2. Aquí es un ejemplo de la sintaxis de call para un procedimiento almacenado que espera un parámetro de entrada y devuelve un parámetro de salida y un valor devuelto. El primer marcador de posición representa el valor devuelto:
    {? = CALL Procedure1 (?, ?)
  3. El proveedor administrado de ODBC .NET, al igual que el proveedor de OLE DB, procesa los parámetros según su posición ordinal (basada en cero) y no por su nombre.

Proyecto de prueba: parámetro de entrada única

  1. Si aún no lo ha hecho, descargue e instale al proveedor administrado de ODBC .NET desde el siguiente sitio Web de Microsoft:
  2. Inicie Visual Studio .NET y cree una nueva aplicación de Windows Visual C# .NET con el nombre de su elección.
  3. En el menú proyecto , haga clic en Agregar referenciay, a continuación, haga doble clic en Microsoft.Data.ODBC.dll para agregarlo a la lista de elementos seleccionados. Cierre el cuadro de diálogo referencias .
  4. En la parte superior de la ventana código, agregue las siguientes instrucciones:
    using System.Data;using Microsoft.Data.Odbc;

  5. Arrastre un control Button desde el cuadro de herramientas al formulario predeterminado.
  6. Haga doble clic en el botón de comando para cambiar a la ventana de código para el evento Click del botón. Escriba o pegue el código siguiente en el procedimiento de evento Click , modificando la cadena de conexión de SQL Server según sea necesario:
    OdbcConnection cn;OdbcCommand cmd;
    OdbcParameter prm;
    OdbcDataReader dr;

    try {
    //Change the connection string to use your SQL Server.
    cn = new OdbcConnection("Driver={SQL Server};Server=servername;Database=Northwind;Trusted_Connection=Yes");

    //Use ODBC call syntax.
    cmd = new OdbcCommand("{call CustOrderHist (?)}", cn);

    prm = cmd.Parameters.Add("@CustomerID", OdbcType.Char, 5);
    prm.Value = "ALFKI";

    cn.Open();

    dr = cmd.ExecuteReader();

    //List each product.
    while (dr.Read())
    Console.WriteLine(dr.GetString(0));

    //Clean up.
    dr.Close();
    cn.Close();
    }
    catch (OdbcException o) {
    MessageBox.Show(o.Message.ToString());
    }

  7. Ejecute el proyecto. Este código llama al procedimiento almacenado "CustOrderHist", pasando el identificador CustomerID como único parámetro de entrada y devuelve un conjunto de resultados. En la ventana de resultados debe ver la lista de productos ordenados por el cliente ALFKI de Neptuno.

    Nota: presione CTRL + ALT + O para abrir la ventana de salida.

Proyecto de prueba - varios tipos de parámetros

  1. Utilizando el analizador de consultas, cree el siguiente procedimiento almacenado en la base de datos de ejemplo Northwind. Este procedimiento almacenado acepta el identificador CustomerID como parámetro de entrada y devuelve una lista de pedidos realizados por el cliente, devuelve el cargo promedio por pedido pagado por ese cliente como parámetro de salida y devuelve el número de pedidos realizados por el cliente como valor devuelto.
    CREATE PROCEDURE usp_TestParameters@CustID CHAR(5),
    @AvgFreight MONEY OUTPUT
    AS
    SELECT @AvgFreight = AVG(Freight) FROM Orders WHERE CustomerID = @CustID
    SELECT * FROM Orders WHERE CustomerID = @CustID
    RETURN @@ROWCOUNT

  2. Repita los pasos 1 a 6 anteriores, reemplazando el código siguiente en el procedimiento de evento Click del botón de comando:
    OdbcConnection cn;
    try {
    cn = new OdbcConnection("Driver={SQL Server};Server=servername;Database=Northwind;Trusted_Connection=Yes");

    OdbcCommand cmd = new OdbcCommand("{? = call usp_TestParameters (?, ?)}", cn);

    OdbcParameter prm = cmd.Parameters.Add("@RETURN_VALUE", OdbcType.Int);
    prm.Direction = ParameterDirection.ReturnValue;

    prm = cmd.Parameters.Add("@CustomerID", OdbcType.Char, 5);
    prm.Value = "ALFKI";

    prm = cmd.Parameters.Add("@AvgFreight", OdbcType.Double);
    prm.Direction = ParameterDirection.Output;

    cn.Open();
    OdbcDataReader dr = cmd.ExecuteReader();

    while (dr.Read())
    Console.WriteLine(dr.GetString(0));

    dr.Close();
    cn.Close();

    Console.WriteLine("Average Freight (output param): {0}", cmd.Parameters[2].Value);
    Console.WriteLine("Order Count (return value): {0}", cmd.Parameters[0].Value);

    }

    catch (OdbcException o) {
    MessageBox.Show(o.Message.ToString());
    }

  3. Ejecute el proyecto. Este código llama al procedimiento almacenado "usp_TestParameters" que creamos en el paso 1 anterior, pasando el CustomerID como un parámetro de entrada única y devuelve un conjunto de resultados, un parámetro de salida y un valor devuelto. 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 número de pedidos.

    Nota: presione CTRL + ALT + O para abrir la ventana de salida.

Solución de problemas

  • La sintaxis de ADO que normalmente se utiliza para llamar a procedimientos almacenados, donde el nombre del procedimiento se proporciona como CommandText, no puede utilizarse con el proveedor administrado de ODBC .NET.
  • Cuando un procedimiento almacenado devuelve un conjunto de resultados, los parámetros de salida y el valor de retorno no están disponibles hasta que el conjunto de resultados se tiene acceso y cerrado. Por ejemplo, si omitiéramos la línea "Dr. Close() "del segundo ejemplo anterior, no podríamos recuperar los valores del parámetro de salida y el valor devuelto.
  • El proveedor administrado de ODBC .NET, al igual que el proveedor de OLE DB, procesa los parámetros según su posición ordinal (basada en cero) y no por su nombre.
  • El proveedor administrado de ODBC .NET no se incluye con Visual Studio .NET pero debe descargarse por separado.

Referencias

Para obtener información adicional sobre la sintaxis CALL de ODBC, vea el tema "Procedure Calls" en referencia del programador de ODBC en MSDN Library.

Propiedades

Id. de artículo: 310130 - Última revisión: 22 ene. 2017 - Revisión: 2

Comentarios