Cómo llamar a un procedimiento almacenado parametrizado utilizando ADO.NET y Visual Basic .NET

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

En esta página

Resumen

Existen varios modos de utilizar ADO.NET para llamar a un procedimiento almacenado y obtener valores y parámetros devueltos, entre los que se incluyen:
  • Utilizar un objeto DataSet para obtener las filas devueltas y trabajar con dichas filas además de con los valores y los parámetros devueltos.
  • Utilizar un objeto DataReader para obtener las filas devueltas, desplazarse por dichas filas y recuperar los valores y los parámetros devueltos.
  • Utilizar el método ExecuteScalar para devolver el valor de la primera columna de la primera fila de resultados junto con los valores y los parámetros devueltos. Este método resulta mucho más útil con funciones de agregado.
  • Utilizar el método ExecuteNonQuery para obtener únicamente los parámetros y los valores devueltos. Se descartan todas las filas devueltas. Este método resulta muy útil para ejecutar consultas de acciones.
En este artículo se incluye una demostración de los tres últimos métodos y se utilizan los objetos SqlCommand y OleDbCommand. Asegúrese de copiar exclusivamente 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 .NET Framework
http://msdn.microsoft.com/es-es/library/a6cd7c08.aspx
En todos los ejemplos incluidos en este artículo, los parámetros se agregan a la colección Parameters del objeto Command. Cuando utilice el objeto SqlCommand, no necesitará agregar los parámetros en un orden concreto, pero estos parámetros deberán tener un nombre correcto. Cuando utilice el objeto OleDbCommand, deberá agregar los parámetros en el orden correcto y no podrá utilizarlos por su nombre.

Utilizar DataReader para obtener filas y parámetros

Puede utilizar el objeto DataReader para obtener un flujo de datos de solo lectura y solo avance. La información que contiene DataReader puede proceder de un procedimiento almacenado. En este ejemplo se utiliza el objeto DataReader para ejecutar un procedimiento almacenado que tiene un parámetro de entrada y un parámetro de salida y, a continuación, se desplaza por los registros devueltos para ver los parámetros devueltos.
  1. Cree el siguiente procedimiento almacenado en el servidor en el que se está ejecutando 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. Utilice la instrucción Imports de los espacios de nombres System y System.Data para que no tenga que calificar las declaraciones de estos espacios de nombres más adelante en el código. Debe utilizar la instrucción Imports antes que cualquier otra declaración. Asegúrese de copiar exclusivamente el código del proveedor seleccionado.Cliente SQL
    Imports System.Data.SqlClient					
    Proveedor de datos de OLE DB
    Imports System.Data.OleDb					
  3. Agregue el código siguiente al evento Form_Load:Cliente SQL
    Dim PubsConn As SqlConnection = New SqlConnection & _
        ("Data Source=server;integrated security=sspi;" & _
        "initial Catalog=pubs;")
    
    Dim testCMD As SqlCommand = New SqlCommand & _
        ("TestProcedure", PubsConn)
    
    testCMD.CommandType = CommandType.StoredProcedure
    
    Dim RetValue As SqlParameter = testCMD.Parameters.Add & _
        ("RetValue", SqlDbType.Int)
    RetValue.Direction = ParameterDirection.ReturnValue
    Dim auIDIN As SqlParameter = testCMD.Parameters.Add & _
        ("@au_idIN", SqlDbType.VarChar, 11)
    auIDIN.Direction = ParameterDirection.Input
    Dim NumTitles As SqlParameter = testCMD.Parameters.Add & _
        ("@numtitlesout", SqlDbType.Int)
    NumTitles.Direction = ParameterDirection.Output
    
    auIDIN.Value = "213-46-8915"
    PubsConn.Open()
    
    Dim myReader As SqlDataReader = testCMD.ExecuteReader()
    Console.WriteLine("Book Titles for this Author:")
    Do While myReader.Read
        Console.WriteLine("{0}", myReader.GetString(2))
    Loop
    myReader.Close()
            
    Console.WriteLine("Return Value: " & (RetValue.Value))
    Console.WriteLine("Number of Records: " & (NumTitles.Value))
    					
    Proveedor de datos de OLE DB
    Dim PubsConn As OleDbConnection = New OleDbConnection & _
        ("Provider=sqloledb;Data Source=server;" & _
        "integrated security=sspi;initial Catalog=pubs;")
    
    Dim testCMD As OleDbCommand = New OleDbCommand & _
        ("TestProcedure", PubsConn)
    
    testCMD.CommandType = CommandType.StoredProcedure
    
    Dim RetValue As OleDbParameter = testCMD.Parameters.Add & _
        ("RetValue", OleDbType.Integer)
    RetValue.Direction = ParameterDirection.ReturnValue
    Dim auIDIN As OleDbParameter = testCMD.Parameters.Add & _
        ("@au_idIN", OleDbType.VarChar, 11)
    auIDIN.Direction = ParameterDirection.Input
    Dim NumTitles As OleDbParameter = testCMD.Parameters.Add & _
        ("@numtitlesout", OleDbType.Integer)
    NumTitles.Direction = ParameterDirection.Output
    
    auIDIN.Value = "213-46-8915"
    PubsConn.Open()
    
    Dim myReader As OleDbDataReader = testCMD.ExecuteReader()
    Console.WriteLine("Book Titles for this Author:")
    Do While myReader.Read
        Console.WriteLine("{0}", myReader.GetString(2))
    Loop
    myReader.Close()
    
    Console.WriteLine("Return Value: " & (RetValue.Value))
    Console.WriteLine("Number of Records: " & (NumTitles.Value))
    					
  4. Modifique la cadena de conexión del objeto Connection para que señale al servidor en que se está ejecutando SQL Server.
  5. Ejecute el código. Observe que DataReader recupera los registros y devuelve a continuación los valores de parámetros. Puede utilizar el método Read 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 DataReader en el código para poder ver los valores de parámetros. Observe además que no es necesario desplazarse por todos los registros para ver los parámetros devueltos si DataReader se cierra.

Utilizar el método ExecuteScalar del objeto Command

Puede utilizar el método ExecuteScalar del objeto Command para recuperar los valores de parámetros. Además, ExecuteScalar devuelve la primera columna de la primera fila del procedimiento almacenado. Esto resulta especialmente útil para las funciones de agregados, como puede verse en el siguiente ejemplo.
  1. Cree el siguiente procedimiento almacenado en el servidor en el que se está ejecutando 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. Utilice la instrucción Imports de los espacios de nombres System y System.Data para que no tenga que calificar las declaraciones de estos espacios de nombres más adelante en el código. Debe utilizar la instrucción Imports antes que cualquier otra declaración. Asegúrese de copiar exclusivamente el código del proveedor seleccionado. Cliente SQL
    Imports System.Data.SqlClient					
    Proveedor de datos de OLE DB
    Imports System.Data.OleDb					
  3. Agregue el código siguiente al evento Form_Load:Cliente SQL
    Dim PubsConn As SqlConnection = New SqlConnection & _
        ("Data Source=server;integrated security=sspi;" & _
        "initial Catalog=pubs;")
    
    Dim testCMD As SqlCommand = New SqlCommand & _
        ("TestProcedure2", PubsConn)
    
    testCMD.CommandType = CommandType.StoredProcedure
    
    Dim RetValue As SqlParameter = testCMD.Parameters.Add & _
        ("RetValue", SqlDbType.Int)
    RetValue.Direction = ParameterDirection.ReturnValue
    Dim auIDIN As SqlParameter = testCMD.Parameters.Add & _
        ("@au_idIN", SqlDbType.VarChar, 11)
    auIDIN.Direction = ParameterDirection.Input
    
    auIDIN.Value = "213-46-8915"
    PubsConn.Open()
    
    Dim intCount As Integer = testCMD.ExecuteScalar
    Console.WriteLine(intCount)
    Console.WriteLine("Return Value: " & (RetValue.Value))
    					
    Proveedor de datos de OLE DB
    Dim PubsConn As OleDbConnection = New OleDbConnection & _
        ("Provider=SQLOLEDB;Data Source=server;" & _
        "integrated Security=sspi;initial catalog=pubs;")
    
    Dim testCMD As OleDbCommand = New OleDbCommand & _
        ("TestProcedure2", PubsConn)
    
    testCMD.CommandType = CommandType.StoredProcedure
    
    Dim RetVal As OleDbParameter = testCMD.Parameters.Add & _
        ("RetVal", OleDbType.Integer)
    RetVal.Direction = ParameterDirection.ReturnValue
    Dim IdIn As OleDbParameter = testCMD.Parameters.Add & _
        ("@au_idIN", OleDbType.VarChar, 11)
    IdIn.Direction = ParameterDirection.Input
    
    IdIn.Value = "213-46-8915"
            
    PubsConn.Open()
    
    Dim intCount As Integer = testCMD.ExecuteScalar
    
    Console.WriteLine("Number of Rows: " & intCount)
    Console.WriteLine(RetVal.Value)
    					
  4. Modifique la cadena de conexión del objeto Connection para que señale al servidor en que se está ejecutando SQL Server.
  5. Ejecute el código. Observe que el método ExecuteScalar del objeto Command devuelve los parámetros. ExecuteScalar devuelve también el valor de la columna 1, fila 1 del conjunto de filas devuelto. Por tanto, el valor de intCount es el resultado de la función de recuento del procedimiento almacenado.

Utilizar el método ExecuteNonQuery del objeto Command

En este ejemplo se utiliza el método ExecuteNonQuery para ejecutar la consulta y devolver los valores de parámetros. ExecuteNonQuery también devuelve el número de registros afectados tras la ejecución de la consulta. No obstante, ExecuteNonQuery no devuelve ninguna fila ni ninguna columna del procedimiento almacenado.

El método ExecuteNonQuery resulta muy útil cuando utiliza instrucciones INSERT, UPDATE o DELETE y sólo necesita conocer el número de filas que han cambiado. En un procedimiento almacenado en el que utilice únicamente una instrucción SELECT, obtendrá -1 porque ninguna fila resultará afectada por la consulta.
  1. Cree el siguiente procedimiento almacenado en el servidor en el que se está ejecutando 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. Utilice la instrucción Imports de los espacios de nombres System y System.Data para que no tenga que calificar las declaraciones de estos espacios de nombres más adelante en el código. Debe utilizar la instrucción Imports antes que cualquier otra declaración. Asegúrese de copiar exclusivamente el código del proveedor seleccionado. Cliente SQL
    Imports System.Data.SqlClient					
    Proveedor de datos de OLE DB
    Imports System.Data.OleDb					
  3. Agregue el código siguiente al evento Form_Load:Cliente SQL
    Dim PubsConn As SqlConnection = New SqlConnection & _
        ("Data Source=server;integrated security=sspi;" & _
        "initial Catalog=pubs;")
    
    Dim testCMD As SqlCommand = New SqlCommand & _
        ("TestProcedure3", PubsConn)
    
    testCMD.CommandType = CommandType.StoredProcedure
    
    Dim RetValue As SqlParameter = testCMD.Parameters.Add & _
        ("RetValue", SqlDbType.Int)
    RetValue.Direction = ParameterDirection.ReturnValue
    Dim auIDIN As SqlParameter = testCMD.Parameters.Add & _
        ("@au_idIN", SqlDbType.VarChar, 11)
    auIDIN.Direction = ParameterDirection.Input
    Dim auFname As SqlParameter = testCMD.Parameters.Add & _
        ("@au_fnam", SqlDbType.VarChar, 30)
    auFname.Direction = ParameterDirection.Input
    
    auIDIN.Value = "213-46-8915"
    auFname.Value = "Marjorie"
    PubsConn.Open()
    
    Dim rvRows As Integer = testCMD.ExecuteNonQuery
    Console.WriteLine(rvRows)
    Console.WriteLine(RetValue.Value)
    					
    Proveedor de datos de OLE DB
    Dim PubsConn As OleDbConnection = New OleDbConnection & _
        ("Provider=SQLOLEDB;Data Source=server;" & _
        "integrated Security=sspi;initial catalog=pubs;")
    
    Dim testCMD As OleDbCommand = New OleDbCommand & _
        ("TestProcedure3", PubsConn)
    
    testCMD.CommandType = CommandType.StoredProcedure
    
    Dim RetVal As OleDbParameter = testCMD.Parameters.Add & _
        ("RetVal", OleDbType.Integer)
    RetVal.Direction = ParameterDirection.ReturnValue
    Dim IdIn As OleDbParameter = testCMD.Parameters.Add & _
        ("@au_idIN", OleDbType.VarChar, 11)
    IdIn.Direction = ParameterDirection.Input
    Dim FnameIn As OleDbParameter = testCMD.Parameters.Add & _
        ("@au_fname", OleDbType.VarChar, 30)
    FnameIn.Direction = ParameterDirection.Input
    
    IdIn.Value = "213-46-8915"
    FnameIn.Value = "Marjorie"
    
    PubsConn.Open()
    
    Dim intRowAffected As Integer = testCMD.ExecuteNonQuery
    
    Console.WriteLine("Number of Rows affected: " & intRowAffected)
    Console.WriteLine(RetVal.Value)
    					
  4. Modifique la cadena de conexión del objeto Connection para que señale al servidor en que se está ejecutando SQL Server.
  5. Ejecute el código. En la ventana de resultados aparecerá el número de filas afectadas (intRowAffect) y el valor del parámetro devuelto.

Referencias

Para obtener más información, visite los siguientes sitios Web de MSDN:
Introducción a la biblioteca de clases de .NET Framework
http://msdn.microsoft.com/es-es/library/hfa3fa08.aspx

Recuperar datos mediante DataReader
http://msdn.microsoft.com/es-es/library/haa3afyz.aspx
Para obtener más información, consulte el siguiente curso de formación y certificación de Microsoft:
2389 Programar con ADO.NET
http://www.microsoft.com/learning/syllabi/en-us/2389Bfinal.mspx
Nota: es un artículo de "PUBLICACIÓN RÁPIDA" creado directamente por la organización de soporte técnico de Microsoft. La información aquí contenida se proporciona como está, como respuesta a problemas que han surgido. Como consecuencia de la rapidez con la que lo hemos puesto disponible, los materiales podrían incluir errores tipográficos y pueden ser revisados en cualquier momento sin previo aviso. Vea las Condiciones de uso para otras consideraciones

Propiedades

Id. de artículo: 308049 - Última revisión: lunes, 27 de enero de 2014 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palabras clave: 
kbhowtomaster kbsqlclient kbstoredproc kbsystemdata KB308049

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