Ejecutar procedimientos almacenados de SQL Server desde Microsoft Access

Para ejecutar procedimientos almacenados escritos en SQL Server desde Microsoft Access, solo tenemos que recurrir a  ADODB.

A través de esta librería, disponemos de varios objetos que nos ofrecerán a su vez varios modos de ejecutar:

  • Directamente a través del objeto Connection. Este es el método más sencillo y es adecuado para procedimientos que no devuelvan información, aunque si se le puede enviar información en la llamada al procedimiento.
  • A través de un objeto Command. Por este método sí podemos asociar parámetros al procedimiento que nos permiten tanto enviar como recibir informacion (input, output, input/output).

Veamos unos ejemplos:

A través del objeto Connetion:

 

  1. Dim cs As String
  2. cs = "Provider=SQLOLEDB.1;Password=1234;Persist Security Info=True;User ID=pepe;Initial Catalog=basededatos;Data Source=192.168.3.44"
  3. Dim objConn As New ADODB.Connection
  4. objConn.Open cs
  5. objConn.Execute "exec actualizar_empresa '" & Trim(Me.CIF_NIF.Value) & "','EUROFORCEM2009'"

 

A través del objeto command:

  1. Dim cs As String
  2.  
  3. cs = "Provider=<span>SQLOLEDB.1</span>;Password=1234;Persist Security Info=True;User ID=pepe;Initial Catalog=basededatos;Data Source=192.168.3.44"
  4.  
  5. Dim objConn As New ADODB.Connection
  6. objConn.Open cs
  7.  
  8. Dim objRs As New ADODB.Recordset
  9. Dim oc As New ADODB.Command
  10. Set oc.ActiveConnection = objConn
  11. oc.CommandText = "actualizar_empresa"
  12. oc.CommandType = adCmdStoredProc
  13.  
  14. Dim op As ADODB.Parameter
  15. Set op = oc.CreateParameter("CIF_EMPRESA", adVarChar, adParamInput, 9)
  16. oc.parameters.Append op
  17. op.Value = Trim(cif)
  18.  
  19. Dim op1 As ADODB.Parameter
  20. Set op1 = oc.CreateParameter("NOMBRE", adVarChar, adParamInput, 50)
  21. oc.parameters.Append op1
  22. op1.Value = "PEPE SANCHEZ"
  23.  
  24. oc.Execute

Por supuesto este código irá escrito en algún evento del formulario de Access desde el que deseemos lanzar el procedimiento.

Por último reseñar que debemos de tener referenciada la librería ADO que deseamos usar (Herramientas - referencias y selecciónar la versión de Microsoft Activex Data Objects...  que deseamos usar, con la 2.1 library funciona).

Estos ejemplos están probados para Access 2003 contra un procedimiento almacenado programado en SQL Server 2005.

Comentarios

Dudas acerca de pasar los valores como parametros

Hola.

La verdad me ha sido de ayuda tu informacion, pero tengo una duda: Tengo un procedimiento almacenado de insercion de datos en una tabla, pero necesito pasar esos datos desde el access, xq los recibo en un formulario de access, para que sean almacenados en la base de datos de sql, las tablas estan vinculadas, segun entiendo, debo usar la primera opcion de coneccion, pero debo pasar un monton de datos que quiero insertar en una misma tabla, me preguntaba cómo paso estos datos, si es posible pasar gran cantidad de datos???

Mil gracias

Mil gracias por la información. Utilicé esta información para Access 2007 y SQL 2008 Express y funciona de maravilla. Aquí les comparto: Ejemplo 1: Cómo cargar un combo de access 2007 utilizando un procedimiento almacenado en SQL express 2008. El evento pertenece a la acción click del botón Cargar:

  1. Private Sub Cargar_Click()
  2. On Error GoTo Err_Cargar_Click
  3. Dim rst As ADODB.Recordset
  4. Set rst = New ADODB.Recordset rst.Open "dbo.ObtenerServicio", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdStoredProc
  5. If rst.RecordCount > 1
  6. Then
  7. Set cbo_servicio.Recordset = rst
  8. End
  9. If rst.Close
  10. Set rst = Nothing
  11. Exit_Cargar_Click:
  12. Exit Sub
  13. Err_Cargar_Click: MsgBox Err.Description
  14. Resume Exit_Cargar_Click
  15. End Sub

Ejemplo 2: Cómo llamar desde access 2007 a un procedimiento almacenado hecho en sql express 2008. Es algo bien simple el ejemplo...

  1. Private Sub Guardar_Click()
  2. On Error GoTo Err_Guardar_Click
  3. Dim rst As ADODB.Recordset
  4. Dim cmd As ADODB.Command
  5. Set rst = New ADODB.Recordset
  6. Set cmd = New ADODB.Command
  7. cmd.ActiveConnection = CurrentProject.Connection
  8. cmd.CommandType = adCmdStoredProc
  9. cmd.CommandText = "dbo.CrearServicio"
  10. ' Las siguientes l&iacute;neas est&aacute;n comentadas porque el campo Id en la tabla es autonum&eacute;rico.
  11. 'Dim id As ADODB.Parameter
  12. 'Set id = cmd.CreateParameter("id", adInteger, adParamInput)
  13. 'cmd.Parameters.Append id
  14. 'id.Value = txt_id
  15. 'Dim nombre As ADODB.Parameter
  16. 'Set nombre = cmd.CreateParameter("nombre", adVarChar, adParamInput, 20)
  17. 'cmd.Parameters.Append nombre
  18. 'nombre.Value = txt_servicio cmd.Execute '
  19.  
  20. 'Este c&oacute;digo es del ejemplo 1 y sirve para mostrar en el combo la informaci&oacute;n que grab&eacute;.
  21.  
  22. 'rst.Open "dbo.ObtenerServicio", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdStoredProc
  23. 'If rst.RecordCount > 1
  24. ' Then
  25. ' Set cbo_servicio.Recordset = rst
  26. 'End If
  27. 'rst.Close
  28. 'Set rst = Nothing
  29. 'Exit_Guardar_Click:
  30. 'Exit Sub Err_Guardar_Click:
  31. 'If Err.Number = -2147217873
  32. ' Then MsgBox "El dato que intenta guardar ya existe: " & txt_servicio
  33. ' Resume Exit_Guardar_Click
  34. ' Else MsgBox Err.Number & ": " & Err.Description
  35. ' Resume Exit_Guardar_Click
  36. 'End If

Feliz día y noche!

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <pre>, <c>, <cpp>, <csharp>, <css>, <drupal5>, <drupal6>, <html>, <java>, <javascript>, <jquery>, <mysql>, <php>, <python>, <robots>, <ruby>, <sql>, <tsql>, <vb>, <vbnet>, <xml>. The supported tag styles are: <foo>, [foo]. PHP source code can also be enclosed in <?php ... ?> or <% ... %>.

Más información sobre opciones de formato

CAPTCHA
Esta pregunta se hace para comprobar que es usted una persona real e impedir el envío automatizado de mensajes basura.
CAPTCHA de imagen
Escriba los caracteres que se muestran en la imagen.