[RESOLVIDO] Dúvida com PreparedStatement

10 respostas
Kura

Fala, galera. Eu queria saber qual, ou se tem, diferença em, numa estrutura sql, colocar “?” ao invés do dado direto.

Exemplo:

String sql = "SELECT C_Payment_ID, C_Currency_ID, PayAmt,"
            + " paymentAvailable(C_Payment_ID), C_BPartner_ID "
            + "FROM C_Payment_v p "
            + "WHERE AD_Client_ID=?"            //    ##1
            + " AND IsAllocated='N' AND C_BPartner_ID IS NOT NULL"
            + " AND C_Charge_ID IS NULL"
            + " AND DocStatus IN ('CO','CL')"
        //    Only BP with Dunning defined
            + " AND EXISTS (SELECT * FROM C_BPartner bp "
                + "WHERE p.C_BPartner_ID=bp.C_BPartner_ID"
                + " AND bp.C_Dunning_ID=(SELECT C_Dunning_ID FROM C_DunningLevel WHERE C_DunningLevel_ID=?))";    // ##2
        if (p_C_BPartner_ID != 0)
            sql += " AND C_BPartner_ID=?";        //    ##3
        else if (p_C_BP_Group_ID != 0)
            sql += " AND EXISTS (SELECT * FROM C_BPartner bp "
                + "WHERE p.C_BPartner_ID=bp.C_BPartner_ID AND bp.C_BP_Group_ID=?)";    //    ##3
        if (p_OnlySOTrx)
            sql += " AND IsReceipt='Y'";
       
        int count = 0;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try
        {
            pstmt = DB.prepareStatement (sql, get_TrxName());
            pstmt.setInt (1, getAD_Client_ID());
            pstmt.setInt (2, m_run.getC_DunningLevel_ID());
            if (p_C_BPartner_ID != 0)
                pstmt.setInt (3, p_C_BPartner_ID);
            else if (p_C_BP_Group_ID != 0)
                pstmt.setInt (3, p_C_BP_Group_ID);
.
.
.

Ao invés desses pstmt.set, colocar o valor direto no sql.

Grato,

Rafael

10 Respostas

thiago.correa

usa Statement e concatena o valor algo do tipo

WHERE AD_Client_ID=" + clienteId;

aonde clienteId é um atributo, parâmetro de método ou variável.

Enfim :smiley:

Kura

Sim. Esse é o jeito que eu faço, mas como sempre vejo isso nos códigos, resolvi perguntar se há alguma vantagem em usar as “?” ao invés do código direto que foi o que vc escreveu (e que é como eu uso).
Se não há diferença então só atrapalha, né? pq fica mais confuso e o código fica maior. Tem que ter um porém…

thiago.correa

Não, pelo contrário, é melhor e mais rápido, os PreperedStatement são pré-compilados, o que faz com que o código seja executado mais rápido, além do mais que, concatenação de String é oneroso demais, pense, para cada ‘+’ é uma nova string que se cria, além das duas partes que estão sendo concatenadas.

Outra coisa, para fazer where com um campo varchar no old style você precisa fazer uma gambi do tipo

Stirng sql = “select * from dual where nome = '” + nome + “’”

repare na aspa simples antes e depois da concatenação, isso é fácil de passar desapercebido.

Kura

Hmm, cara. Entendi.
Muito obrigado mesmo!

Nykolas_Lima

Olha acho que o que o thiago disse ai pode até estar certo, mas a maior vantagem de usar o preparedStatment é evitar o SQL-Injection

Voce tem um sistema de vendas, quando a pessoa submete a venda voce salva os dados da venda e por exemplo uma tag como “Conta Paga”, se a pessoa conhecer o banco ela pode ir no form e digitar um dado dela e por um código SQL no input text.
Ex:Nome: Josézinho’, contaPaga = 1

Ele estaria mudando uma coisa no banco que ele nao deveria mudar, já o preparedStatment evita isso.

Deve ter algumas coisas na net sobre SQL-Injection é só dar uma procurada

flw

Kura

Vou pesquisar sim, Frango.
Muito obrigado pela dica!

thiago.correa

Frango:
Olha acho que o que o thiago disse ai pode até estar certo, mas a maior vantagem de usar o preparedStatment é evitar o SQL-Injection

Voce tem um sistema de vendas, quando a pessoa submete a venda voce salva os dados da venda e por exemplo uma tag como “Conta Paga”, se a pessoa conhecer o banco ela pode ir no form e digitar um dado dela e por um código SQL no input text.
Ex:Nome: Josézinho’, contaPaga = 1

Ele estaria mudando uma coisa no banco que ele nao deveria mudar, já o preparedStatment evita isso.

Deve ter algumas coisas na net sobre SQL-Injection é só dar uma procurada

flw


PS não evita SQL Injection!!!

jingle

Nunca usei PS mas sempre achei que sua maior vantagem era evitar sql injection, tava até pensando em alterar meu sistema pra poder usar ele, mas se não evita vou pensar se vale mesmo a pena mudar

thiago.correa

Vale a pena mudar para fins de preformance e pelo fato da manutenção do código ficar mais fácil, a única coisa que evida SQL Injection é validações!

Kura

Bom… eu tinha perguntado o que evita SQL-Injection e não tinha visto a resposta acima.
=P

Criado 23 de março de 2009
Ultima resposta 24 de mar. de 2009
Respostas 10
Participantes 4