0

我计划创建一个对话框,该对话框将在 Firebird 数据库中创建一条空白记录,然后使用从该对话框中的文本编辑框中获取的值填充字段。

我正在使用以下内容:dbExpress DataSnap Delphi XE2

也许它应该是这样的:

DataSource.DataSet.Append;
(call the dialog with the db text boxes pointing to DataSource)
if ModalResult = mrOK then
    DataSource.DataSet.Post;

有任何想法吗?我想知道要使用哪些组件(ClientDataSet、SQLQuery 或 SQLDataSet)。我不知道该怎么做。

编辑:代码格式

4

3 回答 3

1

换句话说,您想创建一个带有非数据感知控件的对话框。为此,您需要三个 TSQLQueries:一个用于在进入对话框时检索数据(在编辑数据的情况下),一个用于插入,一个用于更新。

这是我前几天写的这样一个对话框中的一些(编辑过的)代码。参数'n'是要编辑的元组的id;如果我要插入一条新记录,它的值为 -1。

Function TEditCashbox.Execute (n: longint): boolean;
var
 q: TSqlQuery;

begin
 if n = -1 then
  begin
   edDate.Text:= datetostr (date);
   edAmount.text:= '0';
  end
 else with qGetCashbox do
  begin
   params[0].asinteger:= n;
   open;
   edDate.text:= fieldbyname ('curdate').asstring;
   edAmount.text:= fieldbyname ('amount').asstring;
   edDetails.text:= fieldbyname ('details').asstring;
   close
  end;

 if showmodal = mrOK then
  begin
   if n = -1 then
    begin
     q:= qInsertCashbox;
     q.ParamByName ('p0').asinteger:= dm.GenerateID ('cashbox')
    end
   else
    begin
     q:= qUpdateCashbox;
     q.ParamByName ('p0').asinteger:= n
    end;

  with q do
   begin
    parambyname ('p1').asdate:= strtodate (edDate.text);
    parambyname ('p2').asinteger:= strtoint (edAmount.Text);
    parambyname ('p3').asstring:= edDetails.text;
    execsql
   end;
  end
end.

qGetCashbox 是一个查询,定义为 select curdate, amount, details from cashbox where id = :p1

qInsertCashbox 被插入到钱箱(id,curdate,amount,details)值(:p0,:p1,:p2,:p3)

qUpdateCashbox 是更新钱箱设置 curdate = :p1, amount = :p2, details = :p3 where id = :p0

当然,您也可以使用需要“三位一体”的数据感知组件 - TSQLDataSet、TDataSetProvider 和 TClientDataSet。使用数据感知组件更容易,但有时这种方法并不适合。如果您确实使用数据感知组件,那么我的模板代码如下

sdsEditDeposit.params[0].AsInteger:= n;   // this is the TSQLDataSet
with qEditDeposit do    // this is the clientdataset
 begin
  open;
  if n = -1 then        // new tuple
   begin
    insert;
    fieldbyname ('amount').asinteger:= 0;
    fieldbyname ('curdate').asdatetime:= date;
   end;

  edit;
  if showmodal = mrOK then
   begin
    if n = -1 then 
     begin
      n:= dm.GenerateID;
      fieldbyname ('id').asinteger:= n;
     end;
    result:= n;
    post;
    applyupdates (0)
   end
  else
   begin
    cancel;
    result:= 0
   end;
end;    
于 2012-05-01T05:59:51.037 回答
1

您可能还希望允许取消...

DataSource.DataSet.Append;
(call the dialog with the db text boxes pointing to DataSource)
if ModalResult = mrOK then
    DataSource.DataSet.Post
else 
    Datasource.Dataset.cancel;

我将 TADOQuery 组件与 MS-SQL 一起使用,它工作可靠。

于 2012-04-30T17:34:03.087 回答
0

您需要为您的数据库配置一个 TSQLConnection 和(为了方便起见)一个 TSQLTable。将 TSQLTable 链接到 TSQLConnection 并在 TableName 属性中选择所需的表。接下来将 TDataSetProvider 拖放到表单上并将其与 TSQLTable 连接。现在获取一个 TClientDataSet,将其 Provider 设置为 TDataSetProvider 并将 DataSource 连接到 TClientDataSet。

请记住:要将数据实际写入数据库,您必须调用 TClientDataSet.ApplyUpdates。

更多信息在这里

于 2012-04-30T20:36:14.377 回答