我打算创建一个对话框,在Firebird数据库中创建一个空白记录,然后使用该对话框中文本编辑框中的值填充字段。
我使用以下内容: 的dbExpress 的DataSnap 德尔福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)。我不知道如何解决这个问题。
编辑:代码格式
答案 0 :(得分: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一起使用,它可靠地工作。
答案 1 :(得分: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是一个定义为的查询 选择curdate,金额,来自钱箱的详细信息,其中id =:p1
qInsertCashbox是 插入钱箱(id,curdate,amount,details) 值(:p0,:p1,:p2,:p3)
qUpdateCashbox是 更新钱箱套装 curdate =:p1, 金额=:p2, details =:p3 其中id =:p0
当然,您也可以使用数据感知组件,它们需要'trinity' - 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;
答案 2 :(得分:0)
您需要为数据库配置TSQLConnection,并且(为了简化)TSQLTable。将TSQLTable链接到TSQLConnection并在TableName属性中选择所需的表。接下来将TDataSetProvider拖放到表单上并将其与TSQLTable连接。现在取一个TClientDataSet,将其Provider设置为TDataSetProvider,并将DataSource连接到TClientDataSet。
记住:要将数据实际写入数据库,您必须调用TClientDataSet.ApplyUpdates。
更多信息here