2016-04-04 36 views
1

我想從MySQL5數據庫查詢數據,但是當我使用SQL代碼中的其他功能時,我返回了以下錯誤:[0x0005]:Operation Not Supported。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 ,我得到了同樣的錯誤......我在Delphi XE8上使用DBExpress,包含以下組件:SQLConnection,SQLDataSet和SQLQuery。

當我直接在MySQL上使用代碼時,它工作正常。

爲什麼它被返回並有什麼解決方案?

+2

歡迎來到Stack Overflow。謝謝你分享你的故事。你的問題是什麼? –

+2

你不需要在表別名之前使用'as'。另外,*停止連接你的SQL *並學習使用參數化查詢。它使代碼更清潔,它允許查詢更快地執行,因爲它們可以在編譯後緩存,並且可以防止SQL注入。它還避免了數據類型轉換和正確引用方面的困難。 –

回答

2

我找到了解決方案!問題出在SQLQuery1.RecordCount上。通過我讀的dbExpress的是單向的,所以總記錄把它的資源,但是有它的侷限性(你可以在這裏看到: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代碼和功能。

0

感謝您的狀態報告。我假設你打算詢問一個問題,例如,

問:爲什麼這個錯誤被返回?

至於爲什麼你看到這種行爲,我的懷疑是,這個問題是與AS關鍵字。 (這只是猜測而已。)

某些數據庫(如Oracle)在ANSI SQL標準之後,不允許在分配表別名時使用AS關鍵字。其他數據庫不嚴格遵循標準,並且(作爲擴展名)允許(但不要求)AS關鍵字。

您正在使用的數據庫接口/驅動程序組件可能被設計爲支持「通用」語法。由於非標準的AS關鍵字,接口庫​​可能會拒絕SQL語句。

問:我該如何解決這個問題?

您可以嘗試刪除不必要的AS關鍵字。

如果這不會改變行爲,那麼數據庫接口庫可能不支持表別名。 (這將是奇怪的)。

如果這樣不能解決問題,您可以考慮切換到另一個特定於MySQL的數據庫接口/驅動程序。

+0

我剛剛舉了一個例子。我說的是我有一些功能,比如這個不工作......我現在無法嘗試你的建議。儘快我會的。 –

+0

我不知道我做錯了什麼,我試圖做一個問題。 –

+0

我懷疑問題是與「數據庫無關」的接口。我認爲你所觀察到的行爲是有意的。這是「按設計」。我認爲界面的目標是用幾個不同的數據庫「工作」,例如, SQL Server,Oracle,MySQL,PostgreSQL等等。一個簡單的方法來實現它只會接受「最低公分母」SQL。也就是說,只接受將由所有這些數據庫支持的SQL語法。 (這真的只是一個猜測。) – spencer7593

相關問題