【问题标题】:Error: "No value given for one or more required parameters" when updating Database错误:更新数据库时“没有为一个或多个必需参数指定值”
【发布时间】:2016-08-30 10:55:09
【问题描述】:

我目前正在使用一个小程序,其中必须从 DBGrid 中选择一个字段,然后在输入框的帮助下,可以更新值。

数据库有一个名为CaseNumber 的字段,它具有主键。代码必须识别字段的字段名称和所选行的案例编号,使用该信息可以更新数据库。

这是我的代码的副本:

procedure TfrmManagePatientInformation.btnChangeClick(Sender: TObject);
var NewValue, Fieldname : String;
    CaseNumber : Integer;
begin
// Make sure that the Case Number will not be changed
if DBGridPatients.SelectedField.FieldName = 'CaseNumber' then
begin
 MessageDlg('The Case Number of a patient cannot be changed!',mtError,[mbOK],0);
 Exit;
end
else
begin
 // Get Fieldname
 Fieldname := DBGridPatients.SelectedField.FieldName;

 // Get Case Number of the selected row
 CaseNumber := StrToInt(DBGridPatients.Fields[0].Value);

 // Get new value
 NewValue := InputBox('New Value','Please enter the new value!','');

 // Change the value permanently
 PatientQuery.Active := False;
 PatientQuery.SQL.Text := 'Update CurrentPatients SET ' + QuotedStr(FieldName) + ' = ' + QuotedStr(NewValue) + ' where CaseNumber = :CaseNumber';
 PatientQuery.Parameters.ParamByName('CaseNumber').Value := CaseNumber;
 PatientQuery.ExecSQL;

 MessageDlg('Information changed successfully!',mtConfirmation,[mbOK],0);

每次运行它都会给我一个错误:

没有为一个或多个必需参数指定值。

我能做些什么来解决这个问题?

【问题讨论】:

  • 在执行前PatientQuery.SQL.Text 是什么?为什么不将NewValue 也设为命名参数?
  • PatientQuery 是什么组件?它是 AdoQuery 吗?如果是这样,请检查执行选项它应该是空的
  • @GuidoG 是的,它是一个 AdoQuery,但它是空的
  • FieldName 不应该有 QuotedStr。
  • @Zenyl 然后检查 PatientQuery.ExecuteOption = []

标签: sql database delphi ado


【解决方案1】:

@Kobik 的回答对于您具体询问的问题是正确的。

这是另一种解决问题的方法,即如何更新数据而无需自己创建 Sql UPDATE 语句。试试这个

  1. 如果您还没有,请将 DBNavigator 添加到表单中,该 DBNavigator 连接到与 DBGrid 相同的数据源。在运行时密切关注其按钮的状态变化。

  2. 在打开 AdoQuery 的代码块中,在 PatientQuery.Open 之后添加以下行

  DBGrid1.Options := DBGrid1.Options + [dgEditing];
  DBGrid1.Columns[0].ReadOnly := True;

以上假设您的 PK 显示在网格的 LH 列中,因此索引为 0。

dgEditing 选项允许您单击任何单元格(PK 单元格除外,因为我们已将其设置为只读)并更改值。请注意,当您在运行时执行此操作时,DBNavigator 上的勾号和十字按钮将启用,以便您可以保存或放弃更改。另请注意,如果您在编辑单元格时单击另一行,您所做的更改会自动发布到数据集。

而且,最简单的就是它的全部内容。在与 DBGrid 相同的 Component Palette 选项卡上,您还可以找到可以以类似方式使用的各种其他 db-aware 组件,特别是 TDBEdit 和 TDBMemo。

如果您需要有关这种工作方式的任何帮助(这是编辑数据库数据的标准 Delphi 方式),请尝试使用谷歌搜索,如果您仍然卡住,请在 SO 上询问新的 q。

【讨论】:

  • 这个答案如何被提出的问题接受?应该是评论。
  • @kobik:我认为这是 SO 的政策,由 OP 决定接受答案。我发布它的原因是我最近看到了几个 qs,其中 OP 不必要地构造 UPDATE 语句,而他们本来可以很好地使用 TDataSet 的固有更新能力,并且在其中一个问题中,OP 遇到了几乎相同的问题作为这个。我不同意它应该是一个评论——在我看来,一个答案可以显示一种避免首先出现问题的方法,这似乎是合理的。 Ymmv ...
  • 不,它仍然是一个(好的/精心制作的/富有成效的)评论。但这不是对所提问题的答案。您建议 OP 通过不使用 UPDATE 语句并重新设计应用程序来解决特定的 Q 错误"No value given for one or more required parameters"。这很好。但是问题 is 是关于 UPDATE 以及参数和 sql 语句的虚假使用。我对没有任何抱怨。但是,我没有动力留下我的答案,事实上最初是被接受的。随时编辑您的问题并解决所问的问题,因此这将对未来的 SO 用户有所帮助。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 2015-09-09
相关资源
最近更新 更多