Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Transacciones a través de Instrucciones Sql (https://www.clubdelphi.com/foros/showthread.php?t=2389)

TelloClos 22-07-2003 03:26:06

Transacciones a través de Instrucciones Sql
 
Hola que tal!

para ejecutar las transacciones de insercción,eliminación y actualización sobre las tablas de mi base de datos recidente en un servidor sql , utilizo instrucciones sql(insert,update,delete), luego de armar mi cadena sql en delphi mando a ejecutar esta instrucción a travez de un objeto TAdoQuery , utilizando primero para entregarle la cadena su propiedad TAdoQuey.sql.text y luego para ejecutar este query la propiedad TAdoQuery.execsql

mi consulta es la siguiente, existe alguna forma de pasarle al query mas de un sql para ejecutarlos luego todos de una sóla vez.?

o quizas existe alguna forma de poder ejecutar directamente este sql sin la necesidad de depender de este objeto.?

de ante mano muchas gracias!

salu2

__marcsc 22-07-2003 08:40:52

Hola,

a un servidor SQL Server puedes enviarle múltiples sentencias y debería ejecutarlas todas. Otra cosa es si tu le envias 2 select como se lo monta para devolvertelos. En este caso debes utilizar la propiedad NextRecordSet para acceder a él.

Pero hasta donde yo sé, en un ADOQuery puedes ejecutar más de un insert o update o select, o múltiples instrucciones en general.

Saludos.

Cabanyaler 22-07-2003 10:30:15

Hola, a la pregunta que haces en primer lugar, cito:
, existe alguna forma de pasarle al query mas de un sql para ejecutarlos luego todos de una sóla vez.?
Te diré, q de igual modo q utilizas el TADOSQL, ¿pq no utilizas el TADOStoreProcedure?, de este modo puedes crear las sql's 2 o más o las q quieras en el propio servidor y ejecutarlas a la ejecución del procedimiento almacenado.
Creo q es eso lo q preguntas, ya que tampoco entiendo muy bien tu duda al leer la segunda pregunta alternativa.
Suerte

delphi.com.ar 22-07-2003 16:26:53

¿No puedes hacer?
Código:

BEGIN
  UPDATE...
  INSERT...
  UPDATE...
END;


TelloClos 22-07-2003 16:46:18

Hola !

¿porque no utlizas el TADOStoreProcedure?, de este modo puedes crear las sql's 2 o más o las q quieras en el propio servidor y ejecutarlas a la ejecución del procedimiento almacenado.

mi primera intención fue hacerlo a travez de un procedimiento almacenado pero la verdad no se bien como hacerlo , solo tengo la intención, si me pudieras explicar un poco mejor lo que me planteas sobre el procedimiento almacenado te estaria muy agradecido, se ve interesante como alternativa.

--------
- sobre lo que planteaba como segunda alternativa era saber si en delphi existe la posibilidad de poder ejecutar las instrucciones directamente, o sea sin depender de algún un objeto en especfifico , sea procedimiento o query.
esto lo menciono porque por ejemplo en visual basic tu puedes hacerlo de esta forma : declaras un objeto que es del tipo Connection que en el caso de delphi seria TAdoConnection, y utilizas su propiedad "execute" ,para pasarle la cadena sql y ejecutarla , ejemplo:

dim db as adodb.connection

db.execute ( "Insert into Abonos values('0001','B','01/01/2003')")

como vez no necesito asignar a ningun objeto adicional, mas que al que contiene la ruta de la base de datos a donde quiero ejecutar el cambio.


Salu2 y gracias!

TelloClos 22-07-2003 17:00:09

Cita:

Posteado originalmente por delphi.com.ar
¿No puedes hacer?
Código:

BEGIN
  UPDATE...
  INSERT...
  UPDATE...
END;


¿Como podria hacer esto?

TelloClos 22-07-2003 17:06:01

Hola!:

"Pero hasta donde yo sé, en un ADOQuery puedes ejecutar más de un insert o update o select, o múltiples instrucciones en general."

y con que propiedad del Adoquery podria asginar estos ( mas de uno) sql, para luego ejecturalos de una sóla vez?

__marcsc 22-07-2003 17:08:21

Hola,

cuando trabajas con los componentes de conexión ADO, en realidad estás utilizando los mismos objetos ActiveX que utilizas en VB, por tanto, puedes utilizar el método Execute que mencionas pasandole una cadena con el SQL a ejecutar. Tienes dos versiones, una función que devuelve un Recordset y un procedimiento:

Código:

function Execute(const CommandText: WideString; const CommandType: TCommandType = cmdText;
  const ExecuteOptions: TExecuteOptions = []): _RecordSet; overload;
procedure Execute(const CommandText: WideString; const CommandType: var RecordsAffected: Integer;
  ExecuteOptions: TExecuteOptions = [eoExecuteNoRecords]); overload;

Si te interesa también puedes ejecutar un ADOCommand. Lo que no veo es la necesidad de que el ADOConnection ejecute tu SQL, creo yo que podrías hacerlo con un Query, o incluso con un ADOCommand, que precisamente sirven para eso.

En fin, tu eres el que decides :)

Saludos.

Newbie 22-07-2003 17:14:03

Hola :)

Estoy de acuerdo con lo que dice marcsc. Tú puedes mandar diferentes sentencias SQL a tu servidor de base de datos y éste las ejcutará todas siempre y cuando el servidor al que envías la consulta lo soporte y lo hagas con el formato que él lo hace .

Por ejemplo, es SQL Server o Interbase puedes poner tus sentencias SQL terminándolas con ";" y al mandar ejecutar el query todas las sentencias se ejecutarán en secuencia.

Te recomiendo que antes de poner tus sentencias en un evento TQuery o TADOQuery pruebes en el analizador de consultas que te facilite tu gestor(por ejemplo en en Analizador de consultas de SQLServer o el IBConsole de Interbase) y,una vez que hayas comprobado que el gestor soporta esas consultas, copies el código a tu ADOQuery y verás que se van a ejecutar todas en serie.

Supongo que es a eso a lo que se refería delphi.com.ar, pues en interbase podrías poner un fragmento de código así:

insert into tabla1 values(....);//sentencia1
update tablax set.... ;//sentencia2
update tablay set.... ;//sentencia 3

y así sucesivamente.

Espero haberte sido de utilidad. Por cierto ¿Qué gestor utilizas?

Hasta pronto :d

TelloClos 22-07-2003 17:32:15

ok, suponiendo que prefiero utilizar estos objetos...

... Para el caso de querer ejecutar consultas que no entregen un conjunto de datos de resultado ( INSERT,UPDATE;DELETE), cual de los dos objetos que me planteas seria más apropiado: el Command o el Query?
por primera impresión, me parece que para este caso seria mejor le command , siendo así me podrias dar algunas reseñas de como utlizar este objeto y de que cosas tener en cuenta al manejarlo para este caso especifico.

según yo se podria manejar de esta manera:

- asignar el objeto Adoconnection a su propiedad Connection
-a la propiedad CommandText le asigno la cadena Sql( "Insert into...")
- luego ejecuto la consulta Command.execute

* deberia tener presente algún cambio en su propiedad ExecuteOption para mi caso?

- sobre lo mismo que he preguntado antes con respecto al objeto query ¿ existe alguna forma de asignarle más de una cadena sql , para luego poder ejecutarlas de una sola vez? siendo así ¿ con que propiedad seria?

De ante mano muchas gracias!

TelloClos 22-07-2003 17:38:04

Cita:

Posteado originalmente por Newbie
Hola :)

Estoy de acuerdo con lo que dice marcsc. Tú puedes mandar diferentes sentencias SQL a tu servidor de base de datos y éste las ejcutará todas siempre y cuando el servidor al que envías la consulta lo soporte y lo hagas con el formato que él lo hace .

Por ejemplo, es SQL Server o Interbase puedes poner tus sentencias SQL terminándolas con ";" y al mandar ejecutar el query todas las sentencias se ejecutarán en secuencia.

Te recomiendo que antes de poner tus sentencias en un evento TQuery o TADOQuery pruebes en el analizador de consultas que te facilite tu gestor(por ejemplo en en Analizador de consultas de SQLServer o el IBConsole de Interbase) y,una vez que hayas comprobado que el gestor soporta esas consultas, copies el código a tu ADOQuery y verás que se van a ejecutar todas en serie.

Supongo que es a eso a lo que se refería delphi.com.ar, pues en interbase podrías poner un fragmento de código así:

insert into tabla1 values(....);//sentencia1
update tablax set.... ;//sentencia2
update tablay set.... ;//sentencia 3

y así sucesivamente.

Espero haberte sido de utilidad. Por cierto ¿Qué gestor utilizas?

Hasta pronto :d

Hola NewBie!

primero que todo gracia por la atención, justamente con respecto a los de ejecutar más de una consulta al mismo tiempo a esto me referia, gracias por el aporte!

utilizo como gestor Sql Server 2000

salu2!

__marcsc 22-07-2003 17:45:38

Hola,

en teoría el Query te serviria para Selects, Updates, Inserts y deletes.

EL ADOCommand viene a ser más general, te permitiría enviar cualquier sentencia al SGBD.

Si lo que quieres es asignar la propiedad SQL por cógigo puedes hacer

Código:

Query1.SQL.Text:= 'INSERT INTO.....'
Query1.ExecSQL;
Query1.SQL.Text:= 'UPDATE etc etc';
Query1.ExecSQL;

Aunque si por ejemplo lo que necesitas es ejecutar varios inserts de los cuales solo cambian los valores lo que tienes que hacer es utilizar parámetros.

Por ejemplo colocas este INSERT

Código:


ISNERT INTO TABLA VALUES (:Codigo,:Nombre);

Y luego en tu programa les asignas valor a estos parámetros

Código:


Query1.Parameters.ParamByName('Codigo').Value:= 1;
Query1.Parameters.ParamByName('Nombre').Value:= 'Pepito';
Query1.ExecSQL;

Si ahora quieres hacer otro isnert con otros valores solo necesitas volver a asignar los parámetros y velover a hacer el ExecSQL.

Espero haberme explicado.

Un saludo.

TelloClos 22-07-2003 18:01:04

Hola!

o sea, por lo que veo, es más efectivo ( o de mejor rendimiento) el Adoquery que el AdoCommand... para estos casos.

¿Alguna utlidad importante como para preferir en algún momento a este objeto AdoCommand?

Gracias y Salu2!

delphi.com.ar 22-07-2003 18:14:25

Cita:

Posteado originalmente por TelloClos
¿Como podria hacer esto?
Ejecutando esa consulta, solo tendrías que armar todo en un solo Sql, y los ejecutará en el orden que los definas.

Código:

BEGIN
  UPDATE EMPRESA
  SET NOMBRE = LTRIM(NOMBRE);

  UPDATE USUARIO
  SET ID_USUARIO = LTRIM(NOMBRE);
END;


Cabanyaler 23-07-2003 09:33:02

Por lo que te envian los compañeros tienes creo que suficientes alternativas ¿no?.
No obstante, lo del SP, es la misma sintaxis que la sql,
P.e. uno corto....

CREATE PROCEDURE Nombre
AS
SELECT * FROM Tabla1.....
.
. /* Puedes añadir sentencias SELECT, DELETE, APPEND, etc....
.
SELECT * FROM Tablan.....


En cuanto a la segunda pregunta y como te indican el resto de compañeros es el componente
TADOCOMMAND. Sobre la eficiencia del mismo, no te puedo decir nada, pero con este obj, puedes
ejecutar el comando que desees.

Suerte.;)

TelloClos 23-07-2003 18:16:25

Hola!

si la verdad es que gracias a la atención que me han dado los demás compañeros , he aclarado bastante mis dudas y dispongo de varias aletrnativas para aplicar, bueno sumando tambien la que me acbas de entregar..

es bueno saber que uno puede contar con ayuda por estos lados espero algún dia en que ya me maneje un poco aportar tambien en algo..

Salu2!

michugg 10-05-2006 23:19:20

AdoCommands
 
Hola
Estoy utilizando un adocommand para poder actualizar una tablas de la base de datos tengo este codigo
ADOCInventoryUser.Parameters.FindParam('IdPODetail').Value :=
ClientDataSetDetailIdPODetail.Value;
ADOCInventoryUser.Parameters.FindParam('SoldBoxes').Value :=
ClientDataSetDetailSoldBoxes.Value;
ADOCInventoryUser.Execute;
Y en la propiedad commandtext tengo
DECLARE @SoldBoxes INT
SET @SoldBoxes := SoldBoxes
DECLARE @IdPODetail INT
SET @IdPODetail := IdPODetail
DECLARE @IdUser INT
SET @IdUser :=IdUser
DECLARE @IdCustomer INT
SET @IdCustomer :=IdCustomer
UPDATE tblInventory
SET StockBoxes=StockBoxes - @SoldBoxes
WHERE IdPODetail = @IdPODetail
UPDATE tblInventoryUser
SET SoldBoxes=SoldBoxes + @SoldBoxes
WHERE IdPODetail = @IdPODetail
AND IdUser = @IdUser
AND IdCustomer =@IdCustomer
INSERT INTO tblInventoryUser(IdPODetail,IdUser,SoldBoxes,IdCustomer)
SELECT @IdPODetail, @IdUser, @SoldBoxes, @IdCustomer
WHERE @IdPODetail NOT IN (
SELECT IdPODetail
FROM tblInventoryUser
WHERE IdPODetail=@IdPODetail AND IdUser=@IdUser AND IdCustomer =@IdCustomer)

Pero me da el siguiente error Access violaton at address004FEDC9 in module Flw.exe read of address 000000C
Porfavor necesito ayuda
Gracias


La franja horaria es GMT +2. Ahora son las 17:54:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi