我正在将一个以前在SQL Server 2008上运行的vb.net应用程序转换为MySQL.I卡在我使用参数化查询的某个部分。 以下是我正在使用的代码。
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(New 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
并发现值正在传递without single qoutes(')
并且查询在工作台中也会出错。
答案 0 :(得分:1)
好的,打破这一点,以便稍后我可以参考如何参数化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服务器实例规则而变化,因供应商而异):
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"
现在我们已经获得了正确参数化的查询,我将解决您的更新:
参数值从不包含单引号。根据您要参数化的列的数据类型,这一切都得到了照顾。
如果没有识别您的参数化,那么查询将在几乎所有查询工具中写入WILL FAIL。这里的诀窍是要知道,如果没有提示您查询中包含的参数变量的值,则必须更改参数的结构(通常@在T-SQL中的变量前面) (MSSQL),已经足够长了以至于我不记得你是否可以在参数化查询中使用相同的语法。在Oracle中,你可以使用?并按照外观的顺序提供值,或者使用named,以及之前的:)
答案 1 :(得分:0)
cmd.Parameters.Add()
是一个旧的重载,现在已经过时了。它没有做你想的。
您需要使用.AddWithValue()
甚至更好,使用允许您指定参数类型的.Add()
重载之一...并且有一些reasons why you should choose the latter。