Mysql Vb.net参数化查询未传递值
我正在将一个以前在SQLServer2008后端运行的vb.net应用程序转换为MySQL。我在使用参数化查询时遇到了一些问题。 下面是我正在使用的代码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
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实例规则而不同,这因供应商而异):
现在我们有了一个正确的参数化查询,我将介绍您的更新:
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"