Delphi更新加入的查询

时间:2014-01-20 18:57:44

标签: sql sqlite delphi delphi-xe4

应用程序是datasnap(带有sqlite数据库)。我针对两个表(LOKACIJE和UPORABNIKI)运行以下查询:

procedure TForm4.FormShow(Sender: TObject);
begin
   ClientDataSet1.Close;
   ClientDataSet1.CommandText :='';
   ClientDataSet1.CommandText :=  'select  lokacije.[HOTEL_ID],'+
                                  '        lokacije.[NAZIV],'+
                                  '        uporabniki.[LOKACIJA_ID],'+
                                  '        uporabniki.[RESORT_ID],'+
                                  '        uporabniki.[HOTEL_ID],'+
                                  '        uporabniki.[UPORABNIK],'+
                                  '        uporabniki.[GESLO],'+
                                  '        uporabniki.[PRAVICE]'+
                                  '        from UPORABNIKI'+
                                  '        inner join LOKACIJE on uporabniki.lokacija_id=lokacije.lokacija_id '+
                                  ' where lokacije.[NAZIV] = :@NAZIV'+
                                  ' order by Uporabniki.[UPORABNIK]';
 ClientDataSet1.Params.ParamByName('@NAZIV').Value:= '' + Form2.AdvOfficeStatusBar1.Panels[3].Text + '' ;
 ClientDataSet1.Open;
end;

查询运行正常,并给我想要的结果。但是,我希望能够编辑和保存此查询的已编辑(或添加)结果。我要更新(或添加新记录)的表是UPORABNIKI。我不需要向LOKACIJE表写任何东西。我怎么做到这一点?

除了保存新记录之外,我希望查询自动填充值 LOKACIJA_ID,RESORT_ID,HOTEL_ID,因为它们来自同一个表,当我在导航器中单击“插入”按钮。 UPORABNIKI是翻译的USERS表。

编辑:按建议反转查询

3 个答案:

答案 0 :(得分:1)

查看OnGetTableName上的TDatasetProvider事件。

此外,我相信如果您反转您的查询会更好,即使用... FROM UPORABNKI inner join LOKACIJE...

答案 1 :(得分:0)

来自TDataSetProvider的OnGetTableName事件有一个名为TableName的var参数。你应该把它分配给'UPORABNIKI'。

此外,通常TDataSetProvider认为您在FROM子句中使用的表是您要更新的表,因此,如果您更改查询,则可能甚至不需要上述事件。

希望有所帮助, 马可

答案 2 :(得分:0)

我认为这是TDatasetProvider无法生成更新所涉及的表的正确命令的情况。在这种情况下,我所做的是为TDatasetProvider.BeforeUpdateRecord事件添加处理程序。此事件将允许您处理数据集上的每个操作,并生成所需的SQL语句,以便在数据服务器中保持这些操作。

您必须自己编写UPDATE / DELETE / INSERT语句,但您也将拥有关于如何更新表的绝对权力。这就是为什么我总是使用这个事件而不再依赖TDatasetProvider intrinsec更新过程。