我试图从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上使用代码时,它可以正常工作。
为什么要退回?解决方案是什么?
答案 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的数据库接口/驱动程序。