ERRO DE SINTAXE

MAFACILITY2 28/07/2023 15:14:58
#501620
Alterado em 31/07/2023 14:27:41 TENHO ESSA CONSULTA:
RSPRODUTOS.Open "SELECT * From casa where valorvenda >= " & ValorSQL(pre1) & " " & _
"And valorvenda <= " & ValorSQL(pre2), Conexao, 3, 3

QUE ESTÁ FUNCIONANDO MUITO BEM. ESTOU QUERENDO ORDENÁ-LA PELO valorvenda.
COLOQUEI O ORDER BY VALORVENDA PARA ORDENÁ-LA, MAS ESTÁ DANDO ERRO.

CÓDIGO QUE ESTÁ DANDO ERRO:

RSPRODUTOS.Open "SELECT * From casa where valorvenda >= " & ValorSQL(pre1) & " " & _
"And valorvenda <= " & ValorSQL(pre2) order by valorvenda, Conexao, 3, 3

CÓDIGO INTEIRO:


Public Sub rel_pre()
Dim pre1 As Currency, pre2 As Currency 'faixa preco
pre1 = Maskpre1.Text
pre2 = Maskpre2.Text
RSPRODUTOS.Open "SELECT * From casa where valorvenda >= " & ValorSQL(pre1) & " " & _
"And valorvenda <= " & ValorSQL(pre2) order by valorvenda, Conexao, 3, 3
If Not RSPRODUTOS.EOF Then
Set rptCasa.DataSource = RSPRODUTOS
rptCasa.Title = "Relatório Imóvel por Faixa de Preço"
rptCasa.Show
Else
RSPRODUTOS.Close
MsgBox "Não foram encontrados Registros", vbInformation, "Aviso"
End If
Unload Me
Set Conexao = Nothing
Set RSPRODUTOS = Nothing
End Sub
KERPLUNK 28/07/2023 16:48:27
#501621
Em primeiro lugar você deveria estar usando comandos parametrizados, mais ou menos assim:

Dim pre1 As Currency, pre2 As Currency 'faixa preco
pre1 = Maskpre1.Text
pre2 = Maskpre2.Text

Dim cmd As ADODB.Command
Set cmd = New ADODB.Command

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

Dim sqlQuery As String
sqlQuery = "SELECT * FROM casa WHERE valorvenda >= ? AND valorvenda <= ? ORDER BY valorvenda"

With cmd
.ActiveConnection = Conexao
.CommandText = sqlQuery
.CommandType = adCmdText
.Parameters.Append .CreateParameter("pre1Param", adCurrency, adParamInput, , pre1)
.Parameters.Append .CreateParameter("pre2Param", adCurrency, adParamInput, , pre2)
End With

rs.Open cmd

If Not rs.EOF Then
Set rptCasa.DataSource = rs
rptCasa.Title = "Relatório Imóvel por Faixa de Preço"
rptCasa.Show
Else
rs.Close
MsgBox "Não foram encontrados Registros", vbInformation, "Aviso"
End If

rs.Close
Set rs = Nothing
Set cmd = Nothing
Unload Me
Set Conexao = Nothing

FUTURA 29/07/2023 10:08:17
#501623
A dica que o kerplunk passou deixa o seu código mais organizado, mas o erro q vc esta recebendo, deve ser porque não fechou aspas duplas após seu order by:

RSPRODUTOS.Open "SELECT * From casa where valorvenda >= " & ValorSQL(pre1) & " " & _
"And valorvenda <= " & ValorSQL(pre2) order by valorvenda", Conexao, 3, 3
KERPLUNK 29/07/2023 17:07:30
#501625
Resposta escolhida
Não só mais organizado, mas mais seguro e mais estável. Mais seguro, porque evita ataques de SQL injection, mais estável porque evita problemas de concatenação.
EPISCOPAL 29/07/2023 20:03:07
#501626
Citação:

Mais seguro, porque evita ataques de injeção de SQL



Que bicho é esse kerp ...... não sabia disso ...... explica ai!!!!
KERPLUNK 31/07/2023 15:50:36
#501628
Digamos que você faça a seguinte rotina, uma simples busca de cliente por código:

Dim codigo As String
codigo = txtCodigoCliente.Text

Dim cmd As ADODB.Command
Set cmd = New ADODB.Command

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

Dim sqlQuery As String
sqlQuery = "SELECT * FROM cliente WHERE codigo = " & codigo

With cmd
.ActiveConnection = Conexao
.CommandText = sqlQuery
.CommandType = adCmdText
End With

rs.Open cmd

If Not rs.EOF Then
Set rptCasa.DataSource = rs
rptCasa.Title = "Relatório Imóvel por Faixa de Preço"
rptCasa.Show
Else
rs.Close
MsgBox "Não foram encontrados Registros", vbInformation, "Aviso"
End If

rs.Close
Set rs = Nothing
Set cmd = Nothing
Unload Me
Set Conexao = Nothing



Então na caixa de texto da procura digite:
0 or 1 = 1; DROP TABLE Cliente;

O que vai acontecer, é que a query vai ficar:
SELECT * FROM cliente WHERE codigo = 0 or 1 = 1; DROP TABLE Cliente;

O select(primeira instrução) vai executar normal, não trazendo nada e a segunda instrução será executada, deletando a tabela Cliente.
KERPLUNK 31/07/2023 15:54:40
#501629
Pode-se ainda ser mais criativo, retornando até mesmo a estrutura do banco, dados de outras tabelas, incluindo de login se estiverem disponíveis... enfim, SQL injection, XSS, comando de OS, SSTI, HTTP Header enfim, tem um monte de ataques que podem ser catastróficos.
MAFACILITY2 02/08/2023 09:38:08
#501631

Citação:

Em primeiro lugar você deveria estar usando comandos parametrizados, mais ou menos assim:Dim pre1 As Currency, pre2 As Currency 'faixa precopre1 = Maskpre1.Textpre2 = Maskpre2.TextDim cmd As ADODB.CommandSet cmd = New ADODB.CommandDim rs As ADODB.RecordsetSet rs = New ADODB.RecordsetDim sqlQuery As StringsqlQuery = "SELECT * FROM casa WHERE valorvenda >= ? AND valorvenda <= ? ORDER BY valorvenda"With cmd .ActiveConnection = Conexao .CommandText = sqlQuery .CommandType = adCmdText .Parameters.Append .CreateParameter("pre1Param", adCurrency, adParamInput, , pre1) .Parameters.Append .CreateParameter("pre2Param", adCurrency, adParamInput, , pre2)End Withrs.Open cmdIf Not rs.EOF Then Set rptCasa.DataSource = rs rptCasa.Title = "Relatório Imóvel por Faixa de Preço" rptCasa.ShowElse rs.Close MsgBox "Não foram encontrados Registros", vbInformation, "Aviso"End Ifrs.CloseSet rs = NothingSet cmd = NothingUnload MeSet Conexao = Nothing



FUNCIONOU PERFEITAMENTE. SÓ PRECISEI RETIRAR DO CÓDIGO O ÚLTIMO FECHAMENTO(rs.Close), que estava provocando erro. Muito obrigado.
Tópico encerrado , respostas não são mais permitidas