Isso deixa a query lenta ?
pessoall,
qdo faco uma query , utilizo os seguintes comandos :
var str : string
begin
dm.qry.sql.text := ´´;
str := ´´;
str := ´select * from table where alguma coisa´;
dm.qry.close;
dm.qry.sql.add(str);
dm.qry.execsql;
dm.qry.open;
end;
Essas linhas podem deixar a query mais lenta para ser executada ?
O q é preferivel :
- definir o comando de select, insert, etc ... diretamente dentro da query (strings) , do que passar para uma varialve de depois jogar para query ?
Tem alguma propriedade da query q posso modificar e torna-la um pouco mais rapida ?
obr
qdo faco uma query , utilizo os seguintes comandos :
var str : string
begin
dm.qry.sql.text := ´´;
str := ´´;
str := ´select * from table where alguma coisa´;
dm.qry.close;
dm.qry.sql.add(str);
dm.qry.execsql;
dm.qry.open;
end;
Essas linhas podem deixar a query mais lenta para ser executada ?
O q é preferivel :
- definir o comando de select, insert, etc ... diretamente dentro da query (strings) , do que passar para uma varialve de depois jogar para query ?
Tem alguma propriedade da query q posso modificar e torna-la um pouco mais rapida ?
obr
Scandolara
Curtidas 0
Respostas
Weber
30/12/2004
Não faz diferença alguma mas você tem que se atentar a alguns detalhes:
Faz a mesma coisa, só que com menos código. :D
var str : string begin str := ´insert into table (.......) values (......)´; dm.qry.close; dm.qry.sql.Text := str; dm.qry.execsql; //use execsql somente em insert, update, delete end;
var str : string begin str := ´select * from table where alguma coisa´; dm.qry.close; dm.qry.sql.Text(str); dm.qry.open; //use open em select end;
Faz a mesma coisa, só que com menos código. :D
GOSTEI 0
Edineidaniel
30/12/2004
Scandolara,
Sobre a passagem de um senteça SQL de uma variável, acho q naum influencia na performance do sistema.
O q vc deve tomar cuidado eh com a sentença SQL em si...
Use ao invés de *, use o nome dos campos que vc realmente necessita..
Ao meu ver eu naum vejo pq de usar uma variável para passar a sua sentença..
Coloque a sentença diretamente no no ADD..
Exemplo de como eu faço...
With DmManCR01.IBQryCce Do
Begin
Close;
SQL.Clear;
SQL.Add(´SELECT INTCODCCE, INTCODUSU ´);
SQL.Add(´FROM TBCADCCE ´);
SQL.Add(´ORDER BY INTCODCCE´);
Open;
End;
Ah vc naum precisar dar um ExecSQL e depois um Open, somente o Open resolve..
t+
Edinei
Sobre a passagem de um senteça SQL de uma variável, acho q naum influencia na performance do sistema.
O q vc deve tomar cuidado eh com a sentença SQL em si...
Use ao invés de *, use o nome dos campos que vc realmente necessita..
Ao meu ver eu naum vejo pq de usar uma variável para passar a sua sentença..
Coloque a sentença diretamente no no ADD..
Exemplo de como eu faço...
With DmManCR01.IBQryCce Do
Begin
Close;
SQL.Clear;
SQL.Add(´SELECT INTCODCCE, INTCODUSU ´);
SQL.Add(´FROM TBCADCCE ´);
SQL.Add(´ORDER BY INTCODCCE´);
Open;
End;
Ah vc naum precisar dar um ExecSQL e depois um Open, somente o Open resolve..
t+
Edinei
GOSTEI 0
Vinicius2k
30/12/2004
Colega,
Não há diferença para execução da Query a inserção da string SQL diretamente ou via código...
O que vc precisa é retirnar o método ExecSQL pois ele só deve ser utilizado em instruções de INSERT, UPDATE, DELETE e DDL... Para SELECT use apenas o método Open.
Também não é necessário inicializar a variável [b:32b60ba3a3]str[/b:32b60ba3a3] porque logo em seguida vc está atribuindo um valor a ela sem nenhum desvio condicional (IF ou CASE)...
T+
Não há diferença para execução da Query a inserção da string SQL diretamente ou via código...
O que vc precisa é retirnar o método ExecSQL pois ele só deve ser utilizado em instruções de INSERT, UPDATE, DELETE e DDL... Para SELECT use apenas o método Open.
Também não é necessário inicializar a variável [b:32b60ba3a3]str[/b:32b60ba3a3] porque logo em seguida vc está atribuindo um valor a ela sem nenhum desvio condicional (IF ou CASE)...
... var str : string begin str := ´select * from table where alguma coisa´; with dm.qry do begin Close; SQL.Clear; SQL.Add(str); Open; end; end;
T+
GOSTEI 0
Shaolin
30/12/2004
Seguindo do exemplo do colega ´Vinicius2K´, se você retirar esta variavel da tua procedure ela pode ter mais utilidade. Coisa do Tipo:
public
{ Public declarations }
str: String;
procedure ExecutaSQL;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ExecutaSQL;
begin
with Query do
begin
Close;
SQL.Clear;
SQL.Add(str);
Prepare
Open;
end;
end;
Pois desta forma, você pode utilizar esta procedure para outras consultas, e não somente esta, por exemplo
procedure TForm1.Button1Click(Sender: TObject);
begin
str:= ´select nome from cadastro order by nome asc´;
ExecutaSQL;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
str:= ´select telefone, contato from agenda order by contato asc´;
ExecutaSQL;
end;
Espero ter ajudado.
public
{ Public declarations }
str: String;
procedure ExecutaSQL;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ExecutaSQL;
begin
with Query do
begin
Close;
SQL.Clear;
SQL.Add(str);
Prepare
Open;
end;
end;
Pois desta forma, você pode utilizar esta procedure para outras consultas, e não somente esta, por exemplo
procedure TForm1.Button1Click(Sender: TObject);
begin
str:= ´select nome from cadastro order by nome asc´;
ExecutaSQL;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
str:= ´select telefone, contato from agenda order by contato asc´;
ExecutaSQL;
end;
Espero ter ajudado.
GOSTEI 0
Weber
30/12/2004
Gostei da idéia.
...
private
function ExecutaQuery(const Text: String): Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
function TForm1.ExecutaQuery(const Text: String): Boolean;
begin
try
Query1.Close;
Query1.SQL.Text := Trim(Text);
if Copy(Trim(UpperCase(Text)),1,6) = ´SELECT´ then
Query1.Open
else
begin
if not Transaction1.InTransaction then
Transaction1.StartTransaction;
Query1.ExecSQL;
Transaction1.CommitRetaining;
end;
Result := True;
except
if Copy(Trim(UpperCase(Text)),1,6) <> ´SELECT´ then
Transaction1.RollbackRetaining;
Result := False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
cText : String;
begin
cText := ´Select * From Cadastro´;
if ExecutaQuery(cText) then
ShowMessage(´Executado com Sucesso!´)
else
ShowMessage(´Erro ao Executar!´);
end;
end.GOSTEI 0