mysqldelphistored-proceduresado

insert into mySQL using Delphi ADOStoredProc


I have a mySQL with the following two tables:

person keyed on ID

staff keyed on ID and StaffID (used to link managers and their staff)

The following stored procedure should insert a row into the staff table provided both ID and StaffID exist in the person table

    IF EXISTS (SELECT * FROM person WHERE ID = pStaffID) THEN
      INSERT INTO staff VALUES(pID, pStaffID, pDateOfEffect, pRemarks);
    END IF

The following code in Delphi should do the insert

procedure TfrmStaff.btnOKClick(Sender: TObject);
begin
  if (txtStaffID.Text <> '') then with DataModule1.ADOStoredProc1 do begin
    NullStrictConvert := false;
    ProcedureName:='Insert_Staff';
    Parameters.Clear;
    Parameters.CreateParameter('pID', ftInteger, pdInput, 50, ID);
    Parameters.CreateParameter('pStaffID', ftInteger, pdInput, 50, txtStaffID.Text);
    Parameters.CreateParameter('pDateOfEffect', ftDate, pdInput, 50, txtDateOfEffect.Text);
    Parameters.CreateParameter('pRemarks', ftString, pdInput, 100, txtRemarks.Text);
    ExecProc;
  end;
end;

I am using 43 and 45 as the two IDS, which both exist in the person table. For test purposes I am leaving both txtDateOfEffect and txtRemarks empty.

This fails with the following error message:

check the manual for the right syntax to use near '{ call Insert_Staff(?, ?, ?, ?)} at line 1;


Solution

  • In the end I've decided to go with an ADOQuery instead of ADOStoredProc, using ExecSQL rather than ExecProc. The following code works as expected (qAdd is an ADOQuery). This allows me to continue using the stored proc on the server.

    procedure TfrmStaff.btnOKClick(Sender: TObject);
    begin
      if (txtStaffID.Text <> '') then with DataModule1.qAdd do begin
        Close;
        SQL.Text := 'Call Insert_Spouse(:pID, :pStaffID, :pDateOfEffect, :pRemarks)';
        Parameters.ParseSQL(SQL.Text, true);
        Parameters[0].Value := ID;
        Parameters[1].Value := txtStaffID.Text;
        Parameters[2].Value := 'null';
        Parameters[3].Value := 'null';
        ExecSQL;
      end;
    end;