2016-04-04 42 views
1

MySQL5dbからデータを照会しようとしていますが、SQLコードから他の機能を使用すると、次のエラーが返されます。[0x0005]:操作がサポートされていません。Delphi EDataBaseError - 操作がサポートされていません。どうすれば解決できますか?

私の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結合テーブルの使用しようとした場合私は同じエラーが表示されます...私は、SQLConnection、SQLDataSetおよびSQLQueryのコンポーネントを使用して、Delphi XE8でDBExpressを使用しています。

私は直接MySQLでコードを使用すると、正常に動作します。

なぜ返され、解決策はありますか?

+2

ようこそスタックオーバーフロー。あなたの話をお寄せいただきありがとうございます。あなたの質問は何ですか? –

+2

テーブルエイリアスの前に 'as'は必要ありません。また、* SQL *の連結を停止し、パラメータ化されたクエリを使用する方法を学んでください。コードをもっときれいにします。コンパイル後にキャッシュできるため、SQLインジェクションからあなたを守ります。また、データ型の変換や適切な引用の問題も回避します。 –

答えて

2

解決策が見つかりました!問題はSQLQuery1.RecordCountにありました。(返すエラー)の前に

:私は読んだことで(http://edn.embarcadero.com/ru/article/28494をここで見ることができます):、dbExpressのは単方向なので、RecordCountとしては、しかし、その限界を持って、それをリソースを持って来る

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 =

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; 

今私はもっと複雑な1つのSQLコードと機能を使用することができます(解決)した後SQLQuery1

0

ステータスレポートありがとうございます。私は、あなたがを意図していると仮定しています。に質問してください。

Q:このエラーはなぜ返されますか?

は限り、あなたがその行動を見ている理由として、私の疑惑は、問題がASキーワードであるということです。

Oracleなどの一部のデータベースでは、ANSI SQL標準に従ってテーブルエイリアスの割り当てにASキーワードを使用できません。他のデータベースは、標準に準拠しておらず、拡張子として、ASキーワードを許可しています(ただし必須ではありません)。

使用しているデータベースインターフェイス/ドライバコンポーネントは、「ユニバーサル」構文をサポートするように設計されている場合があります。非標準のASキーワードのため、インターフェイスライブラリがSQL文を拒否している可能性があります。

Q:これを修正するにはどうすればよいですか?

不要なASキーワードを削除してみることもできます。

これで動作が変わらない場合は、データベースインタフェースライブラリがテーブルエイリアスをサポートしていない可能性があります。

これで問題が解決しない場合は、MySQL固有の別のデータベースインターフェイス/ドライバに切り替えることを検討することもできます。

+0

私は例を挙げました。私が言っていることは、私はいくつかの機能を持っているということです、このようなものは動作しません...私は今あなたの提案を試すことができません。すぐに私はそうすることができます。 –

+0

私は何が間違っていたのか分かりません。私は質問をしました。 –

+0

私は問題が "データベースに依存しない"インタフェースであると考えます。あなたが観察している行動は意図的だと思います。それは「設計による」ものです。インターフェイスの目標は、いくつかの異なるデータベースで "作業する"ことだと思います。 SQL Server、Oracle、MySQL、PostgreSQLなどがあります。そして、それを実装するための単純なアプローチは、「最低共通分母」SQLだけを受け入れることです。つまり、これらのデータベースの* all *でサポートされるSQL構文のみを受け入れます。 (それは本当に単なる推測です) – spencer7593

関連する問題