现在,以下代码根本不执行。它是根据一些有关的教师指示编写和修改的。关键是主键是自动生成的,这就是为什么它没有在参数中被看到。这就是ID列的Is Identity在数据库中设置为Yes。如果有人可以为我修改代码,我将不胜感激。
qry = "Update StudentDetails.Programmes set Programme=@Programme,Form=@Form,AcademicYear=@AcademicYear,Class=@Class where ID=@ID"
cmd = New SqlCommand(qry, cn)
cmd.Parameters.Add("@ID", SqlDbType.Int)
cmd.Parameters["@ID"].Value = Convert.ToInt32(txtID.Text)
cmd.Parameters.Add(New SqlParameter("@Programme", txtProgramme.Text))
cmd.Parameters.Add(New SqlParameter("@Form", txtForm.Text))
cmd.Parameters.Add(New SqlParameter("@AcademicYear", txtAcademicYear.Text))
cmd.Parameters.Add(New SqlParameter("@Class", txtClass.Text))
cmd.CommandType = CommandType.StoredProcedure
cmd.ExecuteNonQuery()
MessageBox.Show("Record succesfully updated", "Updated", MessageBoxButtons.OK, MessageBoxIcon.Information)
答案 0 :(得分:0)
您在查询中有一个参数@ID
,但看起来您没有设置该参数。
您说主键是自动创建的,但这可能仅适用于插入行的情况。使用update
语句时,仍需要指定行的ID。没有它,数据库将不知道您尝试更新的数据。
如果你的代码抛出一个异常(VB有例外吗?)那么那应该告诉你究竟是什么问题。或者,数据库日志可能能够帮助您跟踪它。
答案 1 :(得分:0)
@ID
在您的SQLCommand的parameter
中也是commandText
, 你没有通过它。
在cmd.ExecuteNonQuery()之前添加以下行:
cmd.Parameters.Add(New SqlParameter("@ID", Convert.ToInt32(txtID.Text)))
标识列是Integer类型,因此请尝试使用:
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters["@ID"].Value = Convert.ToInt32(txtID.Text);
正如您所说,您的ID列是Identity列,但根据Update
语句的规则,您应指定Primary Key
字段以更新特定行。 ID列值将帮助您识别particular row
,此标识值是您行的唯一值。
要检查是否更新了任何行,请将ExecuteNonQuery()方法的返回值设为:
Int32 rowsAffected = cmd.ExecuteNonQuery();
并检查rowAffected值是否大于0。如果为0,那么在执行查询时不会产生任何行。
请查看此link的示例,了解如何使用参数进行更新。
答案 2 :(得分:0)
尝试复制 - 粘贴qry变量中的内容并在SQL上执行它 如果你受到0行的影响,可能是因为没有使用您传递的密钥@ID找到匹配记录..尝试在查询中使用TRIM
希望这能帮到你..
答案 3 :(得分:0)
您忘记设置SqlCommand.CommandType属性。这可能会对你有所帮助
cmd.CommandType = CommandType.StoredProcedure;
请务必在致电ExecuteNonQuery()
之前进行设置。