更新数据库

时间:2016-08-30 10:55:09

标签: sql database delphi ado

我目前正在使用一个小程序,其中必须从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);

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

  

没有给出一个或多个必需参数的值。

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

@ Kobik的答案对于你明确提出的问题是正确的答案。

这是解决这一问题的另一种方法,即如何在不必自己创建Sql UPDATE语句的情况下更新数据。试试这个

  1. 如果您还没有,请在表单中添加与DBGrid连接到同一DataSource的DBNavigator。关注其按钮状态的变化,密切注意运行时间。

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

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

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

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

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

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