Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-07-2003
TelloClos TelloClos is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 48
Poder: 0
TelloClos Va por buen camino
Question 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
__________________
"Todo lo que puede fallar, falla."
Responder Con Cita
  #2  
Antiguo 22-07-2003
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 22-07-2003
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Smile

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
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #4  
Antiguo 22-07-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
¿No puedes hacer?
Código:
BEGIN
  UPDATE...
  INSERT...
  UPDATE...
END;
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 22-07-2003
TelloClos TelloClos is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 48
Poder: 0
TelloClos Va por buen camino
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!
__________________
"Todo lo que puede fallar, falla."
Responder Con Cita
  #6  
Antiguo 22-07-2003
TelloClos TelloClos is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 48
Poder: 0
TelloClos Va por buen camino
Cita:
Posteado originalmente por delphi.com.ar
¿No puedes hacer?
Código:
BEGIN
  UPDATE...
  INSERT...
  UPDATE...
END;
¿Como podria hacer esto?
__________________
"Todo lo que puede fallar, falla."
Responder Con Cita
  #7  
Antiguo 22-07-2003
TelloClos TelloClos is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 48
Poder: 0
TelloClos Va por buen camino
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?
__________________
"Todo lo que puede fallar, falla."
Responder Con Cita
  #8  
Antiguo 22-07-2003
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 22-07-2003
Newbie Newbie is offline
Miembro
 
Registrado: jul 2003
Ubicación: Veracruz, México
Posts: 30
Poder: 0
Newbie Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 22-07-2003
TelloClos TelloClos is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 48
Poder: 0
TelloClos Va por buen camino
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!
__________________
"Todo lo que puede fallar, falla."
Responder Con Cita
  #11  
Antiguo 22-07-2003
TelloClos TelloClos is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 48
Poder: 0
TelloClos Va por buen camino
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!
__________________
"Todo lo que puede fallar, falla."
Responder Con Cita
  #12  
Antiguo 22-07-2003
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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.
Responder Con Cita
  #13  
Antiguo 22-07-2003
TelloClos TelloClos is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 48
Poder: 0
TelloClos Va por buen camino
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!
__________________
"Todo lo que puede fallar, falla."
Responder Con Cita
  #14  
Antiguo 22-07-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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;
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #15  
Antiguo 23-07-2003
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
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.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #16  
Antiguo 23-07-2003
TelloClos TelloClos is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 48
Poder: 0
TelloClos Va por buen camino
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!
__________________
"Todo lo que puede fallar, falla."
Responder Con Cita
  #17  
Antiguo 10-05-2006
michugg michugg is offline
Registrado
 
Registrado: ene 2006
Posts: 2
Poder: 0
michugg Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:39:19.


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
Copyright 1996-2007 Club Delphi