Usar Base de Datos de SQL Server 2005 Desde Visual Basic 6

download Usar Base de Datos de SQL Server 2005 Desde Visual Basic 6

of 106

Transcript of Usar Base de Datos de SQL Server 2005 Desde Visual Basic 6

Usar base de datos de SQL Server 2005 desde Visual Basic 6.0Tanto una base normal como un fichero .mdf

Publicado el 26/May/2007 Revisado el 26/May/2007 Autor: Guillermo 'guille' Som

En este artculo te explico cmo usar una base de datos de SQL Server 2005 con Visual Basic 6.0, tanto desde un fichero .mdf como en una base de una instancia de SQL Server 2005 o SQL Server 2005 Express.

Introduccin:Cuando instalas SQL Server 2005 (tanto la versin completa como la versin Express), se aade un nuevo proveedor de bases de datos OLEDB: SQLNCLI. Ese proveedor lo tendrs que usar en tus cadenas de conexin en lugar de SQLOLEDB que es el que usars para acceder a una base de datos de SQL Server 2000 con Visual Basic 6.0.

Requisitos para el ejemploEn este ejemplo vamos a usar un control FlexGrid para asignar un Recordset y mostrar los datos directamente. Por tanto, tendrs que crear un nuevo proyecto de Visual Basic 6.0 y agregar ese componente, el cual se muestra como:Microsoft Hierarchical FlexGrid Control 6.0 (SP4) (OLEDB) y en realidad es el control MSHFLXGD.OCX. Tambin tendrs que aadir una referencia a la librera de OLEDB, en mi caso he usado Microsoft ActiveX Data Objects 2.8 Library, pero supongo que con otra versin anterior funcionar, pero no lo he probado, y como esa referencia est disponible despus de instalar el SQL Server 2005 Express, pues... para qu complicarnos? Dependiendo de la forma en que quieras acceder a la base de datos, necesitars (como es de suponer) una base de datos de SQL Server 2005, por ejemplo la base de datos "pubs".

Si lo que pretendes es acceder a un fichero con la extensin .mdf, pues tendrs que tener el fichero al que quieres acceder. Es decir una base de datos de SQL Server 2005 en un fichero fsico, el cual puedes guardar en el mismo directorio del ejecutable o donde ms te plazca, que esa es una de las ventajas de SQL Server 2005: el poder usar un fichero de base de datos directamente, con lo que no necesitas distribuir una base de tipo Access.

El cdigo de ejemploEn el cdigo de ejemplo, te voy a mostrar las dos formas de acceder.

1.- Acceder a una base de una instanciaEn el caso de la base de datos "pubs", la cadena de conexin ser la siguiente:Provider=SQLNCLI; Initial Catalog=pubs; Data Source=(local)\SQLEXPRESS; integrated security=SSPI; persist security info=True;

En este caso, la base de datos se supone que est en la instancia SQLEXPRESS del servidor del equipo actual, si no es as, tendrs que cambiar el valor de Data Source. La base de datos es pubs, si no fuera esa, cambia el nombre asignado a Initial Catalog. La autenticacin usada es la de Windows, si no fuera esa, tendrs que indicar el usuario y el password y cambiar adecuadamente el valor de Integrated Security, aqu tienes un ejemplo de cmo "formar" una cadena de conexin a una base de datos de SQL Server. Suponiendo que la conexin a la base de datos la hacemos desde el evento Click de un botn y que la cadena de seleccin esSELECT * FROM authors, para mostrar los datos en el control FlexGrid (llamado MSHFlexGrid1), el cdigo sera el siguiente:Private Sub btnConectar_Click() ' La conexin a la base de datos Dim cn As ADODB.Connection Set cn = New ADODB.Connection

' Para la cadena de seleccin Dim sSelect As String

' Para una base de datos normal: sSelect = "SELECT * FROM authors"

cn.Open "Provider=SQLNCLI; " & _

"Initial Catalog=pubs; " & _ "Data Source=(local)\SQLEXPRESS; " & _ "integrated security=SSPI; persist security info=True;"

' El recordset para acceder a los datos Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset

' Abrir el recordset de forma esttica, no vamos a cambiar datos rs.Open sSelect, cn, adOpenStatic

' Permitir redimensionar las columnas MSHFlexGrid1.AllowUserResizing = flexResizeColumns

' Asignar el recordset al FlexGrid Set MSHFlexGrid1.DataSource = rs

rs.Close cn.Close

End Sub

2- Acceder a una base de un ficheroPara acceder a una base de datos que est en un fichero, necesitars indicar la ruta (path) en la que est ese fichero con la extensin .mdf. En este ejemplo, esa ruta est en la variable sBase. La cadena de conexin sera la siguiente:Provider=SQLNCLI; AttachDBFileName= ruta completa del fichero de la base de datos; Data Source=(local)\SQLEXPRESS; integrated security=SSPI; persist security info=True;

Como es de suponer, el nombre (y el directorio completo) de la base de datos es lo que tienes que asignar aAttachDBFileName. Adems debes indicar en Data Source el nombre de la instancia de SQLEXPRESS que se usar para acceder a esa base de datos, al menos debes indicar una instancia vlida. En el siguiente cdigo tienes cmo usar una base de datos llamada PruebaPrecios.mdf que est en un directorio llamadobases del disco E. Esa base de datos debe tener una tabla llamada Clientes que es la que se usa en el siguiente ejemplo, que como en el cdigo del ejemplo anterior, se ejecuta desde

el evento Click de un botn y asigna los datos al FlexGrid que tenemos en el formulario.Private Sub btnConectar_Click() ' La conexin a la base de datos Dim cn As ADODB.Connection Set cn = New ADODB.Connection

' Para la cadena de seleccin Dim sSelect As String

' Para usar un fichero directamente: Dim sBase As String

' Poner aqu el path y el nombre de la base sBase = "E:\bases\PruebaPrecios.mdf"

' Y la cadena de seleccin adecuada sSelect = "SELECT * FROM Clientes" ' cn.Open "Provider=SQLNCLI; " & _ "AttachDBFileName=" & sBase & "; " & _ "Data Source=(local)\SQLEXPRESS; " & _ "integrated security=SSPI; persist security info=True;"

' El recordset para acceder a los datos Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset

' Abrir el recordset de forma esttica, no vamos a cambiar datos rs.Open sSelect, cn, adOpenStatic

' Permitir redimensionar las columnas Me.MSHFlexGrid1.AllowUserResizing = flexResizeColumns

' Asignar el recordset al FlexGrid Set Me.MSHFlexGrid1.DataSource = rs

rs.Close cn.Close

End Sub

Y eso es todo, recuerda que la parte importante es saber el nombre del proveedor OLEDB que tenemos que usar, que en el caso de SQL Server 2000 es SQLOLEDB y en el caso de SQL Server 2005 es SQLNCLI. Adems debes indicar el nombre de la instancia de SQL Server adecuada, pero por lo general podrs usar el nombre que te he mostrado en el cdigo de ejemplo. Por lo dems, el cdigo a usar una vez que hemos conectado ser el que habitualmente usemos en nuestras aplicaciones de acceso a datos.

Indicar el path de la base de datos usando un data controlEjemplos con ADO y DAOPublicado: 18/Sep/2004 Actualizado: 18/Sep/2004 Autor: Guillermo 'guille' Som

En este ejemplo vamos a ver cmo indicar el path en el que se encuentra la base de datos, pero lo haremos en tiempo de ejecucin, es decir cuando la aplicacin est ejecutndose. Seguramente si lees el prrafo anterio en la que te digo lo que te voy a explicar, no te parecer nada del otro mundo, ya que eso se ha dicho y explicado en varias ocasiones. Pero como resulta que an hay mucha gente que usa los controles "enlazados" y los data control y los asigna en modo de diseo... pues... para ellos seguros que le ir bien esta "historia" que voy a contar. Seguramente cuando te explique la situacin en la que puede ser til saber lo que te voy a contar, cambies de opinin.

Los precedentes (la situacin)Empecemos el ejemplo usando DAO, ya que en VB6 puede que haya ms gente (sobre todo los que empiezan) que usen el DataControl que est de forma predeterminada en la barra de herramientas.

Usando controles enlazados DAOEstos son los pasos que debemos seguir para poder hacer el proyecto de prueba: 1- Creamos un nuevo proyecto de Visual Basic 6 (cuando digo VB6, tambin se puede aplicar a VB5 e incluso a VB4), aadimos el control Data, que est en el Toolbox y se crear un objeto en el formulario llamado Data1. 2- Ahora le asignamos la base de datos que usaremos, lo ms usual es que el usuario seleccione el DataControl, se vaya a la ventana de propiedades, seleccione la propiedad DatabaseName y busque una base de datos (pulsando en el botn con los tres puntos suspensivos). 3- Una vez que hemos indicado el nombre de la base de datos, tendremos que indicarle la tabla a la que queremos acceder. Para ello tendremos que seleccionar la propiedad RecordSource y elegir de la lista desplegable la tabla a usar. Estos tres pasos sern los que nos permitan acceder a una base de datos desde nuestro proyecto de VB6.

Nota: En el zip con el cdigo completo he incluido una base de datos de prueba. Copia esa base de datos (db2000.mdb) en el mismo directorio del proyecto y sala para asignarla al control data. De esa forma ser ms fcil seguir las indicaciones de este artculo.

Ahora vamos a aadir un control DataGrid, de forma que podamos manejar de forma simple los datos de nuestra base de datos y de la tabla seleccionada. Para aadir un DataGrid tendremos que hacer lo siguiente: 1- En el men Proyecto (Project) seleccionamos Componentes (Components...), nos mostrar un cuadro de dilogo con los controles ActiveX que podemos aadir a nuestra aplicacin. De ese cuadro de dilogo seleccionaremos Microsoft Data Bound Grid Control(tambin se indicar la versin del VB y el SP que se est usando, en mi caso sera 5.0 (SP3)). Esto aadir a la barra de herramientas el control DataGrid y haciendo doble-click en l, lo aadiremos al formulario. 2- Seleccionamos el nuevo control que tenemos en el formulario, lo cambiamos de tamao y posicin y ahora le indicaremos de dnde obtendr los datos. Para ello nos vamos a la ventana de propiedades (el DataGrid debe estar seleccionado) y buscamos la propiedadDataSource, de la lista desplegable seleccionamos el DataControl que usaremos para obtener los datos. En este ejemplo ser Data1 (que debera ser el nico que se muestre).

Hecho todo esto, podemos pulsar F5 para ejecutar la aplicacin y veremos que el DataGrid se llena con los datos que tenga la tabla de la base de datos que le indicamos al control Data. Para probar que todo esto funciona como debe vamos a compilar el proyecto (crear el ejecutable) y veamos si siempre funciona. Para compilar el proyecto y crear el ejecutable, selecciona la opcin Make del men File (si tienes el VB en espaol, seguramente tendr otros nombres). Ahora ve al directorio en el que est el EXE y ejectalo (haz doble-click en l). Si has seguido los pasos de forma correcta, debera mostrarte lo mismo que cuando pulsaste F5 desde el IDE (entorno de desarrollo) de VB.

Haciendo que falle todo esto...Para probar que no siempre funcionar, vamos a hacer ahora lo siguiente: 1- Asegrate de que has cerrado la aplicacin. Cierra tambin el VB6. 2- Crea un directorio en otro sitio. 3- Corta el ejecutable y la base de datos (se supone que la base de datos estaba en el mismo directorio del proyecto, tal como se comenta en la nota) 4- Pgalos en el nuevo directorio. 5- Abre el ejecutable (ejectalo, doble-click, ya sabes...) Al ejecutarse la aplicacin, nos indicar que no se puede encontrar la base de datos y nos mostrar el path en el que estaba anteriormente. La aplicacin se abrir, pero en el DataGrid no habr nada... ya que no se ha podido abrir la base de datos y por tanto no se pueden "ver" esos datos. La solucin: Para que la aplicacin vuelva a funcionar, tendramos que volver a copiar la base de datos en el directorio en el que estaba (el del proyecto). Comprubalo moviendo (cortar y pegar) la base de datos al directorio del proyecto. El problema (colateral): Pero... imagnate que lo que quieres hacer, es distribuir esta aplicacin y la base de datos. Como hemos podido comprobar, la nica forma de que funcione es creando un directorio que se encuentre en el mismo "camino" que el que nosotros tenemos en nuestro equipo. Por ejemplo, en mi caso el directorio del proyecto es: E:\gsCodigo\VBpruebas\Bases de datos\indicar el path de una base de datos usando Data Control\conDAO Que pasa si el cliente no tiene un disco E? O, peor an, que pasa si el disco E del cliente es un CD-ROM?

Pues que no funcionar el programa. Y en caso de que si tenga un disco E, tendremos que crear esos directorios para que todo funcione.

Cual es la mejor solucin?Creo que sera mejor que el programa pudiera funcionar si tanto el ejecutable y la base de datos estn en el mismo directorio, y lo ms importante es: sea cual sea ese directorio. Es decir, nos dar igual si el disco en el que est la base y el exe es el disco C, el E o el X, adems de que el directorio puede ser cualquiera... Cmo podemos hacerlo? Indicndole al programa dnde est la base de datos. Si la base de datos est en el mismo directorio que el ejecutable, podemos hacer lo siguiente: Private Sub Form_Load() Data1.DatabaseName = App.Path & "\db2000.mdb" End Sub De esta forma le indicamos al control data dnde localizar la base de datos y todo volver a funcionar de forma satisfactoria. En este cdigo, indicamos que el directorio en el que se encuentra la base de datos es el mismo directorio desde el que se est ejecutando la aplicacin. En el caso de que la base de datos est en otro directorio, simplemente tenemos que usar ese directorio a la propiedad DatabaseName del data control. Por ejemplo si leemos el path de un fichero de configuracin (INI) o desde el registro de Windows usando GetSetting, etc.

Nota: Si tienes varias tablas en la misma base de datos y tambin tienes varios controles data y a la vez varios controles DataGrid enlazados con esos controles data, lo nico que tendras que hacer es asignar a todos los controles data el path correcto de la base de datos. El resto de propiedades no hace falta cambiarlas ya que seguirn siendo los mismos valores.

Este primer ejemplo es para usar con acceso a datos DAO. Ahora veamos cmo hacer lo mismo pero con controles ADO.

Usando controles enlazados ADO

Tal como vamos a comprobar, lo que vamos a hacer en esta ocasin, (usando ADO), es casi lo mismo que en el caso de DAO, lo nico que cambiar sern los controles que vamos a usar, adems de que el control data de ADO no tiene las mismas propiedades que el de DAO. As que, veamos paso a paso cmo crear el proyecto, agregar los controles, enlazarlos con la base de datos, etc., etc. 1- Creamos un nuevo proyecto de VB6 2- En el men Proyecto (Project) seleccionamos Controles (Controls...), en el cuadro de dilogo tenemos que seleccionar el control data de ADO, el cual (en mi caso) tiene el nombre Microsoft ADO Data Control 6.0 (SP4) (OLEDB). 3- Repetimos el paso anterior, pero en esta ocasin seleccionamos Microsoft DataGrid Control 6.0 (SP5) (OLEDB). 4- Con los dos pasos anteriores tendremos en el Toolbox dos nuevos controles, hacemos doble-click en cada uno de ellos para agregarlos al formulario. 5- Seleccionamos el control data (Adodc1) para indicar la base de datos y la tabla que vamos a usar. En la ventana de propiedades seleccionamos ConnectionString y pulsamos en el botn con los tres puntos suspensivos para que se muestre el asistente de conexin. -De las tres opciones que nos muestra, seleccionamos la ltima: Use Connection String, pulsamos en el botn Build... y se mostrar otro cuadro de dilogo. -Seleccionamos la primera ficha (Provider) y de la lista de proveedores que muestra seleccionamosMicrosoft.Jet.OLEDB.4.0 (si no se muestra, es que no tienes ese proveedor y la base de datos de ejemplo no te funcionar) -Pulsa en Next>> para indicar el nombre de la base de datos, se mostrar la segunda ficha (Connection). -Escribe el nombre de la base de datos en la caja de texto que hay bajo 1. Select or enter a database name o pulsa en el botn con los tres puntos para seleccionar una base (recuerda usar la base de datos que acompaa al cdigo la cual debe estar en el mismo directorio del proyecto) -No escribas nada en usuario y password, djalos con los valores predeterminados, ya que usaremos autentificacin de Windows para abrir la base. -Para comprobar que se puede abrir la base de datos, pulsa en el botn Test Connection y si todo va bien, te dir que la conexin ha funcionado correctamente. 6- Ahora vamos a indicar que tabla queremos usar. Asegrate que el control data est seleccionado y en la ventana de propiedades selecciona RecordSource y pulsa en el botn con los tres puntos para que se muestre el asistente. -De la primera lista desplegable selecciona 2- adCmdTable. -De la segunda lista selecciona la tabla que quieres usar (en nuestro caso ser Table1). 7- Ya tenemos asignado el control data para que sepa que base de datos y que tabla debe usar. 8- Ahora vamos a indicarle al DataGrid que use el control data como fuente de datos, por tanto selecciona el DataGrid y en la ventana de propiedades selecciona

la propiedad DataSource y de la lista desplegable tienes que seleccionar el control data que tiene la conexin a la tabla que queremos usar, en nuestro caso Adodc1. 9- Pulsa F5 para probar que todo funciona bien. Con todos estos pasos tendremos una aplicacin similar al del ejemplo anterior y adems, con los mismos problemas, es decir, la base de datos que usar el ejecutable (el cual no tiene ni una lnea de cdigo) ser la que hemos indicado en el control data. Por tanto para que funcione, la base de datos tiene que estar en el path indicado en tiempo de diseo. Si hacemos la misma prueba que antes de compilar la aplicacin y mover el ejecutable y la base de datos a un directorio diferente, no funcionar.

La primera opcin de ADO para que funcione: Para que funcione debemos indicarle al data control dnde se encuentra la base de datos, pero resulta que el control data ADO no tiene una propiedad DatabaseName como su primo el data control DAO. En el control ADO tenemos que usar la cadena de conexin (como en las bases de datos de SQL Server), por tanto debemos modificar dicha cadena de conexin para que apunte a la base de datos adecuada. Aqu tenemos el cdigo a aadir al proyecto para que todo funcione correctamente: Private Sub Form_Load() ' Aqu se puede indicar el path de la base de datos: Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & App.Path & "\db2000.mdb;" & _ "Persist Security Info=False" Adodc1.Refresh Set DataGrid1.DataSource = Adodc1.Recordset End Sub

En el caso de ADO, adems de indicarle el path correcto debemos usar este cdigo adicional: Adodc1.Refresh para que se carguen los datos desde la base de datos. Set DataGrid1.DataSource = Adodc1.Recordset porque debemos asignar los datos que el control data ha cargado. Esto ltimo no es "estrictamente" necesario, pero si no lo hacemos el contenido de la base de datos no ser el correcto. Por qu este cdigo extra? Por la sencilla razn de que el control data intentar obtener los datos de la base de datos y despus rellenar el DataGrid.

Adems, en el caso del control data de ADO si la base de datos no est en el sitio adecuado, se mostrar un mensaje de aviso de que la base de datos no se ha encontrado, aunque despus cargar bien los datos y funcionar correctamente.

La segunda opcin de ADO para que funcione Por tanto es preferible no asignar en tiempo de diseo la cadena de conexin a la base de datos, ni tampoco asignar el RecordSource, en este caso, el cdigo a usar ser el siguiente: Private Sub Form_Load() ' Aqu se puede indicar el path de la base de datos: Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & App.Path & "\db2000.mdb;" & _ "Persist Security Info=False" Adodc1.RecordSource = "Table1" Adodc1.Refresh Set DataGrid1.DataSource = Adodc1.Recordset End Sub En este caso, lo que hacemos es indicar tambin la tabla de la que se extraern los datos.

La tercera opcin de ADO para que funcione Otra opcin es no indicar el path de la base de datos, sino slo el nombre de la base, de esta forma, la base se buscar en el mismo path del ejecutable. Con lo cual la cadena de conexin podra quedar de la siguiente forma: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db2000.mdb;Persist Security Info=False Y ya no ser necesario usar ningn cdigo en el evento Load del formulario.

Bueno, confo en que con estas explicaciones, (las cuales he preferido indicarlas en plan "paso a paso para principiantes" porque, casi con seguridad, todo esto lo necesitarn los que no tengan mucho manejo con el uso de bases de datos...), te quede ms claro porqu algunas veces las aplicaciones que usan los controles enlazados no funcionan al cambiar el path en el que se encuentra la base de datos. Que lo disfrutes! Nos vemos. Guillermo El cdigo fuente de los ejemplos y la base de datos: nombreBase_datacontrolADOyDAO.zip 42 KB Recuerda copiar la base de datos en los directorios del proyecto.

Conectar a una base de datos de SQL Server con VB6(Abrir una tabla y mostrar los campos/columnas de la tabla)

Publicado: 10/Sep/2004 Actualizado: 26/May/2007 Pulsa aqu, si quieres ver cmo conectar a una base de SQL Server 2005

Es curioso, pero de todos los ejemplos que tengo sobre acceso a bases de datos, (usando VB6 y anteriores), no tena ninguno que usase una base de datos de SQL Server, todos los ejemplos eran de bases de Access. Pero ms vale tarde que nunca, verdad? Pues aqu tienes un ejemplo para acceder a una base de datos de SQL Server, abrir una tabla y, para que el ejemplo no sea demasiado corto, mostraremos en un combo todos los campos (columnas) de dicha tabla. Seguramente en otras ocasiones pondr ejemplos ms completos que usen bases de datos de SQL Server, aunque, si te fijas, lo nico que diferencia el uso de este tipo de bases de datos y las de Access es la forma de conectarse al "proveedor" de la base de datos. Para este ejemplo, tendremos un formulario en el que colocaremos un botn llamado cmdAbrir y un ComboBox llamado cboCampos. Tambin necesitaremos una referencia a: Microsoft ActiveX Data Objects 2.0 Library o cualquier versin superior que tengas. En la parte general de declaraciones tendremos definidas dos variables, una de un objeto Connection y otra de un objeto Recordset. En el evento del botn cmdAbrir haremos todo el proceso de conectar a la base de datos, cargar el recordset con la tabla que queramos acceder y mostraremos los campos de dicha tabla en el combo.

Aqu tienes el cdigo completo. Nota: He resaltado en negrita y en rojo los sitios en los que deberas indicar tus propios datos, es decir, el Data Source (fuente de datos), la base de datos (Initial Catalog) y la tabla a abrir. En este ejemplo, el Data Source usado en el ejemplo, es el que instala el SDK de .NET Framework.

'----------------------------------------------------------------------------' Conectar a una base de datos de SQL Server (08/Sep/04) ' y mostrar los campos de la tabla ' ' Para que este ejemplo funcione, necesitamos una referencia a: ' Microsoft ActiveX Data Objects 2.0 Library (o superior) ' ' Guillermo 'guille' Som, 2004 '----------------------------------------------------------------------------Option Explicit Private cnn As ADODB.Connection Private rst As ADODB.Recordset Private Sub cmdAbrir_Click() Dim tField As ADODB.Field ' ' Por si ya estaba abierta... Set cnn = Nothing Set rst = Nothing ' ' Crear los objetos Set cnn = New ADODB.Connection Set rst = New ADODB.Recordset '

' abrir la base usando las credenciales de Windows cnn.Open "Provider=SQLOLEDB; " & _ "Initial Catalog=pubs; " & _ "Data Source=(local)\NETSDK; " & _ "integrated security=SSPI; persist security info=True;" ' ' abrir el recordset indicando la tabla a la que queremos acceder rst.Open "SELECT * FROM authors", cnn, adOpenDynamic, adLockOptimistic ' ' Asignar los nombres de los campos al combo With cboCampos .Clear For Each tField In rst.Fields .AddItem tField.Name Next .ListIndex = 0 End With ' ' Cerrar el recordset y la conexin rst.Close cnn.Close ' End Sub

Conectar a una base de datos de SQL Server con VB6(Abrir una tabla y mostrar los campos/columnas de la tabla)

Publicado: 10/Sep/2004

Actualizado: 26/May/2007 Pulsa aqu, si quieres ver cmo conectar a una base de SQL Server 2005

Es curioso, pero de todos los ejemplos que tengo sobre acceso a bases de datos, (usando VB6 y anteriores), no tena ninguno que usase una base de datos de SQL Server, todos los ejemplos eran de bases de Access. Pero ms vale tarde que nunca, verdad? Pues aqu tienes un ejemplo para acceder a una base de datos de SQL Server, abrir una tabla y, para que el ejemplo no sea demasiado corto, mostraremos en un combo todos los campos (columnas) de dicha tabla. Seguramente en otras ocasiones pondr ejemplos ms completos que usen bases de datos de SQL Server, aunque, si te fijas, lo nico que diferencia el uso de este tipo de bases de datos y las de Access es la forma de conectarse al "proveedor" de la base de datos. Para este ejemplo, tendremos un formulario en el que colocaremos un botn llamado cmdAbrir y un ComboBox llamado cboCampos. Tambin necesitaremos una referencia a: Microsoft ActiveX Data Objects 2.0 Library o cualquier versin superior que tengas. En la parte general de declaraciones tendremos definidas dos variables, una de un objeto Connection y otra de un objeto Recordset. En el evento del botn cmdAbrir haremos todo el proceso de conectar a la base de datos, cargar el recordset con la tabla que queramos acceder y mostraremos los campos de dicha tabla en el combo. Aqu tienes el cdigo completo. Nota: He resaltado en negrita y en rojo los sitios en los que deberas indicar tus propios datos, es decir, el Data Source (fuente de datos), la base de datos (Initial Catalog) y la tabla a abrir. En este ejemplo, el Data Source usado en el ejemplo, es el que instala el SDK de .NET Framework.

'-----------------------------------------------------------------------------

' Conectar a una base de datos de SQL Server (08/Sep/04) ' y mostrar los campos de la tabla ' ' Para que este ejemplo funcione, necesitamos una referencia a: ' Microsoft ActiveX Data Objects 2.0 Library (o superior) ' ' Guillermo 'guille' Som, 2004 '----------------------------------------------------------------------------Option Explicit Private cnn As ADODB.Connection Private rst As ADODB.Recordset Private Sub cmdAbrir_Click() Dim tField As ADODB.Field ' ' Por si ya estaba abierta... Set cnn = Nothing Set rst = Nothing ' ' Crear los objetos Set cnn = New ADODB.Connection Set rst = New ADODB.Recordset ' ' abrir la base usando las credenciales de Windows cnn.Open "Provider=SQLOLEDB; " & _ "Initial Catalog=pubs; " & _ "Data Source=(local)\NETSDK; " & _ "integrated security=SSPI; persist security info=True;" ' ' abrir el recordset indicando la tabla a la que queremos acceder rst.Open "SELECT * FROM authors", cnn, adOpenDynamic, adLockOptimistic ' ' Asignar los nombres de los campos al combo With cboCampos

.Clear For Each tField In rst.Fields .AddItem tField.Name Next .ListIndex = 0 End With ' ' Cerrar el recordset y la conexin rst.Close cnn.Close ' End Sub

Algunas instrucciones SQL para manejar los datosPublicado el 02/May/2004 Actualizado el 26/May/2008 Autor: Guillermo 'guille' Som Nota 26/May/08: Aqu tienes ms ejemplos de instrucciones de SQL usadas desde ADO.NET Los links: Sobre el contenido de esta seccin Seleccionar los datos a cargar de una tabla (SELECT) (02/May/04) Clasificar los datos seleccionados (ORDER BY) (02/May/04) Indicar el nmero mximo de registros a devolver (TOP) (02/May/04) Actualizar los datos segn un criterio (UPDATE) (02/May/04) Eliminar los datos segn un criterio (DELETE) (02/May/04)

Seleccionar los datos a cargar de una tabla (02/May/04) Esta es la forma ms sencilla y habitual de usar las rdenes SQL. Normalmente usaremos este tipo de instrucciones para cargar los datos en un DataTable (si trabajamos con ADO.NET o en un Recordset si trabajamos con ADO o DAO). Por ejemplo:

SELECT * FROM Clientes WHERE Provincia = 'Madrid' Este cdigo SQL selecciona los registros de la tabla Clientes que residan en Madrid. Los campos que devolvera seran todos, ya que hemos indicado * despus de SELECT. Si slo queremos que devuelva los datos contenidos en los campos Nombre, Apellidos y NIF haramos esto otro: SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' TIP: Por rendimiento, es recomendable devolver slo los campos que realmente necesitamos en lugar de devolver todos los campos.

Clasificar los datos seleccionados (ORDER BY) (02/May/04) Tambin podemos indicar que esos datos se devuelvan clasificados por cualquier campo, por ejemplo por los Apellidos de forma ascendente (la forma predeterminada): SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos Pero si queremos los datos de mayor a menor (descendente), le aadimos la instruccin DESC despus del campo por el que queremos clasificar: SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC O si queremos que la clasificacin se haga usando dos campos, esos campos los indicaremos separados por comas: SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos, Nombre Y si queremos que el orden sea descendente, le aadimos a continuacin la instruccin DESC detrs de cada campo: SELECT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC, Nombre DESC Tambin podemos clasificar en distinto orden los campos indicados tras ORDER BY, por ejemplo: SELECT * FROM Clientes ORDER BY Apellidos DESC, Nombre ASC, NIF DESC .

Indicar el nmero mximo de filas a devolver (TOP) (02/May/04)

Al realizar una seleccin de datos clasificados (usando ORDER BY), podemos indicar el nmero de filas (registros) mximos que queremos devolver, para ello indicaremos TOP y el nmero de filas o el porcentaje de filas a devolver: Con las siguientes instrucciones se devolvern los primeros 50 registros (si los hay) que cumplan las condiciones indicadas: SELECT TOP 50 Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC TOP no diferencia filas que sean iguales, es decir, si la fila 50 y la 51 tienen los mismos Apellidos, devolver 51. En este otro ejemplo, se devolver el 20% de las filas que coincidan con las instrucciones SQL indicadas: SELECT TOP 20 PERCENT Nombre, Apellidos, NIF FROM Clientes WHERE Provincia = 'Madrid' ORDER BY Apellidos DESC Nota: Dependiendo de que estemos usando DAO o ADO el nmero de filas devueltas puede que sea distinto de cuando usamos ADO.NET, al menos en una misma tabla, usando TOP 150, con ADO me devolva 151 filas y con ADO.NET me devolva 150. No se si es que TOP se comporta de forma diferente en ADO.NET .

Actualizar los datos segn un criterio (UPDATE) (02/May/04) Si lo que quieres es actualizar el contenido de un campo cuando se cumpla un criterio indicado, en lugar de recorrer todas las filas, podemos usar UPDATE / SET, por ejemplo: UPDATE Clientes SET NPr = 28 WHERE Provincia = 'Madrid' Esto har que se asigne un valor 28 al campo NPr de todos los clientes que cumplan lo que se indica despus de WHERE, es decir que cumplan el criterio indicado. Tambin podemos indicar (despus de SET) varios campos a actualizar, separndolos por comas: UPDATE Clientes SET NPr = 28, Patrn = 'San Isidro' WHERE Provincia = 'Madrid' Una vez ejecutadas estas instrucciones SQL no se podr deshacer los cambios, al menos si estamos trabajando con Recordsets DAO o ADO, ya que si trabajamos con ADO.NET, esos datos slo se harn permanentes al actualizar "fsicamente" los datos con el DataAdapter. .

Eliminar los datos segn un criterio (DELETE) (02/May/04) De la misma forma que podemos actualizar la informacin mediante un criterio WHERE, podemos eliminar los registros de forma "masiva" usando la instruccin DELETE. Por ejemplo para eliminar todos los Clientes de Madrid: DELETE * FROM Clientes WHERE Provincia = 'Madrid'

Nota: Ni que decir tiene que este tipo de instrucciones SQL hay que usarla con muchsima precaucin, ya que si la tabla est ligada a otra, tambin se perdern los datos relacionados. Y una vez eliminados los datos... ya no se pueden recuperar. El uso de DELETE no elimina la tabla, aunque se eliminaran todos los registros. .

Sobre el contenido de esta seccin. En esta pgina te mostrar algunas instrucciones SQL que te permitirn manejar datos de forma ms o menos fcil o al menos te servirn como punto de referencia cuando necesites hacer algo en concreto. Algunas de estas instrucciones (u rdenes) servirn tanto para bases de datos del tipo Access como de SQL Server (e incluso otros proveedores de datos), en la medida de lo posible, intentar indicar si hay alguna restriccin para algunos de los proveedores. Tambin intentar informarte cmo usar esas instrucciones, ya que algunas simplemente servirn para seleccionar datos y otros harn cambios en las tablas afectadas. Los ejemplos principalmente sern para usar con ADO.NET, pero en otras ocasiones tambin sern vlidas para ADO e incluso para DAO, en estos casos es posible que existan otros links (enlaces) a las pginas de ADO y DAO "normales", las que estn en la seccin de VB. Si no se indica nada (sobre todo si no hay ejemplos de cdigo), las instrucciones SQL indicadas sern vlidas tanto para DAO, ADO y ADO.NET y para bases de Access o SQL Server

Nota: El que se llame rdenes SQL (o instrucciones SQL), no quiere decir que slo sean vlidos para bases de datos SQL Server, ya que el "lenguaje" SQL es un estndar (o casi) que se usa para manejar los datos de cualquier base de datos, (al menos las de Access y SQL Server).

usando ADO, desde un formulario Web (.aspx)Publicado el 02/Ene/2004 Actualizado el 02/Ene/2004

Panorama

IntroduccinEn este ejemplo se accede a una base de datos de Access usando ADO. Como vers el cdigo ser parecido al que se usara en una pgina ASP normal. Lo nico que tenemos que hacer es: Indicar que se va a usar compatibilidad con COM. Esto se consigue indicando aspcompat = true en la directiva ASP.NET indicada al principio de la pgina. La forma de acceder a los objetos ADO (que son COM/ActiveX) ya que habr que usar cdigo "compatible" con punto NET, al menos en la forma de llamar a los mtodos y funciones, es decir usando los parntesis para encerrar los parmetros. Ya que por lo dems, el cdigo es "exactamente" el mismo que se usara con ASP y VBScript.

En el ejemplo siguiente, se da por supuesto que existe un directorio llamado "datos" que est en el mismo directorio que la pgina ASPX, si cambias la localizacin de ese directorio, tendrs que cambiar el cdigo de la conexin, ms concretamente en el parmetro a Server.MapPath(...). En el zip con el ejemplo, incluyo una pequea base de datos que es la usada en el formulario Web. Por tanto, si lo descomprimes, procura que la base de datos se quede dentro del directorio "datos". De forma predeterminada se crear ese directorio.

Dnde descomprimir el fichero? Dentro del directorio "localhost", por defecto es: C:\Inetpub\wwwroot Para acceder a la pgina de prueba, tendrs que usar http://localhost/ejemploAccessADO.aspx Por supuesto esto slo ser posible si tienes el Windows 2000/XP Profesional o un Windows Server que tenga instalado el IIS. En este ejemplo slo muestro el cdigo de Visual Basic, ya que al fin y al cabo es VBScript.

Nota: Este ejemplo realmente no utiliza ningn control ASP.NET, slo cdigo "puro y duro".

El link al cdigo de ejemplo: ejemploAccess.zip (13.4KB) El cual incluye tambin el ejemplo de acceso a ADO.NET (tanto para VB como para C#)

El cdigo para VBSCRIPT.

Acceso a datos con compatibilidad ASP (COM) Prueba de acceso a base de datos Access con ADO desde ASP.NET
= " & FechaSQL(fechaActual) & " AND [FechaTrmino] = " & FechaSQL(fechaActual) & " AND [FechaTrmino] >" y selecciona la base de datos que quieres usar, (si tienes la que estn incluidas en el ZIP, se llamar db2000.mdb); el resto de opciones djalos como est; pulsa en "Aceptar" dos veces para que se cierren los cuadros de dilogo. Ahora tenemos que decirle que tabla usar y otras cosillas. Selecciona la propiedad CursorType y de la lista desplegable selecciona 2adOpenDynaset. Selecciona la propiedad RecordSource y pulsa en el botn, te mostrar un

cuadro de dilogo. De la lista desplegable (Command type), selecciona: 2-adCmdTable, la lista "Table or Stored Procedure Name" se habr habilitado, selecciona el nombre de la tabla que quieres usar, en este caso Table1 y pulsa en Aceptar. Esto mismo se puede hacer mediante cdigo, para ello asgnale estos valores al datacontrol: (por ejemplo en el evento Form_Load) ' Indicar la base de datos a usar Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & App.Path & "\db2000.mdb" Adodc1.CursorType = adOpenDynamic ' Conectarlo a la tabla de prueba Adodc1.RecordSource = "Table1" ' Refresh es necesario para que se cargue la tabla Adodc1.Refresh

Nota: En el cdigo de ejemplo asignaremos en tiempo de ejecucin la base de datos y dems conexiones necesarias. Ahora ser necesario "ligar" los cuadros de texto con el Datacontrol y los campos correspondientes: Selecciona los tres Text1, en la ventana de propiedades selecciona DataSource y en la lista desplegable selecciona Adodc1

Para ligar cada Text1 con un campo de la base de datos: Pulsa en cualquier parte del formulario para quitar la seleccin actual. Selecciona el Text1 con ndice 0. En la ventana de propiedades, selecciona DataField y de la lista desplegable, selecciona "Nombre" Haz lo mismo con los otros dos Text1, pero para el de ndice 1, selecciona "e-mail" y para el otro: "Comentario" Este ltimo control sera conveniente que lo hicieras ms grande y MultiLine, ya que se supone que aceptar textos ms grandes porque el tipo de campo es "Memo" Ya puedes pulsar en F5 para probar que todo esto funciona. Realmente no es necesario aadir nada de cdigo, pero si quieres hacerlo manualmente, aade lo siguiente en el evento Form_Load:

Private Sub Form_Load() ' Indicar la base de datos a usar Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & App.Path & "\db2000.mdb" Adodc1.CursorType = adOpenDynamic ' Conectarlo a la tabla de prueba Adodc1.RecordSource = "Table1" ' Refresh es necesario para que se cargue la tabla Adodc1.Refresh ' Conectar manualmente los Text1 al recordset Dim i As Long ' Asignar el control data For i = 0 To 2 Set Text1(i).DataSource = Adodc1 Next ' Asignar los nombres de los campos Text1(0).DataField = "Nombre" Text1(1).DataField = "e-mail" Text1(2).DataField = "Comentario" End Sub

Para que el Caption del data control nos muestre el nmero de registro, en este caso el campo ID de la tabla, aade este cdigo:

Private Sub Adodc1_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, _ ByVal pError As ADODB.Error, _ adStatus As ADODB.EventStatusEnum, _ ByVal pRecordset As ADODB.Recordset) ' Mostrar el ID del registro actual ' si se pasa del primero o del ltimo, dar error On Local Error Resume Next

' Mostrar el ID del registro actual usando el recordset pasado como parmetro 'Adodc1.Caption = "ID del Registro: " & pRecordset!ID ' Tambin se puede usar: Adodc1.Caption = "ID del Registro: " & Adodc1.Recordset!ID Err = 0 End Sub

Aadir y borrar registros de la tabla. Para tener estas dos opciones, aade dos botones al formulario, al primero lo llamas cmdAdd y en el Caption escribe Aadir, al otro botn le cambias el nombre a cmdDel y en el Caption escribe: Eliminar. Aade el siguiente cdigo: ' Private Sub cmdAdd_Click() Adodc1.Recordset.AddNew End Sub Private Sub cmdDel_Click() Adodc1.Recordset.Delete End Sub

Bueno, creo que con esto tienes para empezar, en otra ocasin te mostrar cmo hacer esto mismo pero sin usar el data control. En el zip con los listados hay otro proyecto que te permite seleccionar entre una base de Access 97 o una creada con Access 2000 Pulsa este link para bajar el cdigo y las bases de ejemplo. (ADO_datacontrol.zip 19.8 KB)

Si quieres ver un ejemplo de cmo acceder a una base de datos usando ADO, pero sin el data control...