Error: "No value given for one or more required parameters" when updating Database
Error: "No value given for one or more required parameters" when updating Database
我目前正在使用一个小程序,其中必须选择 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);
每次我 运行 它都会给我一个错误:
No value given for one or more required parameters.
我该怎么做才能解决这个问题?
@Kobik 的回答对于您具体询问的问题是正确的。
这是解决问题的另一种方法,即如何在不必自己创建 Sql UPDATE 语句的情况下更新数据。试试这个
如果您还没有,请将一个 DBNavigator 添加到您的表单中,该 DBNavigator 连接到与您的 DBGrid 相同的数据源。在运行时密切关注其按钮的变化状态。
在打开 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.
我目前正在使用一个小程序,其中必须选择 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);
每次我 运行 它都会给我一个错误:
No value given for one or more required parameters.
我该怎么做才能解决这个问题?
@Kobik 的回答对于您具体询问的问题是正确的。
这是解决问题的另一种方法,即如何在不必自己创建 Sql UPDATE 语句的情况下更新数据。试试这个
如果您还没有,请将一个 DBNavigator 添加到您的表单中,该 DBNavigator 连接到与您的 DBGrid 相同的数据源。在运行时密切关注其按钮的变化状态。
在打开 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.