Passagem de parâmetro para um insert em uma ZQuery
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....
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
Curtidas 0
Respostas
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
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....
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
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;
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