2012-08-29 32 views
1

有沒有人在FoxPro遠程視圖上使用過MYSQL事務? 可以請你分享一些樣本提交和回滾 的情況。使用遠程視圖的FoxPro和MYSQL事務

這些代碼不起作用,即使發出回滾,記錄仍然會被提交。

lcStringConn = 「驅動器= {MySQL的ODBC 5.1驅動};端口= 3306;服務器=本地主機;數據庫= TESTDATA; UID =使用; PWD =通過」 = SQLSETPROP(0, 「DispLogin」,3)

lnHandle = SQLSTRINGCONNECT(lcStringConn)

打開數據TESTDATA

使用表1

= SQLEXEC(lnHandle, 'START TRANSACTION')

APPE空白

REPL cfield1與反式(日期時間())

= SQLEXEC(lnHandle, 'ROLLBACK')

MyQry = 「SELECT *從表1」 = SQLEXEC(lnHandle,MyQry ,「MyView」,a行)

謝謝。

編輯:即時通訊使用InnoDB和使用SPT,交易工程。

+0

你在使用Innodb表嗎? MyISAM表不支持事務(指令被解析,然後被忽略)。 –

+0

是的,我正在使用InnoDB。如果我使用SQL Pass Through,我可以滾動/恢復更改。希望使用遠程查看來減少我的代碼。謝謝 – user1603827

回答

0

如果你想使用FoxPro中與外部數據源,如MYSQL遠程視圖,我會用一個數據庫容器,如「TESTDATA」,然後在數據庫中定義容器的數據源的連接。

創建連接後,您可以使用數據庫容器創建遠程視圖。只需在數據庫容器中單擊鼠標右鍵,即可在數據源中創建對所需表格的遠程視圖。在遠程視圖設計器中定義視圖時,如果希望此視圖可更新,請務必選中「更新」複選框。

然後在您的代碼中,您可以讓VFP數據庫容器完成繁重的工作。例如:

OPEN DATABASE testdata 
USE myRemoteView   &&Assume 1 record retrieve from data source. 

REPLACE someField WITH "SomeValue" 

IF NOT TableUpdate(0, .F., "myRemoteView") 
    * The update failed 
    TableRevert(.F., "myRemoteView") 
ENDIF 

試試看。你可以做的另一件事是在MySQL中創建一個存儲過程,並將開始和結束事務放在那裏。然後用VFP SQLEXEC()調用這些SP。

+0

我需要交易來更新兩個或更多遠程視圖。如果第一個視圖的更新失敗,我需要一種方法來恢復第二個視圖上的更改。 例如 開始跨 如果TABLEUPDATE(1,.F。, '表1')和TABLEUPDATE(1 .F。 '表2') 結束事務 否則 回滾 ENDIF 這種運作良好,對錶和本地視圖,但如果你在遠程視圖上使用它,它不起作用。我們需要爲此使用MYSQL Transaction。 – user1603827

0

使用Microsoft SQL如果您使用Transact SQL BEGIN TRANSACTION的VFP TABLEUPDATE將立即更新服務器,你不能做一個回滾。相反,你必須通過發出使用SQLSETPROP隱式手動事務(DB_TRANSMANUAL)開始交易:

nOldTransactionSetting = SQLGETPROP(_screen.sqlserver.handle,"Transactions") 
IF nOldTransactionSetting < 0 
    nOldTransactionSetting = 1 
ENDIF 
=SQLSetprop(_Screen.sqlserver.handle, "TRANSACTIONS", DB_TRANSMANUAL) && start manual transaction  
Begin Transaction  && start VFP transaction 
lOkToCont = Tableupdate(2, .T., 'CursorAdapter1') 
If lOkToCont 
    lOkToCont = Tableupdate(2, .T., 'CursorAdapter2') 
Endif 
If lOkToCont  && Commit the transaction on the server and VFP. 
    =SQLExec(_Screen.sqlserver.handle, 'IF @@TRANCOUNT > 0 COMMIT') 
    End Transaction 
Else    && Rollback the transaction on the server and VFP. 
    =SQLExec(_Screen.sqlserver.handle, 'IF @@TRANCOUNT > 0 ROLLBACK') 
    ROLLBACK 
Endif 
=SQLSetprop(_Screen.sqlserver.handle, "Transactions", nOldTransactionSetting) 

我懷疑你可能不得不做同樣的事情在MySQL。