|
Página 1 de 1
|
[SOLUCIONADO] Affected Rows
Autor |
Mensaje |
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
[SOLUCIONADO] Affected Rows
Buenas tardes a todos,
estoy con el desarrollo de una app para la gestión de proyectos (que espero no tardar mucho en compartir con todos) y tengo la siguiente duda.
Cómo puedo obtener un affected_rows o filas afectadas en el caso de un Insert?
Private iContador As Integer
iContador = conn.Exec("INSERT INTO LOGS (FECHA,HORA,PANTALLA,MENSAJE) VALUES ('" & sFecha & "','" & sHora & "','" & sPantalla & "','" & sMensaje & "')")
la idea general es que si las rows afectadas es 1 registro iContador me debería devolver 1, y creo que -1 en caso de no tener el insert.
Igual no es la forma correcta de ejecutarlo, agradecería alguna visión aclaradora.
Saludos y gracias.
última edición por calcena el Jueves, 09 Agosto 2018, 14:25; editado 1 vez
|
#1 Martes, 24 Julio 2018, 18:51 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Affected Rows
Cuando en gambas utilizas Exec en una conexión, gambas pasa directamente la consulta a la BD. Si no utilizas los mecanismos de gambas para comunicarte con la BD, la respuesta te la debe dar la propia BD.
Fuera de eso, y teniendo en cuenta que nunca he usado affected_rows para nada, un miconexion.Exec("sentencia sql") siempre devuelve un objeto de tipo result.
Es decir que
Dim r as result
conn.Exec("INSERT INTO LOGS (FECHA,HORA,PANTALLA,MENSAJE) VALUES ('" & sFecha & "','" & sHora & "','" & sPantalla & "','" & sMensaje & "')")
r=conn.exec("Sentencia affected_rows")
Debería dejar en el result r el número que quieres, con el nombre de campo que devuelva dicha sentencia... Repito que es algo que nunca he hecho o probado.
Saludos.
=================== No podemos regresar
|
#2 Martes, 24 Julio 2018, 21:40 |
|
|
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
Re: Affected Rows
Cuando en gambas utilizas Exec en una conexión, gambas pasa directamente la consulta a la BD. Si no utilizas los mecanismos de gambas para comunicarte con la BD, la respuesta te la debe dar la propia BD.
Fuera de eso, y teniendo en cuenta que nunca he usado affected_rows para nada, un miconexion.Exec("sentencia sql") siempre devuelve un objeto de tipo result.
Es decir que
Dim r as result
conn.Exec("INSERT INTO LOGS (FECHA,HORA,PANTALLA,MENSAJE) VALUES ('" & sFecha & "','" & sHora & "','" & sPantalla & "','" & sMensaje & "')")
r=conn.exec("Sentencia affected_rows")
Debería dejar en el result r el número que quieres, con el nombre de campo que devuelva dicha sentencia... Repito que es algo que nunca he hecho o probado.
Saludos.
Lo primero de todo, muchas gracias por la aclaración que parece muy lógica, es la DB la que trabaja con la sentencia.
Hay otra forma de poder conectar con la base de datos, me refiero a comunicar con ella para ejecutar sentecias DML (INSERT, UPDATE,SELECT, DELETE)??
he visto que sobre la conexión existe un conn.SQL....alguien lo ha utilizado??
Muchas gracias.
|
#3 Miercoles, 25 Julio 2018, 07:54 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Affected Rows
En las propiedades de la clase conexión tienes los métodos .Create, .Edit y Delete, que devuelven un result "de edición". Una vez rellenado el mismo, con el método .Update se produce la grabación en la BD.
Son, quizá algo más lentos que usar directamente el SQL (en realidad usan el SQL internamente, pero antes de llegar a él hacen sus "cositas"), pero dan más posibilidades en lo que a la manipulación y verificación de los datos se refiere. Su ventaja principal no es esa, es que si utilizas los mecanismos de gambas, estás haciendo tu proyecto independiente de la BD, es decir, independiente de su dialecto de SQL y peculiaridades. Hoy día los driver que maneja gambas son para mysql, postgresql y sqlite. Se puede también, con las limitaciones que tiene "per se", utilizar ODBC.
El sistema, básicamente, sería:
dim r as result
r=miconexion.Edit("mitabla","mi_clave=&1",variable_con_la_clave)
r!micampo1=mivalor1
r!micampo2=mivalor2
r!micampo3=mifuncionquedevuelve(mivalor3)
...
...
miconexion.update
Para procesos por lotes o transaccionales también puedes usar los métodos
miconexion.Begin
...
operaciones DML
...
miconexion.Commit
catch
miconexion.rollback
Para la mayor parte de las operaciones, es suficiente. Para las peculiaridades de alguno de los drivers, también conviene enlazar los componentes específicos. Es decir con el componente gb.db es suficiente, pero para cuestiones específicas puedes enlazar tambié gb.db.mysql o gb.db.sqlite3.
Si tienes dudas, aquí estamos.
Saludos.
=================== No podemos regresar
|
#4 Miercoles, 25 Julio 2018, 09:27 |
|
|
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
Re: Affected Rows
Muchas gracias por la aclaración.
Por mi experiencia soy desarrollador de utilizar mucho Stored Procedures (Packages en Oracle), Triggers etc y allí traspaso la lógica de negocio, digamos que en el desarrollo empresarial y dependiendo de los proyectos es una técnica estandarizada.
Entiendo que para poder ejecutar un Stored Procedure o Function en Mysql lo correcto es hacer un conn.Exec("CALL SP_CLIENTES")??
Gracias y saludos.
|
#5 Miercoles, 25 Julio 2018, 10:16 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Affected Rows
Nunca lo he probado, yo sólo utilizo triggers para simular integridad referencial entre bases de datos distintas. Las procedures y más específicas las hago en Gambas.
Pruebalo y si te funciona, cuéntalo, que me interesa.
=================== No podemos regresar
|
#6 Miercoles, 25 Julio 2018, 11:26 |
|
|
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
Re: Affected Rows
Nunca lo he probado, yo sólo utilizo triggers para simular integridad referencial entre bases de datos distintas. Las procedures y más específicas las hago en Gambas.
Pruebalo y si te funciona, cuéntalo, que me interesa.
Buenas como contestación a todo junto os comento:
1- Para poder saber las rows afectadas en un insert o update, que nos puede ser muy util para evaluar la lógica de si realmente hemos afectado a algo y saber si ha ido bien o no.
conn.Exec("INSERT INTO LOGS (.........)
conn.Exec("SELECT row_count() AS AFFECTED_ROWS")
2 - la prueba es satisfactoria en los Procedures y se cargan directamente en un Result tal que así. el nombre STP_TEST() con la lógica que necesite negocio.
rstResultado = conn.Exec("CALL STP_TEST()")
Saludos.
|
#7 Miercoles, 25 Julio 2018, 16:16 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Affected Rows
Nunca lo he probado, yo sólo utilizo triggers para simular integridad referencial entre bases de datos distintas. Las procedures y más específicas las hago en Gambas.
Pruebalo y si te funciona, cuéntalo, que me interesa.
Buenas como contestación a todo junto os comento:
1- Para poder saber las rows afectadas en un insert o update, que nos puede ser muy util para evaluar la lógica de si realmente hemos afectado a algo y saber si ha ido bien o no.
conn.Exec("INSERT INTO LOGS (.........)
conn.Exec("SELECT row_count() AS AFFECTED_ROWS")
2 - la prueba es satisfactoria en los Procedures y se cargan directamente en un Result tal que así. el nombre STP_TEST() con la lógica que necesite negocio.
rstResultado = conn.Exec("CALL STP_TEST()")
Saludos.
Gracias. Otra cosita más...
=================== No podemos regresar
|
#8 Jueves, 26 Julio 2018, 17:59 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|