簡體   English   中英

使用UPDATE的Delphi SQL集成

[英]Delphi SQL integration using UPDATE

我在Delphi中有一個數據庫應用程序,我正在嘗試打開一條記錄並更新它。 以下是我現在的操作方式:

procedure TWebsiteRecord.UpdateRecord(Website : TWebsite);
var
  SQL : string;
begin
  RecordQuery.SQL.Clear;
  SQL := 'UPDATE website SET Domain=:D, Template=:T, WebHost=:Wh, DomainRegistrar=:Dr, OrderDate=:Od, RenewalDate=:Rd, RenewalCost=:Rc, PaymentMethod=:Pm,' + 'OwnDomainStatus=:OStat, CancellationStatus=:CStat, ReminderStatus=:RStat, WebsiteNotes=:N, FTPUsername=:U1, FTPPassword=:P1, EmailPassword=:P2, PaidForYear=:PStat, CustomerID=:CID WHERE WebsiteID=:WID;'; 
RecordQuery.ParamCheck := True;
RecordQuery.SQL.Add(SQL);
RecordQuery.Params.ParamByName('D').AsString := Website.D;
RecordQuery.Params.ParamByName('T').AsString := Website.T;
RecordQuery.Params.ParamByName('Wh').AsString := Website.Wh;
RecordQuery.Params.ParamByName('Dr').AsString := Website.Dr;
RecordQuery.Params.ParamByName('Od').AsString := Website.Od;
RecordQuery.Params.ParamByName('Rd').AsString := Website.Rd;
RecordQuery.Params.ParamByName('Rc').AsInteger := Website.Rc;
RecordQuery.Params.ParamByName('Pm').AsString := Website.Pm;
RecordQuery.Params.ParamByName('OStat').AsInteger := Website.OStat;
RecordQuery.Params.ParamByName('CStat').AsString := Website.Cstat;
RecordQuery.Params.ParamByName('RStat').AsString := Website.Rstat;
RecordQuery.Params.ParamByName('N').AsString := Website.N;
RecordQuery.Params.ParamByName('U1').AsString := Website.U1;
RecordQuery.Params.ParamByName('P1').AsString := Website.P1;
RecordQuery.Params.ParamByName('P2').AsString := Website.P2;
RecordQuery.Params.ParamByName('PStat').AsInteger := Website.PStat;
RecordQuery.Params.ParamByName('CID').AsInteger := Website.CID;
RecordQuery.Params.ParamByName('WID').AsInteger := Website.WID;
RecordQuery.ExecSQL;
end;

procedure TWebsiteRecord.SaveBtnClick(Sender: TObject);
var
Website : TWebsite;
begin
if Validate then
begin
  Website.D := DomainEdit.Text;
  Website.T := TemplateEdit.Text;
  Website.Wh := WebHostEdit.Text;
  Website.Dr := DomainRegEdit.Text;
  Website.Od := GetSQLDate(Date1Edit.Text);
  Website.Rd := GetSQLDate(Date2Edit.Text);
  if Website.Rd = '' then Website.Rd := '70/01/19';                         
  if CostEdit.Text = '' then website.Rc := 0
  else Website.Rc := strtoint(CostEdit.Text);
  Website.Pm := GetPaymentMethod(PaymentMethodCombo.ItemIndex);
  Website.OStat := integer(OwnDomainCheck.Checked);
  if PendingCheck.Checked then Website.Cstat := 'P'
  else if CancelledCheck.Checked then Website.Cstat := 'C'
  else Website.Cstat := 'A';
  Website.Rstat := GetSent(ReminderStatusCombo.ItemIndex);
  Website.N := NotesMemo.Text;
  Website.U1 := FTPUserEdit.Text;
  Website.P1 := FTPPassEdit.Text;
  Website.P2 := EmailPassEdit.Text;
  Website.PStat := integer(PaidCheck.Checked);
  Website.CID := strtoint(CustIDEdit.Text);

  UpdateRecord(Website);

  messagedlg('Website successfully updated, You will now be returned to the website table',mtinformation,[mbOK],0);
  WebsiteTable.WebsiteCDS.Refresh;
  Free;
end;
end;

執行此操作時不會引起任何錯誤,但是記錄不會更新,並且與以前完全相同。 有人知道這個問題嗎? IIf,那我該怎么辦。 如果需要,我可以提供更多代碼。 提前致謝

如我所見,您的主要問題是您不知道服務器執行了什么確切的查詢。

它似乎有點過時,但是如果我是我,那么我將使用普通的FORMAT()函數調試查詢,並查看傳遞給服務器的確切信息。 在這種情況下,您的代碼將是這樣的:

SQL := FORMAT('UPDATE website SET Domain="%s", Template="%s", WebHost="%s", DomainRegistrar="%s", OrderDate="%s", RenewalDate="%s", RenewalCost=%d, PaymentMethod="%s",' +
  'OwnDomainStatus=%d, CancellationStatus="%s", ReminderStatus="%s", WebsiteNotes="%s", FTPUsername="%s", FTPPassword="%s", EmailPassword="%s", PaidForYear=%d, CustomerID=%d WHERE WebsiteID=%d',
  [
    RecordQuery.Params.ParamByName('D').AsString,
    RecordQuery.Params.ParamByName('T').AsString,
    RecordQuery.Params.ParamByName('Wh').AsString,
    RecordQuery.Params.ParamByName('Dr').AsString,
    RecordQuery.Params.ParamByName('Od').AsString,
    RecordQuery.Params.ParamByName('Rd').AsString,
    RecordQuery.Params.ParamByName('Rc').AsInteger,
    RecordQuery.Params.ParamByName('Pm').AsString,
    RecordQuery.Params.ParamByName('OStat').AsInteger,
    RecordQuery.Params.ParamByName('CStat').AsString,
    RecordQuery.Params.ParamByName('RStat').AsString,
    RecordQuery.Params.ParamByName('N').AsString,
    RecordQuery.Params.ParamByName('U1').AsString,
    RecordQuery.Params.ParamByName('P1').AsString,
    RecordQuery.Params.ParamByName('P2').AsString,
    RecordQuery.Params.ParamByName('PStat').AsInteger,
    RecordQuery.Params.ParamByName('CID').AsInteger,
    RecordQuery.Params.ParamByName('WID').AsInteger
  ]);

您可以查看查詢,將其記錄在文本文件中,也可以將其復制並粘貼到某處以查看其執行,例如mysql命令提示符或phpmyadmin。

如果您有權訪問服務器的日志文件,則不需要-只需打開它並查看其中的查詢即可。

當然,一旦查詢按預期工作,您可以將其與參數一起使用。 並且取決於您使用的連接類型是什么,可能還有其他(更快)的方法來獲取實際的查詢,例如, 這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM