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

Delphi EDataBaseError - Operation Not Supported. How can I solve it?

我正在尝试从 MySQL5 数据库中查询数据,但是当我使用 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 + '"'

此外,如果我尝试使用连接的 table 的 WHERE,我会得到同样的错误...我在 Delphi XE8 上使用 DBExpress,具有以下组件:SQL连接,SQL数据集和SQL查询。

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

为什么会被退回,有什么解决办法?

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

问:为什么返回这个错误?

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

一些数据库,例如 Oracle,按照 ANSI SQL 标准,不允许在分配 table 别名时使用 AS 关键字。其他数据库没有严格遵循标准并且(作为扩展)允许(但不要求)AS 关键字。

您使用的数据库 interface/driver 组件可能设计为支持 "universal" 语法。由于非标准 AS 关键字,接口库​​可能拒绝 SQL 语句。

问:我该如何解决?

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

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

如果这不能解决问题,您可以考虑切换到另一个数据库 interface/driver,一个特定于 MySQL.

的数据库

我找到了解决办法!问题出在 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 = SQL查询 1

之后(解决):

 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 代码和函数。