Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

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

Para obtener una versión de este artículo para Microsoft Visual C++ .NET, consulte 310071.
Para obtener una versión de este artículo para Microsoft Visual C# .NET, consulte 310070.
Para obtener una versión de este artículo para Microsoft Visual J# .NET, consulte 320627.
Para obtener una versión de este artículo para Microsoft Visual Basic 6.0, consulte 194792.

Este artículo hace referencia a los siguientes espacios de nombres de la Biblioteca de clases de Microsoft .NET Framework:
  • System.Data
  • System.Data.SqlClient
  • System.Data.OleDb

EN ESTA TAREA

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  )Asselect A.au_fname, A.au_lname, T.title from authors as A join titleauthor as TA onA.au_id=TA.au_idjoin titles as Ton T.title_id=TA.title_idwhere A.au_id=@au_idINset @numTitlesOUT = @@Rowcountreturn (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.StoredProcedureDim RetValue As SqlParameter = testCMD.Parameters.Add & _    ("RetValue", SqlDbType.Int)RetValue.Direction = ParameterDirection.ReturnValueDim auIDIN As SqlParameter = testCMD.Parameters.Add & _    ("@au_idIN", SqlDbType.VarChar, 11)auIDIN.Direction = ParameterDirection.InputDim NumTitles As SqlParameter = testCMD.Parameters.Add & _    ("@numtitlesout", SqlDbType.Int)NumTitles.Direction = ParameterDirection.OutputauIDIN.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))LoopmyReader.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.StoredProcedureDim RetValue As OleDbParameter = testCMD.Parameters.Add & _    ("RetValue", OleDbType.Integer)RetValue.Direction = ParameterDirection.ReturnValueDim auIDIN As OleDbParameter = testCMD.Parameters.Add & _    ("@au_idIN", OleDbType.VarChar, 11)auIDIN.Direction = ParameterDirection.InputDim NumTitles As OleDbParameter = testCMD.Parameters.Add & _    ("@numtitlesout", OleDbType.Integer)NumTitles.Direction = ParameterDirection.OutputauIDIN.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))LoopmyReader.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 onA.au_id=TA.au_idjoin titles as Ton T.title_id=TA.title_idwhere A.au_id=@au_idINReturn(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.StoredProcedureDim RetValue As SqlParameter = testCMD.Parameters.Add & _    ("RetValue", SqlDbType.Int)RetValue.Direction = ParameterDirection.ReturnValueDim auIDIN As SqlParameter = testCMD.Parameters.Add & _    ("@au_idIN", SqlDbType.VarChar, 11)auIDIN.Direction = ParameterDirection.InputauIDIN.Value = "213-46-8915"PubsConn.Open()Dim intCount As Integer = testCMD.ExecuteScalarConsole.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.StoredProcedureDim RetVal As OleDbParameter = testCMD.Parameters.Add & _    ("RetVal", OleDbType.Integer)RetVal.Direction = ParameterDirection.ReturnValueDim IdIn As OleDbParameter = testCMD.Parameters.Add & _    ("@au_idIN", OleDbType.VarChar, 11)IdIn.Direction = ParameterDirection.InputIdIn.Value = "213-46-8915"        PubsConn.Open()Dim intCount As Integer = testCMD.ExecuteScalarConsole.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_fnamwhere 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.StoredProcedureDim RetValue As SqlParameter = testCMD.Parameters.Add & _    ("RetValue", SqlDbType.Int)RetValue.Direction = ParameterDirection.ReturnValueDim auIDIN As SqlParameter = testCMD.Parameters.Add & _    ("@au_idIN", SqlDbType.VarChar, 11)auIDIN.Direction = ParameterDirection.InputDim auFname As SqlParameter = testCMD.Parameters.Add & _    ("@au_fnam", SqlDbType.VarChar, 30)auFname.Direction = ParameterDirection.InputauIDIN.Value = "213-46-8915"auFname.Value = "Marjorie"PubsConn.Open()Dim rvRows As Integer = testCMD.ExecuteNonQueryConsole.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.StoredProcedureDim RetVal As OleDbParameter = testCMD.Parameters.Add & _    ("RetVal", OleDbType.Integer)RetVal.Direction = ParameterDirection.ReturnValueDim IdIn As OleDbParameter = testCMD.Parameters.Add & _    ("@au_idIN", OleDbType.VarChar, 11)IdIn.Direction = ParameterDirection.InputDim FnameIn As OleDbParameter = testCMD.Parameters.Add & _    ("@au_fname", OleDbType.VarChar, 30)FnameIn.Direction = ParameterDirection.InputIdIn.Value = "213-46-8915"FnameIn.Value = "Marjorie"PubsConn.Open()Dim intRowAffected As Integer = testCMD.ExecuteNonQueryConsole.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:
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: 01/27/2014 13:49:00 - Revisión: 1.0

Microsoft ADO.NET 1.1, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition

  • kbhowtomaster kbsqlclient kbstoredproc kbsystemdata KB308049
Comentarios
y: none; " src="https://c1.microsoft.com/c.gif?DI=4050&did=1&t=">050&did=1&t=">