Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Vb.net参数化查询未传递值_Mysql_Vb.net - Fatal编程技术网

Mysql Vb.net参数化查询未传递值

Mysql Vb.net参数化查询未传递值,mysql,vb.net,Mysql,Vb.net,我正在将一个以前在SQLServer2008后端运行的vb.net应用程序转换为MySQL。我在使用参数化查询时遇到了一些问题。 下面是我正在使用的代码 cmd.CommandText = "select A.Product_Code,A.Product_Name from Product_Master A inner join Barcode B on A.Product_Code=B.Product_code where B.Batch_no=@bno and A.Product_del

我正在将一个以前在SQLServer2008后端运行的vb.net应用程序转换为MySQL。我在使用参数化查询时遇到了一些问题。 下面是我正在使用的代码

cmd.CommandText = "select   A.Product_Code,A.Product_Name from Product_Master A inner join Barcode B on A.Product_Code=B.Product_code where B.Batch_no=@bno and A.Product_del=0 and B.product_type=@type Limit 1"
AssignConnection(cmd)
If ConnectToDB() Then
      With cmd
         .Parameters.Add("@bno", txtBatchno.Text)
         .Parameters.Add("@type", IIf(Me.Tag = 0, "SFG", "W"))
      End With
此外,我还检查了添加参数,如
cmd.Parameters.AddWithValue(“@bno”,txtBatchno.Text)
cmd.Parameters.Add(新的MySqlParameter(“@type”,IIf(Me.Tag=0,“SFG”,“W”))
,但发现这些都不起作用

同一个查询保存参数中的值,我已经使用即时窗口进行了验证。我还尝试在Workbench中运行结果查询,并在那里得到了值

感谢您的帮助,因为我的时间所剩无几

更新:

为了知道传递给db的查询字符串是什么,我尝试使用以下代码

Dim query As String = cmd.CommandText
        For Each p As MySqlParameter In cmd.Parameters
            query = query.Replace(p.ParameterName, p.Value.ToString())
        Next

并发现值在没有单个qoutes(')的情况下传递
,并且查询在workbench中也给出了错误。

好的,我将对此进行分解,以便稍后参考如何参数化SQL查询以防止SQL注入攻击。当您参数化查询时,您不再需要执行字符串连接,您的示例仍然显示了您正在执行的操作:

cmd.CommandText = "select   A.Product_Code,A.Product_Name from Product_Master A inner join Barcode B on A.Product_Code=B.Product_code where B.Batch_no='" & txtBatchno.Text & "' and A.Product_del=0 and B.product_type='" & IIf(Me.Tag = 0, "SFG", "W") & "' Limit 1"
要正确地进行参数化,应该是这样的(根据参数的SQL server实例规则而不同,这因供应商而异):

现在我们有了一个正确的参数化查询,我将介绍您的更新:

  • 参数值从不包含单引号。根据要参数化的列的数据类型,您可以完成所有这些

  • 如果任何查询工具都无法识别您的参数化,那么编写的查询几乎都会失败。这里的诀窍是要知道,如果没有提示您输入查询中包含的参数变量的值,您将不得不更改参数的结构(通常是t-SQL(MSSQL)中的@prefers变量),已经足够长了,我想不起来是否可以在参数化查询中使用相同的语法。在Oracle中,您可以使用?并按外观顺序提供值,或者使用命名,前面加:)

  • cmd.Parameters.Add()
    是一个已经过时的旧重载。这不是你想的那样


    您需要使用
    .AddWithValue()。。。还有一些。

    记不起我上次做这件事是什么时候了,但不是为了像.Parameters.Add(“@name”,DataType)那样。Value=MyValuei我也尝试过同样的方法。但是结果是一样的。。像“gives a error”或“it not work”或类似的表达方式对你没有帮助(你可以快速得到答案,而且答案是可靠的). 快速查看后,您的代码错误的原因有很多:首先,
    Me.Tag
    是一个对象,因此
    Me.Tag=0
    可能会引发问题(也就是说,它可能在您的特定条件下工作,但也可能失败。也许您应该编写
    Option Strict On
    什么可以避免这种不太正确的情况发生)。但更重要的是:
    cmd.Parameters.Add(
    有各种各样的重载,没有一个……接受你正在做的事情。为什么不明确地最大化VS的帮助?它明确地告诉你每个函数期望的参数。为什么不明确地遵循它的建议?你能正确地分析你的代码/情况,消除所有明显的错误,并提出一个主题问题吗(即,可能与对给定情况有基本了解的其他人有关的问题)?能否使用所使用的确切查询文本更新您的问题?在上面的示例中,您不使用参数,并且将它们添加到命令参数集合中是无用的,因为查询不包含任何参数占位符。在这种情况下,您的更新没有意义,除了概念上错误之外,您在这里替换的是什么?替换后,您如何更新命令的CommandText?谢谢您的回答。但这是我的错误。我在问题中发布的查询实际上是一种解决方法,用于检查其是否存在除参数接受值以外的其他错误。我已用我使用的实际代码更新了我的问题,这与您的查询中给出的代码相同(同样的错误是,
    输入字符串的格式不正确
    ),但使用相同的
    .AddWithValue()
    传递单个qoutes(')时出错或者一些特殊字符。使用参数化时,它不会执行通常的转义操作。查询参数从不转义数据!它们隔离数据。这是一个需要理解的重要区别。这意味着您用于查看实际sql查询的代码与您认为的不同。使用AddWithValue()时会出现什么错误?诸如和:“AddWithValue非常非常邪恶:它只是根据您提供的参数值派生实际的数据类型。永远不要使用它!”之类的文章建议,甚至将方法名称作为可能的建议也可能不是一个好主意。
    cmd.CommandText = "select   A.Product_Code,A.Product_Name from Product_Master A inner join Barcode B on A.Product_Code=B.Product_code where B.Batch_no=@bNo and A.Product_del=0 and B.product_type=@type Limit 1"