Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ado a ADO.NET

12 views
Skip to first unread message

Renee

unread,
Feb 15, 2008, 2:26:35 PM2/15/08
to
Hola,

PREGUNTA 1
por años he trabajado con ADO y visual basic. Adopte ciertos habitos de
programación que me han dado resultado pero ahora debo aprender una nueva
forma, acorde con ADO.NET.
Cuando ejecuto una rutina para buscar un registro solia ser:

Sub Valida()
dim rs as adodb.recordset
set rs=cnn.execute("select * from tabla where clave = " & txtClave)
if not (rs.eof or rs.bof) then
msgbox "Clave existente."
else
msgbox "Clave inexistente."
rs.close
End Sub

Como verán es un código compacto y sensillo. El dilema para mi ahora es como
hacerlo con ADO.NET. En una primer aproximación hice lo siguente

Function Valida()
dim oCommand As OleDb.OleDbCommand
dim oDataReader As OleDb.OleDbDataReader
oCommand = New OleDb.OleDbCommand
oCommand.Connection = cnnArchivos
oCommand.CommandText = "SELECT * FROM LEGAJOS WHERE LEGAJO = " & txtClave
oDataReader = oCommand.ExecuteReader
If oDataReader.HasRows Then
msgbox "Clave existente"
else
msgbox "Clave inexistente"
endif
end sub

Pero no es esto más complejo que el viejo ADO?
Antes declaraba un objeto connection "cnn" como global para toda la
aplicación, y luego un recordset "rs" local para ejecutar una simple
insrucción:


set rs=cnn.execute("select * from tabla where clave = " & txtClave)

pero ahora ya no ento esta posibilidad, y en su lugar debo declarar un
OleDbCommnad y otro OleDbDataReader!!!

Quiero saber cual es la forma óptima de implementar esta rutina en Visual
Basic 2005 EXPRESS.


PREGUNTA 2
Además quisiera saber si debo habrir un objeto connection de ADO.NET
cada vez que necesito tener acceso a un registro, o bien puedo declarar y
abrir un objeto connection GLOBAL para toda la aplicación y luego invocarlo
cada vez que lo necesito.

PREGUNTA 3

Hay una forma de acceder a un conjunto de registros en una sola instrucción
y sin necesidad de declarar tantos objetos y especificar tantos parámetros?


Bueno, espero haber sido claro con mi inquietud y que alguien pueda ayudar.

Gracias.

Reneé.vcf

Ramón Hernández

unread,
Feb 15, 2008, 1:57:22 PM2/15/08
to
Hola.

> PREGUNTA 1

> Pero no es esto más complejo que el viejo ADO?
> Antes declaraba un objeto connection "cnn" como global para toda la
> aplicación, y luego un recordset "rs" local para ejecutar una simple
> insrucción:

Bueno, todo depende de la forma y el uso que quieras darle, si lo unico que
necesitas es saber si existe o no el registro y quieres un codigo compacto
entonces yo te diria que lo hicieras asi:

Sub Valida()
If cnn.CreateCommand.ExecuteScalar("Select 'X' From Tabla Where Clave " &
txtClave & "").Length = 1 Then
msgbox("Existe el registro")
Else
msgbox("No existe el registro")
Endif
End Sub

Digamos que la forma y la complejidad del codigo esta en cada programador.


> PREGUNTA 2

> Además quisiera saber si debo habrir un objeto connection de ADO.NET
> cada vez que necesito tener acceso a un registro, o bien puedo declarar y
> abrir un objeto connection GLOBAL para toda la aplicación y luego
> invocarlo cada vez que lo necesito.

Puedes declarar una variable Global para la conexion, solo que deberias
tener cuidado cuando manejes transacciones (al tener una sola conexion todo
lo que se ejecute con esa conexion debera estar dentro de la transaccion).

>
> PREGUNTA 3
>
> Hay una forma de acceder a un conjunto de registros en una sola
> instrucción y sin necesidad de declarar tantos objetos y especificar
> tantos parámetros?
>

Nuevamente, todo depende, yo te recomendaria que crearas una clase con todos
sus metodos Shared, donde tengas un metodo ObtenerDataSet, ObtenerScalar,
ObtenerDataRow, ObtenerDataReader, EjecutarQuery, y tantos como necesites.

Esto te ahorrara BASTANTE tiempo en la escritura del codigo.

Saludos.
Ramón Hernández.


SoftJaén

unread,
Feb 16, 2008, 6:06:19 AM2/16/08
to
"Renee" preguntó:

> PREGUNTA 1


> El dilema para mi ahora es como hacerlo con ADO.NET. En una primer
> aproximación hice lo siguente
>
> Function Valida()
> dim oCommand As OleDb.OleDbCommand
> dim oDataReader As OleDb.OleDbDataReader
> oCommand = New OleDb.OleDbCommand
> oCommand.Connection = cnnArchivos
> oCommand.CommandText = "SELECT * FROM LEGAJOS WHERE LEGAJO = " & txtClave
> oDataReader = oCommand.ExecuteReader
> If oDataReader.HasRows Then
> msgbox "Clave existente"
> else
> msgbox "Clave inexistente"
> endif
> end sub
>
> Pero no es esto más complejo que el viejo ADO?
>

> Quiero saber cual es la forma óptima de implementar esta rutina en Visual
> Basic 2005 EXPRESS.

Si utilizas un objeto DataReader lo estás haciendo más complejo que lo que
en realidad es, porque para averiguar si existe una clave, simplemente
tienes que ejecutar el método «ExecuteScalar» de un objeto Command. Por
supuesto, aparte de configurar el objeto Command, tendrás que configurar
también un objeto Connection para ejecutar el comando.

Si en tu proyecto tienes declarado a nivel global un objeto OleDbConnection
(«cnn» en el ejemplo), tu función «Valida», más o menos podría ser la
siguiente:

Private Function Valida(ByVal clave As String) As Boolean

' Creamos un comando
'
Dim cmd As OleDbCommand = cnn.CreateCommand

' Indicamos la consulta SQL que deseamos ejecutar.
' Se entiende que el campo LEGAJO es alfanumérico.
'
cmd.CommandText = _
"SELECT * FROM LEGAJOS WHERE LEGAJO='" & clave & "'"

' Guardamos el estado de la conexión.
'
Dim state As ConnectionState = cnn.State

Try
' Si la conexión está cerrada, la abrimos
'
If state <> ConnectionState.Open Then cnn.Open()

' Ejecutamos la consulta
'
Dim o As Object = cmd.ExecuteScalar

If o IsNot Nothing Then
' Registro existente
Return True
Else
' Registro inexistente
Return False
End If

Catch ex As Exception
' Se ha producido una excepción
Return False

Finally
' Cerramos la conexión si procede
'
If state = ConnectionState.Closed Then cnn.Close()

End Try

End Function

Como podrás observar, aunque parezca más complicado, no lo es, porque no es
necesario cargar ningún tipo de Recordset ni nada que se le parezca.

Ya que la función devuelve un valor Boolean, la llamarías de la siguiente
manera:

Dim bln As Boolen = Valida(txtClave.Text)

If bln Then
MessageBox.Show ("Registro existente")
Else
MessageBox.Show ("Registro inexistente")
End If

>
> PREGUNTA 2
> Además quisiera saber si debo habrir un objeto connection de ADO.NET
> cada vez que necesito tener acceso a un registro, o bien puedo declarar y
> abrir un objeto connection GLOBAL para toda la aplicación y luego
> invocarlo cada vez que lo necesito.

Si trabajas con un objeto DataReader, tienes que tener una conexión abierta
para leer los registros, porque estás utilizando el «modo conectado» de ADO
.NET.

Por supuesto que puedes utilizar un objeto Connection a nivel global, pero
procura tenerlo abierto el tiempo necesario que dure la ejecución de un
comando, por lo tanto, deberás de cerrarlo cuando termines de ejecutar un
comando o termines de leer registros.

> PREGUNTA 3
>
> Hay una forma de acceder a un conjunto de registros en una sola
> instrucción y sin necesidad de declarar tantos objetos y especificar
> tantos parámetros?

No sé lo que entiendes por «declarar tantos objetos y especificar tantos
parámetros», porque en Visual Basic clásico también hay que especificar al
menos dos objetos (Connection y Recordset), y parámetros todos aquellos que
sean necesarios.

Si te refieres a simular en .NET el objeto Recordset de ADO clásico,
entonces deberás trabajar con los objetos que conforman el «modo
desconectado» de ADO .NET, es decir, con el objeto DataSet que viene a ser
una pequeña base de datos residente en memoria.

Imagina que deseas mostrar todos los datos de tu tabla LEGAJOS en un control
DataGridView. Para ello, una vez que tengas declarada y configurada una
variable OleDbConnection («cnn» en el ejemplo), ejecutarías lo siguiente:

' Indicamos la consulta SQL de selección
'
Dim sql As String = "SELECT * FROM LEGAJOS"

' Creamos un objeto DataAdapter, que es aquel que
' hace de puente entre nuestra aplicación y la base de datos
'
Dim da As OleDbDataAdapter = New OleDbDataAdapter(sql, cnn)

' Creamos el objeto DataSet.
'
Dim ds As DataSet = New DataSet

' Rellenamos un objeto DataTable llamado Legajos
'
da.Fill(ds, "Legajos")

' Referenciamos el objeto DataTable creado.
'
Dim dt As DataTable = ds.Tables("Legajos")

' Se lo asignamos al objeto DataGridView
'
Me.DataGridView1.DataSource = dt

Como te he indicado anteriormente, el objeto DataSet es como si fuera una
base de datos residente en memoria, teniendo sus corespondientes tablas (los
objetos DataTable) y relaciones; como si fuera una base de datos relacional.
Eso no se podía hacer con el objeto Recordset de ADO clásico.

Tampoco al control DataGridView no es necesario asignarle un objeto
DataTable, porque le puedes asignar el objeto DataSet de la siguiente
manera:

With Me.DataGridView1
.DataSource = ds
.DataMember = "Legajos"
End With

En fin, espero que a partir de ahora no veas tan compleja la programación
con ADO .NET.

Un saludo

--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.

Alberto Poblacion

unread,
Feb 16, 2008, 6:47:13 AM2/16/08
to
"Renee" <si...@ceel.com.ar> wrote in message
news:%238M0yBA...@TK2MSFTNGP04.phx.gbl...

> set rs=cnn.execute("select * from tabla where clave = " & txtClave)

Aparte de lo que ya te han contestado, quiero hacer un comentario en
cuanto a este estilo de consulta. Esta Select tiene un serio problema, tanto
en ADO clásico como en ADO.NET, que se denomina "Inyección de SQL".
Imagínate que en el txtClave el usuario teclea un fragmento de SQL. Ese
texto se concatena con tu select, y el resultado total se envía al servidor
de base de datos. Éste ejecuta la sentencia, con lo cual el usuario puede
hacer de todo (dentro de lo que permitan sus permisos de acceso a la BD) a
través de ese proceso, que en teoría solo hacía un "select": borrar tablas y
registros, insertar y modificar registros, etc.
Se evita parametrizando la sentencia. En la versión .Net sería asi (por
ejemplo):

Dim cn as New OleDbConnection(,,,)
Dim cmd as New OleDbCommand("select count(*) from tabla where clave=?", cn)
cmd.Parameters.Add("clave",OleDbType.VarChar,10).Vaue=txtClave.Text
cn.Open()
Dim N as Integer = cmd.ExecuteScalar()
cn.Close()
'N trae el número de registros encontrados


Xavi_Q

unread,
Feb 17, 2008, 10:25:47 AM2/17/08
to
Con todos los respetos: Al margen de aprender informatica.
!Ccreo que deberias cuidar tu ortografia!

> begin 666 Reneé.vcf
> M0D5'24XZ5D-!4D0-"E9%4E-)3TXZ,BXQ#0I..D9E<G)E:7)A.U)E;F7I.SM)
> M;F<N#0I&3CI296YEZ0T*55),.TA/344Z:'1T<#HO+W=W=RYR96YE969E<G)E
> M:7)A+F-O;2YA<@T*55),.U=/4DLZ:'1T<#HO+W=W=RYR96YE969E<G)E:7)A
> J+F-O;2YA<@T*4D56.C(P,#@P,C$U5#$Y,C8S-5H-"D5.1#I60T%21 T*
> `
> end

Renee

unread,
Feb 17, 2008, 1:50:43 PM2/17/08
to
Claro, siempre quiero aprender algo nuevo. Me encantaría que me señalaras
los errores. He analizado el texto y encotre que se escribe "sencillo" y NO
"sensillo". Soy tan limitado en mi ortografía que no me da para descubrir
otros errores. Lo que sí debo pedir disculpas es en la redacción, pues
tantos años hablando con la computadora me atrofió la facultad del habla.

Saludos


"Xavi_Q" <Xav...@hotmail.com> escribió en el mensaje
news:0484c789-1062-4971...@q78g2000hsh.googlegroups.com...

Alberto Poblacion

unread,
Feb 18, 2008, 1:57:04 AM2/18/08
to
"Renee" <si...@ceel.com.ar> wrote in message
news:u9tnG3Yc...@TK2MSFTNGP03.phx.gbl...

> Claro, siempre quiero aprender algo nuevo. Me encantaría que me señalaras
> los errores. He analizado el texto y encotre que se escribe "sencillo" y
> NO "sensillo". Soy tan limitado en mi ortografía que no me da para
> descubrir otros errores. Lo que sí debo pedir disculpas es en la
> redacción, pues tantos años hablando con la computadora me atrofió la
> facultad del habla.

No te preocupes demasiado por tu ortografía. He revisado tu mensaje y,
en comparación con otras cosas que se ven por estos foros, es de lo
mejorcito que hay. No comprendo la crítica de Xavi_Q: puestos a quejarse de
la ortografía, hay muchos otros mensajes infinítamente peor escritos que el
tuyo. Aparte de lo de "sensillo", y algún que otro acento, no encuentro
ningún error serio en todo el texto.

SoftJaén

unread,
Feb 18, 2008, 5:06:52 AM2/18/08
to
"Alberto Poblacion" escribió:

>
> No te preocupes demasiado por tu ortografía. He revisado tu mensaje y,
> en comparación con otras cosas que se ven por estos foros, es de lo
> mejorcito que hay. No comprendo la crítica de Xavi_Q: puestos a quejarse
> de la ortografía, hay muchos otros mensajes infinítamente peor escritos
> que el tuyo. Aparte de lo de "sensillo", y algún que otro acento, no
> encuentro ningún error serio en todo el texto.

Hola, Alberto:

>
> PREGUNTA 2
> Además quisiera saber si debo habrir un objeto connection de ADO.NET

Pero, ¡vamos! Con el tiempo que llevo ya leyendo mensajes, lo de Renee
tampoco es para alamarse, porque entiendo que ese «habrir con h» ha sido un
lapsus, ya que después, ha vuelto a escribir el mismo verbo correctamente y
en el mismo párrafo.

Lluis Franco

unread,
Feb 18, 2008, 5:12:19 AM2/18/08
to
:-)
¡Al menos no escribe como un SMS!
--

Lluís Franco i Montanyés
[MS-MVP-MCP Visual Basic]
--
NUG: http://andorradotnet.com
Web: http://sps.uyssoft.com
Blog: http://msmvps.com/blogs/lfranco
Geeks: http://geeks.ms/blogs/lfranco
--
(Guía de netiquette de los foros)
http://sps.uyssoft.com/Foros%20online/Netiquette.aspx
FIMARGE, S.A.
Principat d'Andorra
lfranco@ODIO_EL_SPAMfimarge.ad
Tel.: +376 805 100
Fax: +376 824 500
--
Mi Perfil MVP en:
https://mvp.support.microsoft.com/profile/Lluis
--
This posting is provided "AS IS" with no warranties, and confers no rights.
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho.

0 new messages