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 代码和函数。
我正在尝试从 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 代码和函数。