【发布时间】: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
标签: sql vb.net sql-update oledb