如何将 MySQL 查询中的单引号与 VB.NET 参数连接起来?
How to concatenate single quote in MySQL query with VB.NET parameter?
我正在使用 VB.NET 中的 MySQL 命令对象进行 MySQL Select 查询,我使用的是参数。我遇到了一个问题,在我的 where 子句中,我需要将标准的值放入单引号中,我尝试使用反斜杠 ' (\') 来转义单引号,但它不起作用。我也使用双引号,同样的问题。有人可以帮我吗?在 VB.NET 中使用带有参数的 MySQLCommand 对象并希望我的参数值在查询中用单引号引起来时,我需要做一些具体的事情吗?
这是我在其中进行 MySQL 查询的函数:
Public Shared Function getGeographyUnits(critere As String, valeur As String) As List(Of geography_unit)
Dim conn As MySqlConnection = DBUtils.GetDBConnection()
Dim rdr As MySqlDataReader
conn.Open()
Dim cmd As MySqlCommand = New MySqlCommand("select ID,description from geography_unit where @critere = ''@valeur''", conn)
cmd.Parameters.AddWithValue("@critere", critere)
cmd.Parameters.AddWithValue("@valeur", valeur)
rdr = cmd.ExecuteReader()
Dim geography_units As New List(Of geography_unit)
While rdr.Read
Dim geography_unit As New geography_unit
Try
geography_unit.ID = CLng(rdr("Id"))
geography_unit.description = rdr("description")
Catch ex As Exception
End Try
geography_units.Add(geography_unit)
End While
rdr.Close()
conn.Close()
Return geography_units
End Function
实际上,我希望我的查询的 cmdText 在渲染后是这样的:
select ID,description from geography_unit where critere = 'valeur'
问题主要是我用的是参数,请问如何解决?
您需要用类似的方法修复您的代码。但请注意一些事情。
如果@valeur 用单引号引起来,它就不再是参数占位符而是字符串常量,与占位符关联的参数将不会被使用。
连接应始终包含在 using 语句中,以避免服务器上的危险资源消耗
如果你想要一个可变的字段列表,应用 valeur 传递,那么你需要绝对确保你的用户不允许输入值 标准。您应该提供某种控件,如 combobox 或 dropdwonlist,其中用户只能在一组前缀值之间进行选择,然后您可以将 critere 变量连接到您的 sql 命令。
Public Shared Function getGeographyUnits(critere As String, valeur As String) As List(Of geography_unit)
Using conn As MySqlConnection = DBUtils.GetDBConnection()
Dim sqlText As String = "select ID,description from geography_unit"
conn.Open()
If Not String.IsNullOrEmpty(critere) Then
sqlText = sqlText & " where " & critere & " = @valeur"
End If
Dim cmd As MySqlCommand = New MySqlCommand(sqlText, conn)
cmd.Parameters.Add("@valeur", MySqlDbType.VarChar).Value = valeur
Using rdr As MySqlDataReader = cmd.ExecuteReader()
Dim geography_units As New List(Of geography_unit)
While rdr.Read
Dim geography_unit As New geography_unit
Try
geography_unit.ID = CLng(rdr("Id"))
geography_unit.description = rdr("description")
Catch ex As Exception
End Try
geography_units.Add(geography_unit)
End While
End Using
' rdr.Close() not needed when inside using
' conn.Close() not needed when inside using
Return geography_units
End Using
End Function
另外值得注意的一点是我使用 Add 方法将参数添加到集合中。 AddWithValue 虽然方便,但却是 lot of bugs 的原因,因为它定义了查看接收到的参数的参数类型。当您直接从字符串传递日期或小数时,这可能会非常糟糕。
很简单,因为valeur是一个字符串那么你的查询需要如下
"select ID,来自 geography_unit 的描述 where critere = '" & valeur & "'"
如果 valeur 是数字那么格式应该如下
"select ID,来自 geography_unit 的描述,其中 critere = " & valeur
注意当变量是字符串时单引号包含在双引号内的区别。
我正在使用 VB.NET 中的 MySQL 命令对象进行 MySQL Select 查询,我使用的是参数。我遇到了一个问题,在我的 where 子句中,我需要将标准的值放入单引号中,我尝试使用反斜杠 ' (\') 来转义单引号,但它不起作用。我也使用双引号,同样的问题。有人可以帮我吗?在 VB.NET 中使用带有参数的 MySQLCommand 对象并希望我的参数值在查询中用单引号引起来时,我需要做一些具体的事情吗?
这是我在其中进行 MySQL 查询的函数:
Public Shared Function getGeographyUnits(critere As String, valeur As String) As List(Of geography_unit)
Dim conn As MySqlConnection = DBUtils.GetDBConnection()
Dim rdr As MySqlDataReader
conn.Open()
Dim cmd As MySqlCommand = New MySqlCommand("select ID,description from geography_unit where @critere = ''@valeur''", conn)
cmd.Parameters.AddWithValue("@critere", critere)
cmd.Parameters.AddWithValue("@valeur", valeur)
rdr = cmd.ExecuteReader()
Dim geography_units As New List(Of geography_unit)
While rdr.Read
Dim geography_unit As New geography_unit
Try
geography_unit.ID = CLng(rdr("Id"))
geography_unit.description = rdr("description")
Catch ex As Exception
End Try
geography_units.Add(geography_unit)
End While
rdr.Close()
conn.Close()
Return geography_units
End Function
实际上,我希望我的查询的 cmdText 在渲染后是这样的:
select ID,description from geography_unit where critere = 'valeur'
问题主要是我用的是参数,请问如何解决?
您需要用类似的方法修复您的代码。但请注意一些事情。
如果@valeur 用单引号引起来,它就不再是参数占位符而是字符串常量,与占位符关联的参数将不会被使用。
连接应始终包含在 using 语句中,以避免服务器上的危险资源消耗
如果你想要一个可变的字段列表,应用 valeur 传递,那么你需要绝对确保你的用户不允许输入值 标准。您应该提供某种控件,如 combobox 或 dropdwonlist,其中用户只能在一组前缀值之间进行选择,然后您可以将 critere 变量连接到您的 sql 命令。
Public Shared Function getGeographyUnits(critere As String, valeur As String) As List(Of geography_unit)
Using conn As MySqlConnection = DBUtils.GetDBConnection()
Dim sqlText As String = "select ID,description from geography_unit"
conn.Open()
If Not String.IsNullOrEmpty(critere) Then
sqlText = sqlText & " where " & critere & " = @valeur"
End If
Dim cmd As MySqlCommand = New MySqlCommand(sqlText, conn)
cmd.Parameters.Add("@valeur", MySqlDbType.VarChar).Value = valeur
Using rdr As MySqlDataReader = cmd.ExecuteReader()
Dim geography_units As New List(Of geography_unit)
While rdr.Read
Dim geography_unit As New geography_unit
Try
geography_unit.ID = CLng(rdr("Id"))
geography_unit.description = rdr("description")
Catch ex As Exception
End Try
geography_units.Add(geography_unit)
End While
End Using
' rdr.Close() not needed when inside using
' conn.Close() not needed when inside using
Return geography_units
End Using
End Function
另外值得注意的一点是我使用 Add 方法将参数添加到集合中。 AddWithValue 虽然方便,但却是 lot of bugs 的原因,因为它定义了查看接收到的参数的参数类型。当您直接从字符串传递日期或小数时,这可能会非常糟糕。
很简单,因为valeur是一个字符串那么你的查询需要如下
"select ID,来自 geography_unit 的描述 where critere = '" & valeur & "'"
如果 valeur 是数字那么格式应该如下 "select ID,来自 geography_unit 的描述,其中 critere = " & valeur
注意当变量是字符串时单引号包含在双引号内的区别。