我的查询在 MySQL 工作台中运行,但不在我的 VB.NET 代码中,我正在尝试将 3 个变量内容合并到一行中



我有一个程序可以读取数据并输入到数据库中,这是我的查询:

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应该为您提供要使用的枚举值的提示。

最新更新