当字段作为变量/参数输入时如何创建更新语句
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,questionID
和 txtQuizName.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 中提到的事情,这对于我想做的事情来说效果很好。以上是关于当字段作为变量/参数输入时如何创建更新语句的主要内容,如果未能解决你的问题,请参考以下文章