Delphi EDataBaseError - 不支持操作。我该如何解决?

时间:2016-04-04 14:34:49

标签: mysql delphi dbexpress

我试图从MySQL5 db中查询数据,但是当我使用SQL代码中的其他一些功能时,我又返回了以下错误:[0x0005]:操作不受支持。

我的SQL代码查询:

Select 
  s.nome, s.id_sistema, s.st_sis 
from 
  perm_usuar as p 
inner join 
  sistemas as s 
on 
  s.id_sistema = p.id_sistema 
where 
  p.id_usuario = "' + idusuario + '"'

当我不使用这些功能时,它也能正常工作:

Select 
  sistemas.nome, sistemas.id_sistema, sistemas.st_sis 
from 
  perm_usuar 
inner join 
  sistemas 
on 
  sistemas.id_sistema = perm_usuar.id_sistema 
where 
  perm_usuar.id_usuario = "' + idusuario + '"'

另外,如果我尝试使用连接表的WHERE,我会得到同样的错误......我在Delphi XE8上使用DBExpress,包含以下组件:SQLConnection,SQLDataSet和SQLQuery。

当我直接在MySQL上使用代码时,它可以正常工作。

为什么要退回?解决方案是什么?

2 个答案:

答案 0 :(得分:2)

我找到了解决方案!问题出在SQLQuery1.RecordCount上。根据我的阅读,dbExpress是单向的,因此RecordCount带来了它的资源,但是它有其局限性(你可以在这里看到:http://edn.embarcadero.com/ru/article/28494

之前(返回错误):

 SQL1.SQL.Clear;
 SQL1.SQL.Add(CodigoMYSQL);
 SQL1.Open;
 SQL1.First;
 cont := SQL1.RecordCount; //have limitations
 if cont > 0 then // check
  begin
   for i := 1 to cont do //loop in
    begin
     for ii := 0 to NValue do
      result[ii].Add(SQL1.Fields[ii].AsString);
     SQL1.Next;
    end;
  end;
 SQL1.Close;

** SQL1 = SQLQuery1

之后(已解决):

 SQL1.SQL.Clear;
 SQL1.SQL.Add(CodigoMYSQL);
 SQL1.Open;
 SQL1.First;
 if not SQL1.IsEmpty then //check
  begin
    ii := 0;
    while not SQL1.Eof do //till the end
    begin
     for ii := 0 to NValue do
      result[ii].Add(SQL1.Fields[ii].AsString);
     SQL1.Next;
     inc(ii);
    end;
  end;
 SQL1.Close;

现在我可以使用更复杂的SQL代码和函数。

答案 1 :(得分:0)

感谢状态报告。我假设您打算询问一个问题,例如

问: 为什么要返回此错误?

至于您看到这种行为的原因,我怀疑问题是 AS 关键字。 (这只是猜测。)

某些数据库(如Oracle)在遵循ANSI SQL标准时不允许在表别名的分配中使用AS关键字。其他数据库不会严格遵守标准,并且(作为扩展名)允许(但不要求)AS关键字。

您正在使用的数据库界面/驱动程序组件可能旨在支持"通用"句法。由于非标准AS关键字,接口库​​可能拒绝SQL语句。

问: 如何解决此问题?

您可以尝试删除不必要的AS个关键字。

如果这不会改变行为,那么数据库接口库可能不支持表别名。 (那太奇怪了。)

如果这还没有解决问题,您可以考虑切换到另一个特定于MySQL的数据库接口/驱动程序。