Problem Inserting Into SQLITE Table Using RAD STUDIO XE6

Asked

Viewed 1,986 times

1

Good Afternoon, I have a problem in my code, use Rad Studio XE6 connected to a base SQLITE, when I insert values with point in the table occurs the following error for example = 'near "6.75":syntax error' being 6.75 the value, when I put in quotes in the Insert appears "'6.75", now when I put the comma it inserts normal because the SQLITE can convert when entering direct, I just need to calculate the 6.75 with other values and the comma won’t let me calculate, so I want to insert it with a dot. Anyone can 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;
  • Update your question by stating the line where you declare q_insere_itens_pedido. Knowing the type of this variable we can provide an example of your code using parameters instead of concatenating the values in the SQL command.

  • What kind of q_insere_itens_pedido? Failed to paste line declaring variable.

  • @Caffé q_insere_itens_requested is the name of the Tsqlquery component, thanks for the hint of sql Injection, but still continues the error : near "6.75" syntax error. This error occurs when I unquote, when I quote another error occurs: unrecognized token: "'6.75", with 3 quotes at the beginning and then 2

  • I edited my answer based on the code you added to your question. Don’t worry about quote, quotes, decimal separator... Instead, use variables with the data type you want to handle (rather than string), use parameters instead of concatenating values in the query, and let Delphi do the hard work for you.

1 answer

1


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

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

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

By concatenating in the SQL commands the values entered by the users, you are subject to risks of SQL Injection and is subject to problems with data formatting (not only decimal separator but also date format and apostrophes in strings) like this one you are facing.

I changed your code to consider using the following practices:

  • Variables that will treat 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;

Behold: Working With Tsqlquery

I don’t have Delphi installed so there might be compilation errors in my code (surely they will be simple to fix).

  • Thank you so much !! Helped gave too much straight and in addition to work I learned a lot with your code, thank you very much !! A pity that I can not vote in useful answer because it was my first question and I have to have 15 reputation points but as soon as I come back here to leave as very useful your answer. Ah I even put a function called troca_virgula_por_ponto that I created here because SGBD is SQLITE and when giving a select sum it only does the account if the field is with dot or is it set to dot and not comma, rsrs, but it worked !! Big hug

  • @Gianeric For nothing!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.