Выбери строку (добавить косые черты) в VB.net?

Очень простой вопрос (на удивление, я не могу найти подобный вопрос в любом месте): как я могу удалить данные формы в VB.net? У меня есть следующие строки:

Dim query As String = "exec sp_Message_insert @clientid='" + pClientId + "', @message='" + pMessage + "', @takenby='" + pUserId + "', @recipients='" + pRecipients + "'"

Если я использую апостроф в сообщении, тогда, конечно, это замалчивает запрос. Я просмотрел функции intellisense в строке, но не вижу ничего подходящего...

Ответ 1

Что именно вы имеете в виду, убегая? VB.NET не имеет "экранирования" так же, как это делают языки c-style.

Теперь, если вы хотите, чтобы в переменной pClientId не было ни одного qout, у вас есть две возможности:

Вариант 1 (не рекомендуется для этого сценария): выполните простую замену. То есть

pClientId = String.Replace(pClientId, "'","''")

Но, как уже отмечалось, я бы НЕ сделал это для того, что кажется командой SQL. Что бы я сделал Вариант 2: использовать параметры данных для передачи параметров в вашу БД во время команд sql

Например:

Dim cn As New SqlConnection(connectionString)
Dim cmd As New SqlCommand
cn.Open
cmd.Connection=cn
cmd.CommandType=CommandType.StoredProcedure
cmd.CommandText= "sp_Message_insert"
cmd.Parameters.add(New SqlParameter("@clientid", pClientId)
cmd.Parameters.add(New SqlParameter("@message", pMessage)
cmd.Parameters.add(New SqlParameter("@takenby", pUserId)
cmd.Parameters.add(New SqlParameter("@recipients", pRecipients)
cmd.ExecuteNonQuery

Ответ 2

Если вы хотите избежать строк, сначала нужно указать, какую базу данных вы используете. Вы должны использовать правильное экранирование для конкретной базы данных, чтобы избежать всех символов, которые вам нужны, но только тех.

Я не знаю ни одной базы данных, которая использует слэш как escape-символ. MySQL использует обратную косую черту, возможно, это то, что вы имеете в виду?

Лучше всего не избегать строк, а использовать параметризованный запрос. Пример:

Dim cmd As New SqlCommand("sp_Message_insert")
cmd.Parameters.Add("@clientid").Value = pClientId
cmd.Parameters.Add("@message").Value = pMessage
cmd.Parameters.Add("@takenby").Value = pUserId
cmd.Parameters.Add("@recipients").Value = pRecipients

Ответ 3

Я думаю, вы можете просто сделать два апострофа, чтобы создать одно. Я прошу прощения, если это не сработает, прошло некоторое время с тех пор, как я это сделал, я бы предложил использовать SQL-параметры, это автоматически обрабатывает ваши специальные символы и предотвращает внедрение SQL.

Ответ 4

Не создавайте строку для выполнения. Именно поэтому возможны атаки SQL Injection.

Вместо этого используйте уровень доступа к данным, который позволяет создавать объекты параметров и связывать их с хранимой процедурой для выполнения.

Ответ 5

если вы хотите выполнить String в качестве запроса, вы должны использовать следующий код:

Dim query as String 
query.Replace("/", "//")

Ответ 6

Поэтому хотелось бы добавить небольшое уведомление о именах параметров, используя вместе с System.Data.Odbc.OdbcCommand, согласно http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.commandtype

Поставщик данных .NET Framework для ODBC не поддерживает передачу именованных параметров в оператор SQL или в хранимую процедуру, называемую по OdbcCommand. В любом из этих случаев используйте знак вопроса (?) заполнитель.

пример отсюда http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparametercollection(v = vs. 80).aspx # Y800:

Dim command As OdbcCommand = connection.CreateCommand()
command.CommandText = "{ call MoneyProcedure(?,?,?) "

command.Parameters.Add("", OdbcType.Int).Value = 1
command.Parameters.Add("", OdbcType.Decimal).Value = 2
command.Parameters.Add("", OdbcType.Decimal).Value = 3