Problem when inserting into a SQLITE table using RAD STUDIO XE6

1

Good afternoon, I am having a problem in my code, I use Rad Studio XE6 connected to an SQLITE base, when I insert values with point in the table the following error occurs for example = 'near' 6.75 ": syntax error 'being 6.75 the value, when I put quotation marks in the insert it appears"' 6.75 ", now when I put the comma it inserts normal because SQLITE can convert to direct insert, but I need to calculate 6.75 with other values and the comma does not let me calculate, so I want to insert with a dot. Can anyone help ??

My code:

 //q_insere_itens_pedido é uma Query do tipo TSQLQuery 
 //todos os valores estão sendo inseridos como tipo string
 //tentei inserir como inteiro(cod_pedido, cod_produto) e real(quantidade, unitario subtotal)
 //mas a query aceita apenas string
 //FAZER CONTAS E INSERIR
 //========================================================================

 valor := l_produto.Text;
 subtotal := FloatToStr(StrToFloat(valor) * StrToFloat(l_quantidade.Text));
 SUBTOTALFORMATADO := FormatFloat('0.00', subtotal.ToExtended);
 VALORFORMATADO := FormatFloat('0.00', VALOR.ToExtended);

 codigo_pedido := IntToStr(q_pedidoCODIGO.Value);
 codigo_produto := l_produto_codigo.Text;
 descricao_produto := bt_busca_produto.Text.QuotedString;
 quantidade := l_quantidade.Text;


 q_insere_itens_pedido.SQL.Clear;
 q_insere_itens_pedido.SQL.Add('insert into ITENS_PEDIDO(COD_PEDIDO, COD_PRODUTO, PRODUTO, QUANTIDADE, UNITARIO, SUBTOTAL)');
 q_insere_itens_pedido.SQL.Add('values('+codigo_pedido+
                                     ','+codigo_produto+
                                     ','+descricao_produto+
                                     ','+quantidade+
                                     ','+valorformatado+
                                     ','+subtotalformatado+')');
 ShowMessage(q_insere_itens_pedido.SQL.Text);
 q_insere_itens_pedido.ExecSQL;
    
asked by anonymous 09.09.2014 / 20:43

1 answer

0

The error occurs because your DBMS (or the user, or the connection ...) is set to (or is in the nature of it) to receive a comma as a decimal separator and not a dot.

Do not try to change this behavior. The key to the solution is that you do not have to worry about this SQL server feature.

Do not concatenate the values of the fields in the SQL command. Instead, pass the values using parameters.

When you concatenate the values entered by users into SQL commands, you are subject to SQL Injection risks and are subject to data formatting problems (not just decimal separator but also date format and strings in strings) like the one you is facing.

I've changed your code to consider using the following practices:

  • Variables that will handle numbers should be declared as such and not as "string".
  • Use parameters instead of concatenating values in the query.
var
    quantidade: double;
    valor: double;
    subtotal: double;
    codigo_pedido: integer;
    ...
begin
    // considere usar máscaras ou equivalente para garantir que o usuário entrará somente com números de modo a não precisar tratar erro de digitação.
    TryStrToFloat(l_produto.Text, valor);
    TryStrToFloat(l_quantidade.Text, quantidade);

    subtotal := valor * quantidade;
    //SUBTOTALFORMATADO := FormatFloat('0.00', subtotal.ToExtended);
    //VALORFORMATADO := FormatFloat('0.00', VALOR.ToExtended);

codigo_pedido := q_pedidoCODIGO.Value;
codigo_produto := l_produto_codigo.Text;

// não use "QuotedString". O uso de parâmetros no comando SQL fará todo o trabalho pra você.
descricao_produto := bt_busca_produto.Text; 
//quantidade := l_quantidade.Text;


q_insere_itens_pedido.SQL.Clear;
q_insere_itens_pedido.SQL.Add('insert into ITENS_PEDIDO(COD_PEDIDO, COD_PRODUTO, PRODUTO, QUANTIDADE, UNITARIO, SUBTOTAL)');
q_insere_itens_pedido.SQL.Add('values(:codigo_pedido' +
                                     ', :codigo_produto' +
                                     ', :descricao_produto' +
                                     ', :quantidade' +
                                     ', :valor' +
                                     ', :subtotal)');
//ShowMessage(q_insere_itens_pedido.SQL.Text);

q_insere_itens_pedido.ParamByName('codigo_pedido').AsInteger := codigo_pedido;
q_insere_itens_pedido.ParamByName('codigo_produto').AsString := codigo_produto;
q_insere_itens_pedido.ParamByName('descricao_produto').AsString := descricao_produto;
q_insere_itens_pedido.ParamByName('quantidade').AsDouble := descricao_produto;
q_insere_itens_pedido.ParamByName('valor').AsDouble := valor;
q_insere_itens_pedido.ParamByName('subtotal').AsDouble := subtotal;

q_insere_itens_pedido.ExecSQL;

See: Working With TSQLQuery

I do not have Delphi installed so there may be compilation errors in my code (certainly they will be simple to fix).

    
09.09.2014 / 20:48