【发布时间】:2019-05-29 19:29:34
【问题描述】:
我正在开发一个程序,允许用户参加测试并获得分数、百分比和等级。这些将存储在名为“tblStudentScores”的数据表中。下面的 SQL 代码旨在在用户完成测试时更新相关记录,以便存储他们在该测试中的最新分数。
UPDATE tblStudentScores
SET Score = @Score, Percentage = @Perc, Grade = @Grade, CompletedTask = True
WHERE SpecificTaskID = @SpecID AND StudentID = @StudID;
在 MS Access 中测试此 SQL 时,它运行良好。但是,当我尝试在 VB.NET 中使用与 OleDBCommand 相同的查询时,什么也没有发生。没有错误信息,但是代码也没有更新表格。
我认为这可能是由于参数,所以我在查询顶部明确声明了这些:
PARAMETERS @SpecID Number, @StudID Number, @Score Number, @Perc Number, @Grade Text;
现在,我收到以下错误消息,而不是什么都没发生:
An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll
Additional information: Cannot update 'Score'; field not updateable.
正如我之前所说,在 MS Access 的查询设计器中查询成功,因此该字段必须是可更新的。这里可能出了什么问题?
编辑:经过进一步测试,我发现当使用固定输入而不是参数时,查询在 VB 中确实有效。因此,问题显然出在参数上,但问题可能是什么?
编辑:我在其中创建和使用查询的整段代码如下:
Dim cmd As New OleDbCommand("PARAMETERS @Score Number, @Perc Number, @Grade Text, @SpecID Number, @StudID Number; UPDATE tblStudentScores " & _
"SET Score = @Score, Percentage = @Perc, Grade = @Grade, CompletedTask = True " & _
"WHERE SpecificTaskID = @SpecID AND StudentID = @StudID;", connection)
With cmd.Parameters
.AddWithValue("@Score", score)
.AddWithValue("@Perc", percentage)
.AddWithValue("@Grade", grade)
.AddWithValue("@SpecID", specificIDorder(cbxCurrentTasks.SelectedIndex))
.AddWithValue("@StudID", id)
End With
connection.Open()
cmd.ExecuteReader()
connection.Close()
【问题讨论】:
-
尝试位置参数是否有帮助:只需在查询中使用
?作为参数并以正确的顺序添加值 -
OleDB 参数必须按照它们在 sql 语句中出现的正确顺序。所以@Score 应该是第一位的,等等。你应该发布你的代码。
-
访问中的参数是基于位置的,没有命名,尽管您可以根据自己的理智来命名它们。参数出现在查询中的顺序与参数必须出现在参数集合中的顺序完全相同。您也不能在多个位置重复使用相同的参数,因为它是位置性的。通常使用
?作为占位符而不是@name但同样,只要顺序正确,这并不重要。 -
我仍然遇到同样的错误。我在 VB.NET 本身中添加参数的顺序是否有任何影响,即“Parameters.AddWithValue...”?
-
那么您很幸运,或者您的查询正在更新错误的字段。在幕后,您的命名参数@example 正在变成一个“?”。所以顺序很重要,100%。
标签: sql vb.net ms-access visual-studio-2013