我有一个程序可以读取数据并输入到数据库中,这是我的查询:
Dim command As New MySqlCommand("UPDATE long_short_parameters SET ativo_compra = '" & ativo_compra & "', ativo_venda = '" & ativo_venda & "', ratio_entrada = '" & ratio_entrada & "', ratio_stop = '" & ratio_stop & "', ratio_alvo_saida = '" & ratio_alvo_saida & "', title_operation = '" & title_operation & "', data_hora = '" & data & "' WHERE id = '" & id & "'", connection)
我收到这个错误消息:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CMIG4 x '03/12/2021 14:30:09 '', data_hora = '03/12/2021 14:30:09', WHERE id = ' at line 1
但当我在mysql工作台中运行它时,它运行良好(只要我用正确的值替换变量(
14:47:57 UPDATE long_short_parameters SET ativo_compra = 'CMIG4', ativo_venda = 'CSAN3', ratio_entrada = '0.45', ratio_stop = '0.40', ratio_alvo_saida = '0.12', title_operation = 'CMIG4 x CSAN3', data_hora = '03/12/2021 14:30:09' WHERE id = '13' 1 row(s) affected Rows matched: 1 Changed: 1 Warnings: 0 0.141 sec
这是变量值附加的地方
Dim id = DataGridView2.Rows(DataGridView2.CurrentCellAddress.Y).Cells(0).Value
Dim ativo_compra = DataGridView2.Rows(DataGridView2.CurrentCellAddress.Y).Cells(2).Value
Dim ativo_venda = DataGridView2.Rows(DataGridView2.CurrentCellAddress.Y).Cells(3).Value
Dim ratio_entrada = DataGridView2.Rows(DataGridView2.CurrentCellAddress.Y).Cells(4).Value
Dim ratio_stop = DataGridView2.Rows(DataGridView2.CurrentCellAddress.Y).Cells(5).Value
Dim ratio_alvo_saida = DataGridView2.Rows(DataGridView2.CurrentCellAddress.Y).Cells(6).Value
Dim data = System.DateTime.Now
Dim title_operation = "'" & ativo_compra & " x " & ativo_venda & " x " & data & "'"
我的工作取决于此,所以我希望能得到一些帮助。
由于不使用参数,查询失败。其中一个值包含一个或多个单引号,这会混淆解析器,因为它无法理解之类的内容
...title = 'CMIG4 x '03/12/2021 14:30:09 ''...
字符串值从哪里开始,从哪里结束?。
日期周围的单引号欺骗了解析器,解析器认为该值在x'之后结束。然后它遇到了一些无法解释为有效sql语法的文本
因此,唯一明智的选择是始终使用参数化查询,因为上面的代码只是连接字符串以形成sql命令时可能出现的众多问题之一。
例如,看看Sql注入黑客可以对数据库做些什么。
下面介绍一下应该如何执行。
首先创建命令并从命令文本中删除所有串联。插入参数占位符而不是变量。
Dim command As New MySqlCommand("UPDATE long_short_parameters
SET ativo_compra = @ativo, ativo_venda = @venda,
ratio_entrada = @ratio_e, ratio_stop = @ratio_s,
ratio_alvo_saida = @ratio_as, title_operation = @title,
data_hora = @data WHERE id = @id", connection)
现在你有一个单一的";非级联的";字符串易于阅读和理解。在下一步中,您将添加参数及其值到命令。
command.Parameters.Add("@ativo", MySqlDbType.VarChar).Value = ativo_compra
command.Parameters.Add("@venda", MySqlDbType.VarChar).Value = ativo_venda
... and continue with the others parameter placeholders
最后你可以执行命令
command.ExecuteNonQuery()
请注意,我已经使用MySqlDbType.VarChar来定义参数值类型。这应该进行调整以匹配字段的真实类型。Visual Studio Intellisense应该为您提供要使用的枚举值的提示。