Cómo: Llamar A un procedimiento almacenado parametrizado utilizando ADO.NET y Visual C#.NET

Seleccione idioma Seleccione idioma
Id. de artículo: 310070 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Hay varias formas de utilizar ADO.NET para llamar a un procedimiento almacenado y para obtener valores y parámetros devueltos, incluyendo:
  • Utilice un objeto DataSet para recopilar las filas devueltas y trabajar con dichas filas además de los valores devueltos y parámetros devueltos.
  • Utilice un objeto DataReader para recopilar las filas devueltas, moverse por dichas filas y, a continuación, al recopilar valores y parámetros devueltos.
  • Utilice el método ExecuteScalar para devolver el valor de la primera columna de la primera fila de resultados con los valores devueltos y parámetros devueltos. Esto es más útil con funciones de agregado.
  • Utilice el método ExecuteNonQuery para devolver sólo los parámetros y valores devueltos. Se descartan todas las filas devueltas. Esto es muy útil para ejecutar consultas de acción.
En este artículo muestra los tres últimos métodos y utiliza los objetos OleDbCommand y SqlCommand . Asegúrese de copiar sólo el código del proveedor administrado que está utilizando. Si no está seguro de qué proveedor administrado debería utilizar, visite el siguiente sitio Web de Microsoft Developer Network:
.Proveedores de datos de red
En cada uno de los ejemplos de este artículo, los parámetros se agregan a la colección Parameters del objeto Command . Cuando utilice el objeto SqlCommand , necesitará agregar los parámetros en un orden determinado, pero los parámetros deben tener el nombre correcto. Cuando utilice el objeto OleDbCommand , debe agregar los parámetros en el orden correcto y no se puede utilizar los parámetros por nombre.

Utilizar DataReader para devolver las filas y parámetros

Puede utilizar el objeto DataReader para devolver una secuencia de datos de sólo lectura hacia adelante. La información que contiene el objeto DataReader puede provenir de un procedimiento almacenado. Este ejemplo utiliza el objeto DataReader para ejecutar un procedimiento almacenado que tiene una entrada y un parámetro de salida y, a continuación, se mueve a través de los registros devueltos para ver los parámetros devueltos.
  1. Cree el siguiente procedimiento almacenado en el servidor que ejecuta Microsoft SQL Server:
    Create Procedure TestProcedure
    (
      @au_idIN varchar (11),
      @numTitlesOUT Integer OUTPUT
    )
    AS 
    
    select A.au_fname, A.au_lname, T.title 
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    set @numTitlesOUT = @@Rowcount
    return (5) 
    					
  2. Crear un nuevo de Visual C#.Proyecto de aplicación para Windows NET.
  3. Utilice la instrucción using en el sistema y los espacios de nombres System.Data para que no tenga que calificar las declaraciones en esos espacios de nombres más adelante en el código. Agregar este código a la parte superior del módulo de código de formulario. Asegúrese de copiar sólo el código del proveedor que ha elegido.Cliente SQL
    using System.Data.SqlClient;
    					
    Proveedor OLE DB de datos
    using System.Data.OleDb;
    					
  4. Reemplace el código en el evento Form_Load privado con el siguiente código:Cliente de SQL
    SqlConnection PubsConn = new SqlConnection 
    ("Data Source=server;integrated " + 
    "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
    ("TestProcedure", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
      ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter NumTitles = testCMD.Parameters.Add 
       ("@numtitlesout", SqlDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output ;
            
    IdIn.Value = "213-46-8915";
    PubsConn.Open();
    
    SqlDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read()) 
       {
         Console.WriteLine ("{0}", myReader.GetString (2));
       };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    Proveedor OLE DB de datos
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter NumTitles = testCMD.Parameters.Add 
       ("@numtitlesout", OleDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output;
            
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    OleDbDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read()) 
       {
         Console.WriteLine ("{0}", myReader.GetString (2));
       };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
  5. Modifique la cadena de conexión para el objeto de conexión para que señale al equipo que se está ejecutando SQL Server.
  6. Ejecute el código. Observe que el DataReader recupera los registros y, a continuación, devuelve los valores de parámetro. Puede utilizar el método de lectura del objeto DataReader para desplazarse por los registros devueltos.

    La ventana de resultados muestra los títulos de dos libros, el valor devuelto 5 y el parámetro de salida, que contiene el número de registros (2). Tenga en cuenta que debe cerrar el DataReader en el código para ver los valores de parámetro. Además, tenga en cuenta que no es necesario pasar por todos los registros para ver los parámetros devueltos si se cierra el objeto DataReader .

Utilice el método ExecuteScalar del objeto Command

Puede utilizar el método ExecuteScalar del objeto Command para recuperar los valores de parámetro. Además, ExecuteScalar devuelve la primera columna de la primera fila del procedimiento almacenado. Esto es muy útil para las funciones de agregado como en el ejemplo siguiente.
  1. Cree el siguiente procedimiento almacenado en el servidor que ejecuta SQL Server:
    Create Procedure TestProcedure2
    (
      @au_idIN varchar (11)
    )
    As
    /* set nocount on */ 
    select count (T.title) 
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    Return(5)
    					
  2. Crear un nuevo de Visual C#.Proyecto de aplicación para Windows NET.
  3. Utilice la instrucción using en el sistema y los espacios de nombres System.Data para que no tenga que calificar las declaraciones en esos espacios de nombres más adelante en el código. Agregar este código a la parte superior del módulo de código de formulario. Asegúrese de copiar sólo el código del proveedor que ha elegido.Cliente SQL
    using System.Data.SqlClient;
    					
    Proveedor OLE DB de datos
    using System.Data.OleDb;
    					
  4. Agregue el código siguiente al evento Form_Load :Cliente de SQL
    string strCount;
    SqlConnection PubsConn = new SqlConnection 
       ("Data Source=server;integrated " + 
       "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
       ("TestProcedure2", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
            
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    strCount =testCMD.ExecuteScalar ().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strCount );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    Proveedor OLE DB de datos
    string strCount;
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure2", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    strCount = testCMD.ExecuteScalar().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strCount);
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
  5. Modifique la cadena de conexión para el objeto de conexión para que señale al equipo que se está ejecutando SQL Server.
  6. Ejecute el código. Observe que el método ExecuteScalar del objeto Command devuelve los parámetros. ExecuteScalar también devuelve el valor de la columna 1, fila 1 del conjunto de filas devuelto. Por lo tanto, el valor de intCount es el resultado de la función de recuento del procedimiento almacenado.

Utilice el método ExecuteNonQuery del objeto Command

Este ejemplo utiliza el método ExecuteNonQuery para ejecutar la consulta y devolver los valores de parámetro. ExecuteNonQuery también devuelve el número de registros que se ven afectados después de ejecutarse la consulta. Sin embargo, ExecuteNonQuery no devuelve ninguna fila o columna del procedimiento almacenado.

El método ExecuteNonQuery es más útil cuando se utilizan instrucciones INSERT, UPDATE o DELETE si sólo tiene que saber cuántas filas han cambiado. En un procedimiento almacenado en el que se utiliza sólo una instrucción SELECT, obtendrá -1 porque no hay filas están afectadas por la consulta.
  1. Cree el siguiente procedimiento almacenado en el equipo que ejecuta SQL Server:
    Create Procedure TestProcedure3
    (
      @au_idIN varchar (11),
      @au_fnam varchar (30)
    )
    
    As
    /* set nocount on */ 
    Update authors set au_fname = @au_fnam
    where au_id = @au_idin	
    return (5)
    					
  2. Crear un nuevo de Visual C#.Proyecto de aplicación para Windows NET.
  3. Utilice la instrucción using en el sistema y los espacios de nombres System.Data para que no tenga que calificar las declaraciones en esos espacios de nombres más adelante en el código. Agregar este código a la parte superior del módulo de código de formulario. Asegúrese de copiar sólo el código del proveedor que ha elegido.Cliente SQL
    using System.Data.SqlClient;
    					
    Proveedor OLE DB de datos
    using System.Data.OleDb;
    					
  4. Reemplace el código siguiente evento Form1_Load privado en el módulo de código de Form1 con el siguiente código:Cliente de SQL
    string strRowAffect;
    SqlConnection PubsConn = new SqlConnection 
       ("Data Source=server;integrated Security=sspi;" + 
       "initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
       ("TestProcedure3", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter FnameIn = testCMD.Parameters.Add 
       ("@au_fnam", SqlDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";
    
    PubsConn.Open();
    
    strRowAffect =testCMD.ExecuteNonQuery ().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strRowAffect );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    Proveedor OLE DB de datos
    int intRowAffected;
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure3", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter FnameIn = testCMD.Parameters.Add
       ("@au_fname", OleDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";
    
    PubsConn.Open();
    intRowAffected = testCMD.ExecuteNonQuery();
    
    Console.WriteLine("Number of Rows affected: " + intRowAffected);
    Console.WriteLine(RetVal.Value);
    					
  5. Modifique la cadena de conexión para el objeto de conexión para que señale al equipo que se está ejecutando SQL Server.
  6. Ejecute el código. La ventana Resultados muestra el número de filas afectadas (intRowAffect) y el valor del parámetro devuelto.

Referencias

Para obtener información adicional, visite los siguientes sitios Web de MSDN:
Introducción a la.Biblioteca de clases

Recuperar datos mediante DataReader

Propiedades

Id. de artículo: 310070 - Última revisión: martes, 12 de junio de 2012 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Palabras clave: 
kbhowtomaster kbsqlclient kbstoredproc kbsystemdata kbmt KB310070 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 310070

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com