SQL en VB
SQL en VB
El objetivo principal de SQL es la realización de consultas y cálculos con los datos de una o
varias tablas.
El Nuevo Modelo De Datos De Microsoft Es Ado Net Este Modelo Descansa En Una Serie De
Objetos Especializados Que Facilitan El Procesamiento De Una Base De Datos.
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Empezando:
El problema es comunicar un programa o aplicación con una base de datos y más que
comunicar se pretende que el programa o aplicación realice una serie de procesos u
operaciones con la base de datos o mejor aun con el conjunto de tablas que contiene una base
de datos.
La primera nota a recordar es que una base de datos puede estar físicamente en el servidor y
en algún fólder o directorio del disco duro de dicha maquina servidora por ejemplo, c:\progfacil\
misitio\[Link], como se observa la base que se construyo en Access ([Link]) se
almaceno en el disco c en el fólder progfacil y dentro del subfolder misitio.
Sin embargo también es necesario conocer que así como existen servidores de paginas ( Web
Server ), servidores de correo ( mail server ), servidores de ftp ( ftp server ), etc., también
existen servidores de bases de datos (database server), los mas comunes son el sqlserver de
microsoft, oracle, mysql, etc., estos servidores también pueden crear, administrar y procesar
una base de datos por supuesto que el procedimiento que se dio para crearla en access en el
tema anterior no se puede usar para crear y cargar una base de datos en un servidor de bases
de datos. El modo de comunicarse entre nuestro programa visual basic net o aplicación y la
base de datos (ya sea física o un dbserver) implica que ambos manejen un lenguaje de
programación común, es decir no se puede mandar una instrucción en C# o en borland delphi
java a la base de datos y además esperar que esta ultima la entienda ( para entender esto, una
razón muy sencilla es que la base de datos tendría que conocer o comprender todos los
lenguajes de programación), para resolver este problema de comunicación es que se usa un
lenguaje común de bases de datos que tanto los lenguajes de programación existentes como
las bases de datos entienden, este lenguaje común de bases de datos es el SQL (structured
query languaje) o lenguaje estructurado de consultas.
La pregunta es ahora como mandamos las instrucciones sql a la base de datos, la respuesta
son los OBJETOS [Link] que estamos analizando en orden y propósito de uso.
Este objeto primero se tendrá que crear en el programa y luego se tendrá que cargar con dos
parámetros (ver ejemplo mas abajo), el primer parámetro es el proveedor o la fuente que
proporcionara los datos, los proveedores o fuentes de datos que existen son:
Es una sola string y los dos parámetros mencionados van separados por el punto y coma.
ATENCION es DATA SOURCE= no usar DATASOURCE= estan advertidos.
OBJETO COMMAND.- Este objeto puede contener directamente una instrucción SQL y
enviarla al objeto conección ya descrito.
Ya establecido el canal o enlace entre el programa aspx y la base de datos vía el objeto
CONECCION, se debe mandar la instrucción SQL a la propia base de datos, sin embargo en
un programa de vbasic por supuesto que no puede contener instrucciones de otros lenguajes
de programación como el de SQL, es por esto que se deberán usar algunos de los otros
objetos de [Link] para que estos objetos transporten la instrucción sql hacia la base de
datos (y transporte de regreso al servidor los datos de alguna tabla), uno de estos objetos es el
objeto COMMAND.
Este objeto command primero se tendrá que crear y luego cargarle dos parámetros que son:
Si esta muy grande o muy compleja la instrucción sql, es más conveniente crearla en una
variable string y poner la variable como parámetro ejemplo:
DIM q AS STRING
Sin embargo ciertas instrucciones de sql, requieren que se manden los datos a la base de
datos, respetando el tipo de dato con los cuales los creo el software de bases de datos, por
ejemplo si edad en access se declaro como NUMBER, la instrucción sql que pretenda cargar
dicho campo, tiene la obligación de mandarla con este tipo de dato asociado, instrucciones
SQL que permiten cargar o capturar ese campo edad son INSERT o UPADTE.
Para resolver este problema, usaremos en la string q, unas variables llamadas VARIABLES
PARAMETROS que se simbolizan usando el símbolo @ antes de la variable y además al
objeto COMMAND le agregamos dos instrucciones extras que permiten agregar a la string q el
dato y el tipo de dato, ejemplo, se tienen seis renglones ya capturados en nuestra tabla y se
quiere agregar un séptimo renglón con los siguientes datos, clave=7, nombre="rana"
peso=3.14 , usaremos la instrucción SQL INSERT ej:
[Link]("@CLAVE").Value = clave
[Link]("@NOMBRE").Value = nombre
[Link]("@PESO").Value = edad
Observar que para cada variable parametro(@), se tienen que cargar dos elementos, el valor y
el tipo de dato correpondiente.
Binary A stream of binary data (DBTYPE_BYTES). This maps to an Array of type Byte.
Date Date data, stored as a double (DBTYPE_DATE). The whole portion is the number of days
since December 30, 1899, while the fractional portion is a fraction of a day. This maps to
DateTime.
DBDate Date data in the format yyyymmdd (DBTYPE_DBDATE). This maps to DateTime.
DBTime Time data in the format hhmmss (DBTYPE_DBTIME). This maps to TimeSpan.
DBTimeStamp Data and time data in the format yyyymmddhhmmss
(DBTYPE_DBTIMESTAMP). This maps to DateTime.
Decimal A fixed precision and scale numeric value between -1038 -1 and 10 38 -1
(DBTYPE_DECIMAL). This maps to Decimal.
Double A floating point number within the range of -1.79E +308 through 1.79E +308
(DBTYPE_R8). This maps to Double.
Filetime A 64-bit unsigned integer representing the number of 100-nanosecond intervals since
January 1, 1601 (DBTYPE_FILETIME). This maps to DateTime.
Guid A globally unique identifier (or GUID) (DBTYPE_GUID). This maps to Guid.
LongVarBinary A long binary value (OleDbParameter only). This maps to an Array of type
Byte.
LongVarWChar A long null-terminated Unicode string value (OleDbParameter only). This maps
to String. Numeric An exact numeric value with a fixed precision and scale
(DBTYPE_NUMERIC). This maps to Decimal. PropVariant An automation PROPVARIANT
(DBTYPE_PROP_VARIANT). This maps to Object.
Single A floating point number within the range of -3.40E +38 through 3.40E +38
(DBTYPE_R4). This maps to Single.
Aun mas con el ejemplo anterior el objeto COMMAND esta construido y preparado y cargado
pero todavía no se manda desde el programa a la base de datos, es decir le falta usar las
siguientes tres propiedades, ejemplo;
[Link]("@CLAVE").Value = clave
[Link]("@NOMBRE").Value = nombre
[Link]("@PESO").Value = edad
[Link]()
[Link]()
[Link]()
DATASET:- Es una copia en memoria(de la maquina cliente) de la base de datos( y todas sus
tablas) que se encuentra en disco.
DATAADAPTER.- En principio es muy similar al objeto COMMAND es decir se usa para
transportar instrucciones SQL a la base en disco, de hechos sus formatos e instrucciones son
muy similares a los vistos para el objeto COMMAND, su diferencia principal es que
dataadapter esta mas especializado y contiene una serie de métodos que facilitan la
interacción entre el DATASET y la Base de Datos en disco.
En particular muchos de los programas que se verán en temas posteriores solo usan los
objetos CONNECTION, DATAADAPTER y DATASET.
Ejemplo:
[Link](tabla, "mitabla")
Observar que su propiedad FILL carga el DATASET(tabla) con una de las tablas en disco,
recordar que en la base de datos puede contener muchas tablas.
Además esa propiedad FILL es equivalente a las tres ultimas instrucciones del objeto
COMMAND, es decir open, executenonquery y close, mas facil verdad.
DATAREADER y DATASET:
Observar que también se usan en forma conjunta, primero es muy similar en uso y función que
el objeto DATAADAPATER, la diferencia entre datareader y dataadapter es el tipo de base de
datos con las cuales se pueden comunicar, dataadpater se especializan en bases de datos
relacionales y datareader se especializa en archivos que no se estudian en este curso.
EN general se han visto de manera sencilla los principales objetos [Link]( connection,
command, datareader, dataadapter, dataset), sin embargo la tabla o las tablas y la base de
datos que se tiene en disco o sirviéndola algún servidor de bases de datos, se ha quedado en
la memoria de la maquina del cliente, [Link] ha terminado su trabajo y su función.
Para mandar el dataset a el browser se tendrá que pasar a algún tipo de objeto visible que
soporte el browser, los objetos que se pueden usar para mandar el dataset a pantalla son:
Existen una serie de operaciones y procesos que son muy comunes contra una tabla en una
base de datos en disco la mas común es desplegar todos los renglones de la tabla que estan
almacenados en disco, a este proceso le llamaremos SELECCION, consulta o despliegue (muy
original).
Como se indico anteriormente la comunicación con la base de datos se tendrán que dar
usando el lenguaje especializado de bases de datos llamado SQL (structured query language),
la instrucción sql que se usa para resolver este problema tiene el siguiente formato:
El procedimiento que se intenta seguir cuando se construya un programa [Link] que tenga
que manipular una tabla en disco deberá seguir los siguientes pasos:
3.- Crear el enlace o adapater y cargarlo con la instrucción sql (o cargar primero la instrucción
sql en un objeto command y mandarlo a través del adapter)
6.- Procesar el datagrid (editar un renglón, agregar un renglón, modificar un renglón, etc.)
Código [Link]
<FORM RUNAT=SERVER>
Width=400
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
EnableViewState=false
/></FORM>
<html>
<script runat=server>
[Link](tabla, "mitabla")
[Link] = tabla
[Link] = "mitabla"
[Link]()
[Link]()
END SUB
</script>
corrida [Link]
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
3.- Se usa una PAGINA (page) y su evento pageload() para desplegar la tabla(mitabla) que
esta en la base de datos(mibase), se puede cargar e inicializar usando un objeto
button=desplegar con este mismo código cargado en su evento onclick, pero es criterio de
ustedes como se despliega la tabla.
4.- Recordar que DATAGRID es un WEBCONTROL por tanto hay que crearlo e inicializarlo al
principio del programa, también recordar que datagrid tiene muchas propiedades que le
mejoran la interfase con que se despliega y es en esta parte donde se cargan dichas
propiedades.
5.- Se empieza creando las variables globales a ocupar y abriendo la conección a la base de
datos, si se les hace muy grande la string del proveedor, pueden cargarla primero en una
variable string y carguen la string en el constructor de la conección, pero esto es opcional.
7.- Se crea el adapter y se carga el constructor con la instrucción sql y la conexión, aquí es
necesario entender que existen varias maneras de hacer esto:
Cargar una string con el sql y crear y usar un objeto command directamente por ejemplo
comandtext=stringsql; y luego todavía se tendría que ejecutar con executenonquery(que
ejecuta una string que no regresa datos por ejemplo insert o update para un adpater) o
executereader(si en lugar de usar adapter se usa un reader) o executescalar( método que
regresa un solo dato de la base de datos).
Pero lo mas sencillo fue usar el método que se puso en el programa, es decir crear el adapter y
pasarle directamente la instrucción sql.
8.- Luego se creo el dataset y se cargo con toda la base de datos en disco, entender esto bien,
dataset puede quedar cargado con todas las tablas que tenga la base de datos, por eso se usa
un FILL para pasar al dataset solo una de las tablas(mi tabla), esto da origen a dos notas:
8.1.- Al programar mas adelante se ocupara explícitamente indicarle al compilador con cual
tabla se va a trabajar, es por esta razón que se verán instrucciones tales como
[Link]["clientes"].[Link]. Aquí se esta diciendo al compilador que del dataset(TABLA) se
va a realizar una proceso con la tabla de clientes.
8.2.- Para procesar dos o mas tablas, entonces se tendra que usar mucho el formato que se
vio en la nota 8.1
9.- Al final se carga el datagrid , se pega( binding ) al dataset y se cierra la base de datos.
Insertar o agregar registros o renglones nuevos a una tabla en disco, es un proceso sencillo
que usa la siguiente instrucción sql:
[Link]
<FORM RUNAT=SERVER>
Width=400
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
EnableViewState=false/>
</FORM>
<script runat=server>
[Link](tabla, "mitabla")
[Link] = tabla
[Link] = "mitabla"
[Link]()
cren = [Link]("mitabla").[Link]
nvaclave = [Link]("mitabla").Rows(cren-1)(0) + 1
[Link]=nvaclave
END SUB
DIM q AS STRING
[Link]("@CLAVE").Value = [Link]
[Link]("@NOMBRE").Value = [Link]
[Link]("@EDAD").Value = [Link]
[Link]()
[Link]()
[Link]()
[Link](tabla, "mitabla")
[Link]=[Link]("mitabla").DefaultView
[Link]()
' cargando otra vez la caja de CLAVE y limpiando las otras cajas
cren = [Link]("mitabla").[Link]
nvaclave =[Link]("mitabla").Rows(cren-1)(0)+ 1
[Link]=nvaclave
[Link]=""
[Link]=""
[Link]()
END SUB
</script>
corrida [Link]
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Notas:
Se agregaron tres textboxs arriba del datagrid para capturar los nuevos datos a insertar en la
tabla.
En page_Load es el mismo código del programa anterior solo al final se usa el método
[Link] de [Link][recuerdan la nota 8 del tema anterior] para conocer cuantos
renglones tiene la tabla.
Con esta información ya se puede leer la primera columna ( la cero 0 desde luego) para sacar
el dato de la ultima clave.
El método devolvió el valor de la última clave que esta en el último renglón de la tabla, pero en
string.
En función INSERTAR(), se crea la string q, con el formato apropiado sql( como se dijo al
principio de este tema), observar que existen tres variables que llevan un @ antes, estas
variables se llaman VARIABLES PARAMETROS, y se cargan con el objeto
[Link]().
Otra vez, en este ejemplo para mandar la instrucción sql a la base de datos, se crea y se usa
un objeto command (llamado orden) que lleva como datos la string q y la conexión, pero se
agregan tres métodos [Link] ([Link]()), en estos métodos se cargan
las variables parámetro primero con el valor de dato del textbox asp y luego se transforman al
tipo de dato apropiado usando los oledbtype(que hay que estudiar porque se tienen que asociar
directamente a los tipos de datos que se usaron en access).
Ya con el objeto COMMAND(orden) listo y cargado para comunicar la instrucción sql a la base
de datos, se abre la conexión a la base de datos se manda el executenonquery(no se quiere
regresar nada en esta parte, recordar la nota respectiva que se dio en un tema anterior) y se
cierra la conexión y se mando el nuevo renglón a la base de datos en disco.
Al final de esta función INSERTAR como ya se hizo un cambio en la base de datos, se tiene
que volver a recargar el dataset con la nueva información(es el mismo código que se tiene en
page_load) mas tantito código para limpiar y cargar los textboxs.
La solución es sencilla, solo usar otra vez la instrucción sql select con el siguiente formato:
Código [Link]
<FORM RUNAT=SERVER>
Width=400
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
EnableViewState=false
/></FORM>
<script runat=server>
DIM q AS STRING
[Link](new OleDbParameter("@CLAVE",
[Link]))
[Link]("@CLAVE").Value = [Link]
[Link](tabla, "mitabla")
[Link] = tabla
[Link] = "mitabla"
[Link]()
[Link]()
END SUB
</script>
Notas:
No hay nada nuevo es una combinación de los dos programas anteriores con las mismas
notas, solo se usa un textbox asp para pedir la clave, aunque se puede usar cualquier campo
para buscar.
Corrida [Link]
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Por ejemplo todos los estudiantes que sean mayores de 17 años, todos los clientes que sean
de Tijuana, etc., a esto le llamamos filtros o condiciones.
También se resuelve de manera similar al anterior, es decir usando la instrucción select etc.,
from tabla, where CONDICION;
Código [Link]
<FORM RUNAT=SERVER>
Width=400
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
EnableViewState=false
/></FORM>
<script runat=server>
DIM q AS STRING
[Link]("@EDAD").Value = [Link]
[Link](tabla, "mitabla")
[Link] = tabla
[Link] = "mitabla"
[Link]()
' cerrando conneccion recordar que FILL NO OCUPA CERRAR
[Link]()
END SUB
</script>
Nota: siguen siendo combinaciones de los programas anteriores pero seria prudente mejor usar
dos combobox uno para la variable, otro para el operador relacional y un text para el dato y
mandar estos tres datos al [Link] (se ocupan varios [Link]()), pero eso
queda de tarea.
Recordar también que bases de datos en microsoft net es solamente SQL SQL SQL y se han
usado tres versiones de select, por ejemplo si se usa en un programa:
[ ] = optional
Corrida [Link]
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Este es también un caso común con elementos de una tabla, sin embargo es también fácil de
resolver.
1.- Recordar que el numero de columna en una tabla empieza en 0, esto es que para realizar
alguna operación por ejemplo la columna edad del ejemplo que estamos siguiendo, su numero
de columna es la 2.
2.- La operación que se plantee se puede realizar con todos los renglones de la tabla o con un
solo renglón de la tabla(del dataset), para procesar todos los renglones se usa un ciclo for, si
solo se quiere procesar un solo renglón o una celda o columna nada mas, solo recordar GET-
SET y solo usar un [Link](r)(c) con los métodos strings apropiados.
3.- Para realizar aritmética con toda una columna, solo usar el GET-SET de
[Link](ren)(col) para leer(get)o cargar(set), en leer recordar que saldra una string y
en cargar recordar que se tendrá que cargar también una string, otra vez;
5.- En el ejemplo se realiza la operación con todos los renglones de la tabla y no olvidar que
se tiene que usar la instrucción sql Update para que la nueva información se actualice en
disco, recordar que los cambios que se hacen a la tabla, es realmente al dataset, que a su vez
es una tabla o base de datos en la memoria de la maquina del cliente o usuario, y estos
cambios hay que actualizarlos o pasarlos o UPDATE a la base de datos en disco.
[Link]
<FORM RUNAT=SERVER>
Width=400
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
EnableViewState=false
/></FORM>
<script runat=server>
[Link](tabla, "mitabla")
[Link] = tabla
[Link] = "mitabla"
[Link]()
[Link]()
END SUB
DIM q AS STRING
cren = [Link]("mitabla").[Link]
FOR r = 0 TO cren-1
nvaclave =[Link]("mitabla").Rows(r)(0)
temp =[Link]("mitabla").Rows(r)(2)
'sumando 50 a la edad(temp)
temp = temp + 50
[Link]("mitabla").Rows(r)(2)= temp
[Link]()
[Link]()
[Link]()
NEXT R
'refrescando el datagrid
[Link] = tabla
[Link]= "mitabla"
[Link]()
END SUB
</script>
Corrida [Link]
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Eliminación es otro proceso simple y común con las bases de datos el modelo con [Link]
que estamos usando hace este tipo de operaciones muy fáciles:
[Link]
<FORM RUNAT=SERVER>
Width=400
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
EnableViewState=false />
</FORM>
<script runat=server>
[Link] = tabla
[Link] = "mitabla"
[Link]()
END SUB
DIM q AS STRING
[Link]("@CLAVE").Value = [Link]
[Link]()
[Link]()
[Link]()
[Link](tabla, "mitabla")
[Link]=[Link]("mitabla").DefaultView
[Link]()
[Link]=""
END SUB
</script>
corrida [Link]
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Editar registros significa cambiar el contenido de algunos de los campos o columnas por nueva
información o para corregir algún error de captura original o para agregar alguna columna que
no existía por modificación de la tabla o la base de datos.
En general se tiene otro problema de sql UPDATE, sin embargo ahora se aprovechan algunos
elementos nuevos del objeto datagrid, como son la capacidad que tiene de crearle columnas de
edición a los renglones que muestra el dataset, estas columnas de edición traen sus propios
métodos, mismos que se pueden cargar con código para procesar.
[Link]
<HTML>
DespTabla()
end if
END SUB
SUB DespTabla()
[Link](tabla, "mitabla")
[Link]=tabla
[Link]="mitabla"
[Link]()
END SUB
[Link] = [Link]
DespTabla()
END SUB
[Link] = -1
DespTabla()
END SUB
DIM q AS STRING
q = "UPDATE mitabla SET clave= @CLAVE, nombre= @NOMBRE, edad = @EDAD where
clave= @CLAVE"
[Link]("@CLAVE").Value = [Link]([Link])
DIM i AS Integer
FOR i=1 to 3
datocajas = [Link]
[Link](nomcajas(i-1)).Value = [Link](datocajas)
NEXT i
[Link]()
[Link]()
[Link] = -1
[Link]()
DespTabla()
END SUB
</script>
<form runat="server">
Width="400"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
OnEditCommand="DataGrid_Edit"
OnCancelCommand="DataGrid_Cancel"
OnUpdateCommand="DataGrid_Update"
DataKeyField="clave"
>
<Columns>
</Columns>
</ASP:DataGrid>
</form>
</body>
</html>
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Observar que ahora el datagrid incluye una columna de edición especial, revisar la parte del
código de propiedades del datagrid en el programa y las nuevas propiedades que se le
agregaron.
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Observar que la columna de edición del renglón seleccionado (clic en edit de cualquier renglón)
ahora tiene dos opciones (update y cancel) y el renglón de edición se convirtió en puros textbox
(ya se modificaron algunos valores), update y cancel tienen su propio código en el programa,
revisarlo y usando opción update se tiene ahora;
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Un registro editado o modificado en visual basic net , analizar con cuidado el codigo del
programa, que esta documentado, suerte
GRAFICOS SQL SELECT
Para manejar este elemento con ado asp net existen dos maneras:
1.- Agregar un campo BLOB a la tabla en microsoft access y usar componentes asp net
especializados en imágenes tanto para subirlas como para desplegar la imagen.
Este método provoca que la base de datos crezca mucho recordar que una imagen aun de tipo
jpg ocupa mucho espacio.
2.- El segundo método es mas sencillo, primero subir las imágenes ( de preferencia jpg ) con
un ftp normal a tusitio y después agregar un objeto asp net imageurl en el programa y además
agregar un campo de texto llamado fotourl o foto a la tabla en microsoft access y grabar la
dirección http de la imagen en este campo, por ejemplo
[Link] aunque si estan juntos el aspx y el jpg se puede
usar solo [Link] directamente.
Después solo cargar este objeto asp net imageurl en la pagina que se construirá que no es otra
cosa que el programa de búsqueda con el despliegue del campo extra, como lo muestra el
programa ejemplo.
[Link]
<FORM RUNAT=SERVER>
Width=400
BackColor=#ccccff
BorderColor=black
ShowFooter=false
CellPadding=3
CellSpacing=0
Font-Name=Verdana
Font-Size=8pt
HeaderStyle-BackColor=#aaaadd
EnableViewState=false
/>
</FORM>
<html>
<script runat=server>
DIM q AS String
[Link](new OleDbParameter("@CLAVE",
[Link]))
[Link]("@CLAVE").Value = [Link]
[Link](tabla, "mitabla")
[Link]=tabla
[Link]="mitabla"
[Link]()
[Link]=[Link]("mitabla").Rows(0)(3).ToString()
END SUB
</script>
</html>
corrida: [Link]
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Recordar que para que no salga el campo fotourl en el datagrid el select de sql puede pedirse
como select campo1, campo2, campo.. from mitabla etcétera.