从多个连接字符串

时间:2017-09-06 12:26:20

标签: mysql vb.net string-concatenation parameterized-query

我的目标是创建一些函数,这些函数将帮助我创建大量的MySqlCommand。但我错了(下面提供的信息)。

背景

我通过在类中定义常量来实现这一点,例如:

Public Const Create_Table = "CREATE TABLE IF NOT EXISTS `@arg0` (@arg1)"

这样的字符串构成了我的参数化查询的基础。现在,这些参数不是单个值,它们实际上是连接的字符串。所以我知道我在这里正走向危险的水域,所以请在这里忍受。

我使用以下函数来连接参数:

Public Shared Function ListToQuery(values As List(Of String),
                                   Optional ByVal separator As String = ", ") As String
    Dim queryBuilder As New StringBuilder

    For Each value As String In values
        queryBuilder.Append((value) & separator)
    Next
    Dim query As String = queryBuilder.ToString
    Return query.Remove(query.Length - 2)
End Function

按正常方式工作;当我用List打电话时:

Dim myValues As New List(Of String)
myValues.AddRange({"Int Primary", "Text Name"})
MsgBox(ListToQuery(myValues))

返回"Int Primary, Text Name" - 完全正常。 然而,这是事情开始出错的地方。

我的下一部分是基于几个参数创建MySqlCommand,一个String的数组。这可以通过调用以下函数来实现:

Public Shared Function BuildCommand(args() As String, Command As String, connection As MySqlConnection) As MySqlCommand

    Dim cmd As New MySqlCommand(Command, connection)
    For i As Integer = 0 To args.Length - 1
        'cmd.CommandText = cmd.CommandText.Replace("@arg" & i, args(i))
        cmd.Parameters.AddWithValue("@arg" & i, MySqlHelper.EscapeString(args(i)))
    Next
    Return cmd

End Function

问题

我通过这样做来调用这个函数:

Dim myCommand as MySqlCommand = BuildCommand({"MyTableName", ListToQuery(myValues)}, Create_Table, myConnection)
Dim dr = myCommand.ExecuteReader()

似乎发生了什么,这里发生了一个错误,我选择了一些似乎在参数化查询中出现的东西:

  

您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以便在第1行的“Int Primary,Text Name”附近使用正确的语法

如果我正确地解释了这个错误,那么这个参数似乎已被封装在'中。现在请注意我的代码BuildCommand()中的注释。如果我使用纯级联,那么该查询就可以正常运行。

修改:生成的查询应为:

  

CREATE TABLE IF NOT NOT EXISTS`MyTableName`(Int Primary,Text Name)

问题

事实上,我有一对夫妇。首先,我想询问这是否是一种安全的方式(即使连接我的参数并在查询中使用参数)来运行命令,其次,我怎样才能避免出现此错误?

我不太确定我是否可以单独解析每个参数而不会导致查询变得“不安全”或者没有修改一般的MySQL语句。

我一直在与其他用户讨论这个问题,他设法找到了这个问题:Parameterized dynamic sql query。这是在问一个类似的问题。但是,这与我所遇到的问题不同。

提前致谢。

2 个答案:

答案 0 :(得分:0)

此函数生成CREATE TABLE命令。我多次遇到同样的问题,但直到现在我才找到合适的解决方案。相反,我创建了自己的查询:

    Public Shared Function BuildCommand(args() As String, connection As MySqlConnection) As MySqlCommand
    Dim sb As New StringBuilder
    Dim cmd As New MySqlCommand
    cmd.Connection = connection
    sb.Append("CREATE TABLE IF NOT EXISTS`")
    sb.Append(args(0))
    sb.Append("`(")
    For i As Integer = 1 To args.Length - 1
        sb.Append("`")
        sb.Append(args(i))
        sb.Append("`,")
    Next
    sb.Remove(sb.Length - 1, 1)
    sb.Append(")")
    cmd.CommandText = sb.ToString
    Return cmd
End Function

答案 1 :(得分:0)

此代码与您之前展示的代码不同,但现在我看到您所做的更改以及您使用的内容变得更加容易。

添加SQL参数时,您无需转义其值,因为这是自动完成的。这可能是您遇到两次转义的原因。

变化:

cmd.Parameters.AddWithValue("@arg" & i, MySqlHelper.EscapeString(args(i)))

为:

cmd.Parameters.AddWithValue("@arg" & i, args(i))

......它应该有效(并且安全)!