【问题标题】:Delphi - what am I missing in this queryDelphi - 我在这个查询中缺少什么
【发布时间】:2014-01-20 11:30:01
【问题描述】:

我正在尝试运行此查询但失败:

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

我收到错误:“远程错误:没有这样的表:LOKACIJEinner”

我在这里错过了什么??? 数据库是 SQLite。我在这里打开的表单是模态的。整个应用程序是一个数据快照。这是客户端。问题实际上是这样的:我有很多位置,我只需要 AdvOfficeStatusBar1.Panels[3].Text 显示的位置名称中的数据。

【问题讨论】:

  • where lokacije.[NAZIV] = ' + Form2.AdvOfficeStatusBar1.Panels[3].Text + ' '
  • 您正在使用状态栏面板的.Text 属性...来自另一个表单...在 SQL 查询中?我认为即使是全局变量也不会那么罪恶。
  • 现在我收到“[Hotel] 附近的远程错误:语法错误”...?
  • @user3181689 好的,然后在位置名称中添加引号。 where lokacije.[NAZIV] = ''' + Form2.AdvOfficeStatusBar1.Panels[3].Text + ''' '
  • 大声笑,在执行之前检查该查询两次。现在你缺少空间。太明显了。错误告诉你“No such table LOKACIJEinner”所以首先你可以想到的是LOKACIJEinner 因为缺少空格...

标签: sql sqlite delphi delphi-xe4


【解决方案1】:

我觉得这样更易读

procedure OpenLokacije(ANaziv: String);
begin
   ClientDataSet1.Close;
   ClientDataSet1.CommandText :=  ' select lokacije.[LOKACIJA_ID],'+    // AS Lok_LOKACIJA_ID
                                  '        lokacije.[RESORT_ID],'+
                                  '        lokacije.[HOTEL_ID],'+
                                  '        lokacije.[NAZIV],'+
                                  '        uporabniki.[RESORT_ID],'+
                                  '        uporabniki.[HOTEL_ID],'+
                                  '        uporabniki.[LOKACIJA_ID],'+ // AS Upor_LOKACIJA_ID
                                  '        uporabniki.[UPORABNIK],'+
                                  '        uporabniki.[GESLO],'+
                                  '        uporabniki.[PRAVICE]'+
                                  ' from LOKACIJE'+
                                  '         inner join UPORABNIKI on lokacije.lokacija_id=uporabniki.lokacija_id '+
                                  ' where lokacije.[NAZIV] = :@NAZIV'+
                                  ' order by Uporabniki.[UPORABNIK]';
 ClientDataSet1.Parameters.ParamByName('@NAZIV').Value:= ANaziv;
 ClientDataSet1.Open;
end;

lokacije.lokacija_iduporabniki.lokacija_id 分别是相同的值和字段。

使用AS:

lokacije.lokacija_id as lok_lokacija_id
uporabniki.lokacija_id  as  upo_lokacija_id

也使用数据库的模式,如

dbo.uporabniki.lokacija_id

【讨论】:

  • @ char 不会执行失败吗?我从未见过它用于参数...
  • 刚刚更改:“ClientDataSet1.Params.ParamByName('@NAZIV').Value:= '' + Form2.AdvOfficeStatusBar1.Panels[3].Text + '' ;”
  • @user3181689,参数的“魔力”在于您不需要关心包含字符。您只是将值传递给 Value 属性。其余的取决于提供者。无论如何,使用此代码,您应该只在调用此 OpenLokacije 过程时将 Form2.AdvOfficeStatusBar1.Panels[3].Text 传递给 ANaziv 输入参数。
  • @Ravaut 123 - 为什么我在查询结果中有两个额外字段:resort_ID_1 和 LOKACIJA_ID_1 ????
  • @TLama:不抱歉。没关系。 ;-)
猜你喜欢
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2019-07-01
  • 2021-09-19
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多