好的,在這裏我正在回答這個問題,儘管我可以看到很少有人在最近與德爾福打交道。比方說,我們在Oracle數據庫存儲過程:
CREATE OR REPLACE PROCEDURE GET_EMPLOYEES
(V_CUR IN OUT SYS_REFCURSOR)
AS
BEGIN
OPEN V_CUR FOR SELECT * FROM EMPLOYEES;
END GET_EMPLOYEES;
現在,在德爾福你選擇一個存儲過程組件(可能是從ODAC或UniDac組件套件).SET其StoredProcName GET_EMPLOYEES。然後,您可以添加過程在遊標中返回的所有字段。如果運行應用程序並激活存儲過程,您將能夠看到所有記錄。但是,如果您嘗試插入,修改或刪除任何內容,您將無法做到這一點。現在,有一件非常棘手的事情。如果您選中,您會看到所有字段的ReadOnly屬性都設置爲True。即使將它們設置爲False,實際數據庫中也不會有任何變化,但您可以編輯DBGrid。
所以,我們已經到了主要部分。舊的Delphi-SQL Server合作伙伴關係如何工作,以便您可以從DBGrid進行任何操作?那麼,我們必須明白,沒有魔法。如果它是SQL,那麼SQL只有一種插入,更新和刪除記錄的方法 - 這是使用適當的SQL語句。使用Delphi-SQL Server,似乎有一個我們從未關注的隱式SQL語句。但對於Oracle,我們必須爲每項操作提供自己的聲明。 如果使用UniDac或ODAC然後還有的SQLInsert,SQLUPDATE,在StoredProc object.If SQLDELETE性能要通過插入DBGrid的一個記錄,那麼你應該修改它的SQLInsert屬性
INSERT INTO EMPLOYEES VALUES(:EMPLOYEEID,:EMPLOYEENAME)
其中變量如下:是對應於存儲過程的te字段。他們只是簡單地綁定變量。更新和刪除時,儘管您需要一些唯一值來表示特定的記錄。主鍵是一個選項(也許是唯一的選擇,因爲我還沒有弄清楚如何將ROWID用於相同的目的)。因此,對於更新SQL語句和DELETE將
DELETE FROM EMPLOYEES WHERE EMPLOYEEID=:EMPLOYEEID
和
UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME WHERE EMPLOYEEID=:EMPLOYEEID
附:我剛剛找到了一種使用ROWID進行更新和刪除語句的方法。在存儲過程中,如果你選擇ROWID過,並給它一個別名,那麼你可以構建你的UPDATE和DELETE語句像這樣:
UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME,..... WHERE ROWID=:RECORD_ROWID
DELETE FROM EMPLOYEES WHERE ROWID=:RECORD_ROWID
在前面的語句RECORD_ROWID是字段名從存儲過程返回走樣的結果ROWID。如果你使用:ROWID,你會得到「ORA-01745:無效的主機/綁定變量名稱」錯誤。這是因爲在一個綁定變量中,冒號不能跟一個保留字。 ROWID是一個保留字。
我還沒有使用過uniDac組件,但是他們的網絡指出TUniStoredProc「允許你編輯作爲參數返回的遊標數據」。您使用了哪些特定組件?以及如何使用? – 2011-12-20 11:36:13
我使用TUniStoredProcedure – 2011-12-20 12:30:04