Я собираюсь создать несколько функций, которые помогут мне в создании множества 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
Это работает как обычно; когда я называю это списком:
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, на предмет правильного синтаксиса для использования рядом с «Int Primary, Text Name») в строке 1.
Аргумент, кажется, был инкапсулирован в '
, если я правильно интерпретирую эту ошибку. Теперь обратите внимание на комментарий в моем коде для BuildCommand()
. Если бы я использовал чистую конкатенацию, этот запрос работал бы нормально.
Изменить: результирующий запрос должен был выглядеть так:
СОЗДАЙТЕ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ `MyTableName` (Int Primary, Text Name)
Вопрос
У меня есть парочка, на самом деле. Во-первых, я хотел бы спросить, является ли это безопасным способом (т.е. даже с объединением моих аргументов и использованием параметров в запросе) для запуска команды, а во-вторых, как я могу избежать этой ошибки?
Я не совсем уверен, смогу ли я проанализировать каждый аргумент по отдельности, не сделав запрос «небезопасным» или не изменив общий оператор MySQL.
Я обсуждал это с другим пользователем, и ему удалось найти этот вопрос: параметризованный динамический запрос sql. Это задает аналогичный вопрос. Однако это не та же проблема, что и у меня.
Заранее спасибо.
.AddWithValue()
- и почему бы мне не использовать это? Кроме того, сгенерированный запрос в этом примере должен был бытьCREATE TABLE IF NOT EXISTS ``MyTableName`` (Int Primary, Text Name)
(не обращайте внимания на двойное `- форматирование синтаксиса в комментариях раздражает) - person Ally   schedule 06.09.2017