0

如果我使用参数,我正在使用 VB.NET 中的 MySQLCommand 对象进行 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'

问题主要来自我使用参数的事实,我该如何解决?

4

2 回答 2

0

你需要用这样的东西来修复你的代码。但请注意几件事。

如果@valeur 用单引号括起来,则它不再是参数占位符,而是字符串常量,并且不会使用与占位符关联的参数。

连接应始终包含在 using 语句中,以避免服务器上的危险资源消耗

如果您想要一个变量列表应用到传递的valeur,那么您需要绝对确保您的用户不允许键入critere的值。您应该提供某种控件,例如组合框或 dropdwonlist,其中用户只能在一组前缀值之间进行选择,然后您可以将标准变量连接到您的 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虽然方便,但却是许多错误的原因,因为它定义了查看接收到的参数的参数类型。当您直接从字符串传递日期或十进制数字时,这可能会以非常糟糕的方式结束。

于 2021-01-05T16:53:40.050 回答
0

很简单,因为 valeur 是一个字符串,所以您的查询需要如下

“选择 ID,来自 geography_unit 的描述,其中 Critere = '” & valeur & “'”

如果 valeur 是数字,则格式应如下“select ID,description from geography_unit where critere =” & valeur

请注意当变量是字符串时,单引号包含在变量周围的双引号中的区别。

于 2021-01-05T17:07:11.920 回答