【问题标题】:vb.NET "{0}" concatenation doesn't work in MySQL commands but "&" doesvb.NET "{0}" 连接在 MySQL 命令中不起作用,但 "&" 可以
【发布时间】:2015-01-23 21:05:11
【问题描述】:

我一直试图在 vb.NET 中发送一个长的 MySQL 命令。当我想将变量用作 MySQL 命令字符串的一部分时,我一直在使用“&”连接字符串。

这可行,但让我的代码看起来很乱,所以我尝试使用“{0}、{1}”等。

但这不起作用,我收到错误:

重载解析失败,因为没有可访问的“新”接受此数量的参数。

例子:

connector.Open()
commander = New MySqlCommand("UPDATE 'pupil_data' SET '" & Question & "'='" & Answer & "' WHERE 'username'=" & Environment.UserName & ";", connector)
dataAdapter = New MySqlDataAdapter(commander)
connector.Close()

但是,这可行:

connector.Open()
commander = New MySqlCommand(("UPDATE 'pupil_data' SET '{0}'='{1}' WHERE 'username'='{2}'", Question, Answer, Environment.Username), connector)
dataAdapter = New MySqlDataAdapter(commander)
connector.Close()

不起作用。这可能只是我的包围的问题,但我尝试了几种组合,这在逻辑上是合理的(我认为)。

【问题讨论】:

  • 字符串不会自动使用格式掩码。您应该使用 String.Format("UPDATE pupil_data...", arg1, arg2...) 与掩码和参数来获得结果。并将其放在 New SQLCommand 中或将字符串创建到临时变量并传递它
  • 我不太清楚你所说的面具是什么意思。你能澄清一下吗?
  • 这不是 90 年代的派对。今天(和昨天)我们使用准备好的/参数化的语句:How do I create a parameterized SQL query? Why Should I?.

标签: mysql vb.net concatenation


【解决方案1】:

“{n}”名称不代表自动连接,而是用作String.Format 一部分的格式化占位符。带有占位符的字符串不会自动知道如何处理它。您的 MySQLCommand 对象当然不知道如何使用它,所以您会收到错误消息。例如:

connector.Open()
Dim SQL As String = String.Format("UPDATE pupil_data SET '{0}'='{1}' WHERE 'username'='{2}'", 
       Question, Answer, Environment.Username)
commander = New MySqlCommand(SQL, connector)
dataAdapter = New MySqlDataAdapter(commander)
connector.Close()

我也不确定您是否需要 SQL 中的所有这些记号。请注意,如果Question 之类的内容是数字,则需要转换为字符串:

Dim SQL As String = String.Format("Update ...", 
       Question.ToString, Answer.ToString, Environment.Username)

Console.WriteLineStringBuilder.AppendFormat 等一些东西也会自动实现这一点。

String.Format

请注意,这绝对是创建 SQL 的错误方法。如果用户名是 D'Artagnan,则查询将阻塞。 String.Format 不会保护您免受 SQL 注入的影响,它只是比将字符串位连接在一起更简洁的代码。

【讨论】: