Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Usar sentencia SQL o método de la clase Result
#1

Buenas!.

Revisando una antigua base de datos que me sirvió para las que estoy liado ahora, encontré que podía hacer la consulta de inserción tanto con la sentencia
SQL como un método de la clase Result.

GAMBAS
  1.  'Si lo hacemos con SQL podemos hacer:
  2.     'Try hConn.Exec("insert into datos values (&1,&2,&3,&4,&5,&6)", Null, TxtTitulo.Text, TxtAutor.Text, CDate(TxtFecha.Text), CFloat(TxtPrecio.Text), TxtDecripcion.Text)
  3.  
  4.     'Si lo hacemos usando los métodos de la clase result.
  5.     HResul = hConn.Create("datos")
  6.     HResul["id"] = Null
  7.     HResul["titulo"] = TxtTitulo.Text
  8.     HResul["autor"] = TxtAutor.Text
  9.     HResul["fecha"] = TxtFecha.Value
  10.     HResul["precio"] = TxtPrecio.Text
  11.     HResul["descripcion"] = TxtDecripcion.Text
  12.     HResul.Update()
  13.     hConn.Commit()



Uso más SQL ya que es propio del lenguaje y no de un lenguaje de programación concreto.
Imaginar que creo la base de datos para Gambas y ahora hago lo mismo para Python y luego para Java, etc, etc.
Entonces cada lenguaje puede tener una clase que ( como veis parece que se acorta más con la sentencia SQL). ¿ No es mejor algo más universal ?.

En el caso de usar Result en Gambas, lo más probable es que esto lo haga independiente del gestor de base de datos. Puede ser el motivo de su uso.

Saludos

"El buen perfume en frasco pequeño se vende"
    ¡Gracias!
#2

Cita:En el caso de usar Result en Gambas, lo más probable es que esto lo haga independiente del gestor de base de datos. Puede ser el motivo de su uso.
Exacto. Ese es el único motivo. Usar sentencias SQL directamente es, incluso, más rápido pero atas el programa a ese tipo de base de datos y su modificación, bien porque ampliamos a una BDD más potente o porque haya actualizaciones en el dialecto SQL de la versión de la BDD, serían causa de muchos problemas en todos los programas que la usen. Utilizando las clases de gambas sólo requerirían cambiar la propiedad de la clase connection en el primer caso y la actualización del módulo de gambas en el segundo. Después de eso, recompilar y listo.


Saludos.

No podemos regresar
[-] Los siguientes 1 usuarios dice gracias a Shordi por este post:
  • Shell
    ¡Gracias!
#3

Aunque no lo he estudiado bien, ayer intenté hacer una consulta con la clase Result y el método find pero no obtuve lo que quería,
si lo logré con el método exec. Pero entonces no valdría para otro motor.

De la ayuda de Gambas sobre gb.db dice:
 
Cita: 
This component creates an intermediate layer between the specific server and your program, so that you can use exactly the same code whatever database backend you decide to use.

This goal is reached only if:
You create your database by using the database manager or by using this component.
You use the Find, Create and Edit methods.
You don't put SQL values directly in the request, but use the substitution feature of the previous methods.
You don't use the Exec method, that lets you send SQL request directly to the backend, so that you can access its specific features.

If you don't need database independence, do as you like! :-)

Aunque luego diga al final que lo hagamos como queramos si no necesitamos independencia del tipo de base de datos.

Estoy intentando de seguir la filosofía de la ayuda, aunque por ahora solo uso sqlite3.

El ejemplo. Tengo cuatro registros que se rellenan con datos de empleados. Hay dos hombres y dos mujeres.
Entonces quiero contar cuantos pertenecen a mujeres. Lo hago así:

GAMBAS
  1. rDatos = hConn.Exec("select sexo, count(*) as 'mujeres' from empleados where sexo='M' group by 'sexo'")



Pero luego a la hora de hacerlo con el método find de la clase result, no acabo de lograrlo,por falta de uso de este método.
¿ Cómo lo llevo a hacerlo con la clase result y el método find ?.

Estuve leyendo el antiguo foro de Gambas y las explicaciones de Soplo.

La clase conection

¿ En realidad vosotros seguís esa filosofía (usar solo la clase Result) ?. O usáis el método exec por que no tenéis más remedio. ( En casa del herrero..  Shy )
Con esto quiero decir, ¿ Puedo usando solo la clase result y sus métodos parar lograr la mayoría de las consultas SQL ?.

Saludos

"El buen perfume en frasco pequeño se vende"
    ¡Gracias!
#4

Cita:¿ En realidad vosotros seguís esa filosofía (usar solo la clase Result) ?. O usáis el método exec por que no tenéis más remedio. ( En casa del herrero..  Shy )
Con esto quiero decir, ¿ Puedo usando solo la clase result y sus métodos parar lograr la mayoría de las consultas SQL ?.
 
Primero una puntualización: Los métodos exec, find, create y delete no son de la clase result, son de la clase Connection. Una instancia de la clase result es lo que devuelven esos métodos (menos delete por razones obvias).

Lo que aquí se dirime es la manera de hacer llegar nuestra consulta al motor de la base de datos. El asunto de si nuestro programa va a ser escalado o no a otro tipo de base de datos, creo que queda para aplicaciones comerciales de amplia distribución. Es decir, si no usas el método exec, puedes distribuir tu programa entre clientes que dispongan de sqlite o Oracle o MariaDB o MySql indistintamente. En tal caso debes proveer a tu programa un mecanismo de configuración de los parámetros de la clase Connection y ya tienes un programa de amplia distribución.
Si tus programas no aspiran a eso o, como me ocurría a mí en mi vida laboral, las bases de datos también están a tu cargo, puedes olvidarte de eso y utilizar sólo la clase exec, que para eso está. Sin embargo la clase exec puede ser muy pejiguera en ciertas cuestiones, como las comillas, para soslayar eso debes usar los parámetros reemplazables, que te libra de todo ese pantanoso asunto.
Con ello, tu sentencia quedaría asi:
Código:
GAMBAS
  1. rDatos = hConn.Exec("select sexo, count(*) as 'mujeres' from empleados where sexo=&1 group by 'sexo'","M")

En este caso donde seleccionas sólo por una letra puede parecer excesivo, pero imagina que buscas por apellidos y que estás a expensas de lo que teclee el usuario en un formulario de búsquedas. O que tienes que hacer selecciones por un montón de campos, o que tienes un campo numérico (en el que no escribes las comillas, claro) y el usuario te teclea letras, etc. etc. Con los parámetros reemplazables te ahorras esos errores... o consigues un error generado por la B.DD más específico que "Error de sintaxis".

Saludos

No podemos regresar
[-] Los siguientes 1 usuarios dice gracias a Shordi por este post:
  • Shell
    ¡Gracias!
#5

(06-01-2023, 11:09)Shordi escribió:  Primero una puntualización: Los métodos exec, find, create y delete no son de la clase result, son de la clase Connection. Una instancia de la clase result es lo que devuelven esos métodos (menos delete por razones obvias).

Cierto. De ahí comentaba el post de Soplo sobre la clase Connection.
 
(06-01-2023, 11:09)Shordi escribió:  Si tus programas no aspiran a eso o, como me ocurría a mí en mi vida laboral, las bases de datos también están a tu cargo, puedes olvidarte de eso y utilizar sólo la clase exec, que para eso está

Supongo que te viste en la necesidad de cambiar o usar distintos gestores de bases de datos. ( Según necesidad, claro ).
Eso probablemente afectaría al método exec que habías diseñado.

El tema de usar parámetros reemplazables es algo que tendré que ir viendo según voy aprendiendo a usar sqlite con Gambas.

"El buen perfume en frasco pequeño se vende"
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje
Último mensaje por Shordi
31-12-2022, 11:26

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)