当字段作为变量/参数输入时如何创建更新语句

Posted

技术标签:

【中文标题】当字段作为变量/参数输入时如何创建更新语句【英文标题】:How to create an update statement when the field is entered as a variable/parameter 【发布时间】:2019-01-27 13:19:29 【问题描述】:

我正在尝试更新数据库中的表,但每次按下按钮时,它都应该更新同一记录的不同列。关于如何做到这一点的任何想法?

该表包含 QuizID(自动编号)、QuizName(字符串)、OutOf(整数)、Question1(整数)、Question2 等列。每次按下按钮时,它都应更新下一个 QuestionX 列。

Using cmd As New OleDbCommand("UPDATE Quizzes SET @questionColumn = @questionID WHERE QuizName = @quizName", myConnection)
   cmd.Parameters.Add("@questionColumn", OleDbType.Char).Value = "Question" & questionNumber.ToString()
   cmd.Parameters.Add("@questionID", OleDbType.Integer).Value = questionID
   cmd.Parameters.Add("@quizName", OleDbType.Char).Value = txtQuizName.Text
   cmd.ExecuteNonQuery()
End Using

questionNumber 是一个整数,每次按下按钮时递增 1,questionIDtxtQuizName.Text 是之前获取的值。

我预计QuestionX 列会更新,但代码会抛出一个错误,指出@questionColumn 不可更新;但是如果我用Question1 替换它并注释掉参数,它可以正常工作,但不会(显然)改变它正在更新的列。

这次我做错了什么?

【问题讨论】:

不能使用参数指定标识符;只有价值观。这就像在 VB 代码中一样:您可以使用方法参数来传递值,但不能使用方法参数来指定变量的名称。人们会告诉你总是在 SQL 代码中使用参数,他们是对的,但只有当你可以使用它们时。如果您需要指定带有变量的列,那么您别无选择,只能使用某种字符串连接。这会让您遇到与往常一样的所有问题,因此您必须确保在使用前验证列名。 也就是说,我建议您的数据库设计是错误的。如果您希望能够为单个测验更新多个问题,那么每个问题都应该是一行,而不是一列。您将有一个 Question 表,其中包含 Quiz 表的外键,因此您知道每个问题与哪个测验相关。使用这种设计,您不必指定变量列名。 啊,好吧,这是有道理的。我已经有一个问题表,但问题字段将链接到该表;但我现在发现这是错误的......谢谢@jmcilhinney Database Normalization 【参考方案1】:

您不能将列名绑定到参数。您需要动态构建查询。

Using cmd As New OleDbCommand("UPDATE Quizzes SET Question" & questionNumber.ToString() & " = @questionID WHERE QuizName = @quizName", myConnection)
   cmd.Parameters.Add("@questionID", OleDbType.Integer).Value = questionID
   cmd.Parameters.Add("@quizName", OleDbType.Char).Value = txtQuizName.Text
   cmd.ExecuteNonQuery()
End Using

【讨论】:

我试过了,但它对我不起作用。我做了 cmets 中提到的事情,这对于我想做的事情来说效果很好。

以上是关于当字段作为变量/参数输入时如何创建更新语句的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2+初始化输入值

使用查询作为输入参数创建动态SSRS报告

abap中创建函数时,如何将输入的参数设置为表格

如何从动态创建的表格视图单元格的输入字段中将数据检索到数组

PHP输出单引号和双引号作为输入元素的值

Oracle关闭&变量输入