Passagem de parâmetro para um insert em uma ZQuery

Delphi

20/04/2010

Boa tarde.   Estou desenvolvendo uma aplicação utilizando o banco de dados PostGre com extensão espacial PostGis. Preciso fazer um INSERT de um ponto (POINT) na base de dados, mas está ocorrendo um erro de síntaxe de SQL.   O código que estou utilizando é o seguinte:   procedure TFrmManutPontos.BtnSalvarClick(Sender: TObject);
var  x,y:string;
  cod:Integer;
begin     cod := StrToInt(CpoCodPonto.Text);
  x := (CpoX.Text);
  y := (CpoY.Text);     ZQrDados.Close;
  ZQrDados.SQL.Clear;
  ZQrDados.SQL.Add('INSERT INTO poco_a (gid,the_geom)');
  ZQrDados.SQL.Add('values (:par1, (GeomFromText('+'Point(:par2 :par3))'+'))'); //Aqui eu preciso enviar o valor da coordenada x para o "par2" e a coordenada y para o "par3".     ZQrDados.ParamByName('par1').AsInteger := cod;
  ZQrDados.ParamByName('par2').AsString := x;
  ZQrDados.ParamByName('par3').AsString := y;
  //ZQrDados.ParamByName('par4').AsString := conversao;   ZQrDados.Open;   Está acontecendo o seguinte erro: 'Sql Error: erro de sintaxe em ou próximo a "2"' at character 71'. Process stopped.   Esse erro próximo a "2" é por que informei o número 2 no campo Y. O erro está no Insert, (GeomFromText('+'Point(:par2 :par3))'+')).   Alguma Sujestão?   desde já agradeço....
Felipe

Felipe

Curtidas 0

Respostas

Felipe

Felipe

20/04/2010

Inserindo diretamente na base o comando: INSERT INTO poco_a (gid,the_geom) values (61,GeometryFromText('POINT(-53 -27.7)'))   está funcionando. o problema é que eu preciso passar esses valores por parâmetro para dentro do POINT. Esse valor -53 seria a minha coordenada X e o -27.7 seria a minha coordenada Y.   Esses valores viriam de dois campos edit.txt.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

20/04/2010

até onde eu sei não é possível preencher uma lista via parâmetros. então, recomendo a você concatenar o valor na instrução.

procedure TFrmManutPontos.BtnSalvarClick(Sender: TObject);
var  x,y:string;
  cod:Integer;
begin
  cod := StrToInt(CpoCodPonto.Text);
  x := (CpoX.Text);
  y := (CpoY.Text);

  ZQrDados.Close;
  ZQrDados.SQL.Clear;
  ZQrDados.SQL.Add('INSERT INTO poco_a (gid,the_geom)');
  ZQrDados.SQL.Add('values (:par1, (GeomFromText(Point('+inttostr(x)+' '+inttostr(y)+'))))');
  ZQrDados.ParamByName('par1').AsInteger := cod;
  ZQrDados.ParamByName('par2').AsString := x;
  ZQrDados.ParamByName('par3').AsString := y;
  //ZQrDados.ParamByName('par4').AsString := conversao;
  ZQrDados.Open;


veja se funciona....
GOSTEI 0
Felipe

Felipe

20/04/2010

Valeu Emerson.....   Concatenei os valores em uma variável("conversao"), e depois chamei no sql. Tive um problema pois o comando 'Point('+conversao+')'; precisa ter aspas simples, isso fazia com que meu sql era encerrado. Aí joguei a informação para dentro de uma string e depois chamei no sql.   Abaixo o código funcionando corretamente.     procedure TFrmManutPontos.BtnSalvarClick(Sender: TObject);
var  x,y,conversao:string;
  cod,x1,y1:Integer;
  conversao2:TPoint;
begin //  ZQrDados.FieldByName('gid').AsInteger := StrToInt(CpoX.Text);
//  ZQrDados.FieldByName('').AsInteger := ;   cod := StrToInt(CpoCodPonto.Text);
  x := (CpoX.Text);
  y := (CpoY.Text);
  conversao := ((x)+' '+(y));   // Inserção do ponto no Banco de Dados
  ZQrDados.Close;
  ZQrDados.SQL.Clear;
  ZQrDados.SQL.Add('INSERT INTO poco_a (gid,the_geom)');
  conversao := 'Point('+conversao+')';
  ZQrDados.SQL.Add('values (:par1, GeomFromText('''+ conversao +''' ))');   ZQrDados.ParamByName('par1').AsInteger := cod;
  ZQrDados.Open;
end;
GOSTEI 0
POSTAR