【问题标题】:Passing @(at sign)-variables to MySQL将@(at 符号)-变量传递给 MySQL
【发布时间】:2011-11-11 08:48:39
【问题描述】:

我对 VB.NET 还很陌生,所以当我遇到错误时我会进行大量研究。问题是我找不到解决方案,或者任何远程处理它。

我正在开发用于连接到远程 mysql 服务器、运行查询并返回数据集的软件。我已经通过 mysql 提示符对服务器运行了这个查询,并成功收到了结果。但是当我尝试从我的应用程序运行这个查询时,我得到一个对象引用错误。

通过调试,我发现用于 sql 字符串中的变量的 @ 字符导致了我的代码中的问题,但是我无法找到一种方法将此查询传递给服务器,而不会出现 Visual Studio 引发错误。我发现的关于变量使用的每个答案都建议在我的代码中明确规定变量值,我不想这样做。

这是我的一些代码和我的查询:

Dim mysqlCon As MySqlConnection = New MySqlConnection("Server=" & arrArgs & ";Database=DBNAME;Uid=USER;Pwd=PASS;allow zero datetime=true;")
Dim mysqlString As String = "set @from_scanner = '" & code & "'; set @code='', @altbarcode='', @qty='1', @price='',@Altprice='0', @date_start='',@date_end='',@disc_price='0',@description='', @altdescription=''; set @from_scanner=if(left(@from_scanner,2)='FF',trim(substring(@from_Scanner,3,13)),trim(substring(@from_Scanner,2,13))); select code, altbarcode,description, qty, price into @code, @altbarcode,@altdescription, @qty, @Altprice from altbar where altbarcode=@from_scanner; set @code=if(@code='',@from_Scanner,@code); select disc_price, date_end into @disc_price, @date_end from plu where (code=trim(left(@code,12)) or def_barcode=@code) and current_date between date_start and date_end and disc_price<>price and disc_price<>0; select price, description into @price, @description from plu where code=trim(left(@code,12)) or def_barcode=@code; set @price=if(ifnull(@disc_price,0)=0 or @disc_price='', @price,@disc_price); set @price=if(@qty>1 and @Altprice > 0, @Altprice, @price*@qty); set @description=if(@altdescription<>'', @Altdescription, @description); select @code, format(@price,2) Price, @description,@date_end;"
Dim mysqlCom As MySqlCommand = New MySqlCommand(mysqlstring, mysqlCon)
Dim mysqlAdapter As New MySqlDataAdapter
Dim mysqlData As New DataSet

mysqlCon.Open()

mysqlAdapter.SelectCommand = mysqlCom
mysqlAdapter.Fill(mysqlData, "tblDBData")

所以我真正需要知道的是如何将此查询传递到 mysql 服务器而不在 VB 中引起问题。

【问题讨论】:

    标签: .net mysql vb.net variables ado.net


    【解决方案1】:

    查询本身的字段名称中不应包含 @。只有您要替换为值的变量。我会给你一个非常简单的 sql 查询来更新表中的一行,例如:

    Dim sqlString as String = "UPDATE tableName SET Disc_Price=@Price WHERE Code=@Code"
    

    在这种情况下,tableName 是表的名称,Disc_Price 是列名,Code 是列名。它会将 Disc_Price 字段中的值更新为您告诉它@Price 的值,对于与代码字段中的@Code 匹配的行。

    然后你设置命令并定义查询参数:

    Dim cmd As New MySqlCommand(sqlString, mysqlConn)
    cmd.Parameters.AddWithValue("@Price", 1.25)
    cmd.Parameters.AddWithValue("@Code",WhateverCodeHere)
    
    cmd.ExecuteNonQuery()
    

    确保查询中只有你的参数/sql变量有@,你应该没问题。

    我还在您的字符串中注意到,表名和 UPDATE 关键字不在您的 SET 查询字符串中。

    【讨论】:

    • 感谢您的快速响应。
    • 我的问题是我传递给服务器的唯一信息是来自扫描仪的项目代码,我通过 VB 变量“代码”发送它。我在查询中创建了 mysql 变量,因为查询本身完成了所有工作并在对数据库执行查询时分配/重新分配 mysql 变量。以这种方式,mysql 服务器完成所有工作,只向 VB 提供一条记录作为数据集。我不想在 VB 中设置变量值。我想将变量容器传递给 mysql 并让查询填写值。
    • 我明白你的意思了。不幸的是,我认为你被困住了。我很确定,在这种情况下,您将不得不用代码中的 queryString 中的查询实际替换 sql 变量。对不起,我没有更多帮助:(
    猜你喜欢
    • 2023-03-09
    • 2015-12-26
    • 1970-01-01
    • 2021-08-10
    • 2021-12-20
    • 2015-08-24
    • 2016-10-11
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多