在VB.net中转义一个字符串(添加斜杠)?

时间:2009-08-11 15:43:45

标签: vb.net string escaping

非常简单的问题(令人惊讶的是我无法在任何地方找到类似的问题):如何在VB.net中转义表单数据?我有这样的各种行:

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

如果我在消息中使用撇号,那么当然这会搞砸查询。我查看了字符串上的intellisense函数,但没有看到任何合适的...

6 个答案:

答案 0 :(得分:16)

你到底是什么意思? VB.NET没有像c风格语言那样“转义”。

现在,如果你想确保pClientId变量中没有单个qoutes,那么你有两个选择:

选项1(不建议用于此方案):执行简单替换。即

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

但是,如上所述,我不会为看似SQL命令的人做这件事。我要做的是 选项2:在sql命令期间使用数据参数将参数传递给DB

例如:

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

答案 1 :(得分:5)

如果你想逃避字符串,那么你首先要告诉你使用的数据库。您必须为特定数据库使用正确的转义,以便您可以转义所需的所有字符,但只能转义那些字符。

我不知道任何使用斜杠作为转义字符的数据库。 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

答案 2 :(得分:2)

我认为你可以做两个撇号来创建一个撇号。我道歉,如果这不起作用,已经有一段时间了,因为我这样做了,我建议使用SQL参数,这将自动处理你的特殊字符并防止SQL注入。

答案 3 :(得分:2)

不要像这样建立一个字符串来执行 这就是SQL注入攻击的原因。

而是使用数据访问层,它允许您创建参数对象并将它们与要执行的存储过程相关联。

答案 4 :(得分:1)

如果要将String作为查询执行,则应使用以下代码:

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

答案 5 :(得分:1)

因此,我想与System.Data.Odbc.OdbcCommand一起添加关于参数名称的小注意事项, 根据{{​​3}}

  

用于ODBC的.NET Framework数据提供程序不支持传递   命名参数到SQL语句或被调用的存储过程   通过OdbcCommand。在任何一种情况下,请使用问号(?)   占位符。

此处的示例http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.commandtype

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