![]() |
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 |
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. |
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 |
¿No puedes hacer?
Código:
BEGIN |
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! |
Cita:
|
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? |
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; En fin, tu eres el que decides :) Saludos. |
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 |
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! |
Cita:
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! |
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.....' Por ejemplo colocas este INSERT Código:
Código:
Espero haberme explicado. Un saludo. |
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! |
Cita:
Código:
BEGIN |
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.;) |
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! |
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 00:14:49. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi