Visual Basic - Buscar cadena en una base de datos

Life is soft - evento anual de software empresarial
 
Vista:

Buscar cadena en una base de datos

Publicado por Carlos (55 intervenciones) el 06/07/2003 16:37:59
Hola,
¿sabe alguien como crear una búsqueda de una cadena introducida por el usuario en toda la base de datos?

Quiero decir que si introduce en cuadro de texto, y nada más, las letras "gar" (por ejemplo), encuentre todas las ocurrencias de esa cadena en cualquier campo de cualquier tabla . Es decir, sin que el usuario especifique tablas, el programa muestre todos los resultados de la base de datos. Por ejemplo, que encuentre todos los Garcías de la tabla cliente y campo nombre, todo lo que tenga "gar' en la tabla pedidos y campos descripción y proveedor.

He buscado muchas páginas, pero no encuentro nada adecuado.
Agradecería que alguien me indicase una forma o un enlace a una página, aunque se en inglés, que tenga código de ejemplo o explicaciones acerda de eso.

Muchas gracias y un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Buscar cadena en una base de datos

Publicado por Cecilia Colalongo (3116 intervenciones) el 06/07/2003 17:56:06
Puedes utilizar ADOX para recorrer todas las tablas y a su vez todos los campos y buscar la cadena con LIKE en aquellos campos que soporte ese tipo de búsqueda. Fijate con esto:

Dim objCatalog As Catalog, objTable As Table, objColumn As Column
Dim objCmd As Command, objRst As Recordset

Set objCatalog = New Catalog
Set objCatalog.ActiveConnection = TuObjectoConnection

Set objCmd = New Command
Set objCmd.ActiveConnection = TuObjetoConnection

For Each objTable In objCatalog.Tables
objCmd.CommandText = "SELECT * FROM " & objTable.Name & " WHERE "
For Each objColumn In objTable.Columns
objCmd.CommandText = objCmd.CommandText & objColumn.Name & " LIKE '" & CadenaDelUsuario & "' OR "
Next
'Quitar el último OR del CommandText
Set objRst = objCmd.Execute

'Evaluar el recordset
Next
Next
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Gracias. Otra preguntita :¬)

Publicado por Carlos (55 intervenciones) el 07/07/2003 00:12:07
Hola,
creo que me va a servir, y mucho, ese código.
No había caído en eso, la verdad es que no me sonaban muchos de los tipos de datos que has utilizado pero ya voy leyendo algo sobre ellos.

Una última pregunta... ¿Qué es eso del OR del CommandText?

Gracias de nuevo y un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gracias. Otra preguntita :¬)

Publicado por Cecilia Colalongo (3116 intervenciones) el 07/07/2003 01:30:52
Supongo que te referirás al modelo de ADOX, el último OR se refiere a cuando concatenás la cadena del Command, esto es NombreCampo LIKE '%CadenaUsuario%' OR que luego de recorrer todos los campos queda un OR perdido de la forma que está armado. Sería más o menos así:

objCommand.CommandText = Left(objCommand.Command.Text,Len(objCommand.CommandText)-Len(" OR"))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Y otra pregunta...

Publicado por Carlos (55 intervenciones) el 07/07/2003 03:31:03
La verdad es que me he perdido.

Primero, que los objetos Catalog y Command no me lo reconoce. ¿He de poner alguna otra referencia aparte de la de la librería DAO 3.6..?

Yo tengo una base de datos abierta como: Dim gBD as ADO.Database.
Y se me ha ocurrido esto:
Set objCatalog.ActiveConnection = gBD.Connection
...
No funciona, perfecto. Me da el error: 3251
"Operación no válida para este tipo de objeto"

¿No se puede hacer esta búsqueda con objetos recordset y database normales, sin catalogs o commands....? La base de datos es muy modesta, de andar por casa, en el mismo ordenador que la aplicación...

Gracias, de nuevo
Y un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Y otra pregunta...

Publicado por Cecilia Colalongo (3116 intervenciones) el 07/07/2003 03:33:16
Es con ADOX ni con DAO que está armado, por lo que tendrías que utilizar ADO y ADOX para que el ejemplo te funcione, si no quieres utilizar esos objetos de ADOX tendrías que utilizar OpenSchema de ADO para obtener la lista de tablas y campos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Muchas gracias

Publicado por Carlos (55 intervenciones) el 07/07/2003 12:17:40
He ido cambiando todo el proyecto a ADOX. Parece que todo funciona bien.
Lo único que falla es que en un Set rsConsulta = objCommand.Execute me dice que no tengo permiso para READ en 'MSysACEs'. ¿Eso qué es?

He añadido al proyecto las referncias a la librerías ADO y ADOX 2.5.

Un saludo y gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Muchas gracias

Publicado por Cecilia Colalongo (3116 intervenciones) el 07/07/2003 12:26:49
Revisa el string de conexión y lo que queda en la propiedad CommandText del objeto Command, seguramente habrá algún error de sintaxis ahí.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado, por fin. Gracias

Publicado por Carlos (55 intervenciones) el 07/07/2003 15:32:52
Ya está solucionado.
El problema era que objCatalogo.Tables contenía otras tablas aparte de las mías como MSysAccessObjects, MSysACEs, MSysRelationships, ...
Así que lo que he hecho es poner una condición justo al empezar el bucle:
If Left(objTabla.Name, 4) <> "MSys" Then ....
Así evita esas tablas.

GRACIAS por la ayuda.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado, por fin. Gracias

Publicado por Cecilia Colalongo (3116 intervenciones) el 07/07/2003 16:42:27
Si revisas la propiedad Type del objeto Table te devuelve: "TABLE", "SYSTEM TABLE" o "GLOBAL TEMPORARY" por ahí deberías filtrar y no por el nombre, eso solo sirve para Access y la versión particular que estás corriendo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Perfecto

Publicado por Carlos (55 intervenciones) el 07/07/2003 18:30:28
Pues creo que ya está.
Gracias (¿lo había dicho ya?) por todo.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar