我的目标是创建一些函数,这些函数将帮助我创建大量的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。这是在问一个类似的问题。但是,这与我所遇到的问题不同。
提前致谢。
答案 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))
......它应该有效(并且安全)!