FoxPro&使用远程视图的MYSQL事务

时间:2012-08-29 19:49:05

标签: mysql transactions foxpro

有人在FoxPro远程视图上使用过MYSQL事务吗? 你能否在提交和回滚时分享一些样本 场景。

这些代码不起作用,即使我发出回滚,记录仍然会被提交。

  

lcStringConn =“Driver = {MySQL ODBC 5.1 Driver}; Port = 3306; Server = localhost; Database = testdata; Uid = use; pwd = pass”   = SQLSETPROP(0, “DispLogin”,3)

     

lnHandle = SQLSTRINGCONNECT(lcStringConn)

     

打开数据testdata

     

使用table1

     

= SQLEXEC(lnHandle,'START TRANSACTION')

     

显示空白

     

使用Trans(DateTime())Repl cfield1

     

= SQLExec(lnHandle,'ROLLBACK')

     

MyQry =“SELECT * from table1”   = SQLEXEC(lnHandle,MyQry,“MyView”,aRows)

感谢。

编辑:我使用InnoDB并使用SPT,交易有效。

2 个答案:

答案 0 :(得分:0)

如果你想在Foxpro中使用远程视图和外部数据源(如MYSQL),我会使用数据库容器,例如“testdata”,然后在数据库容器中定义一个连接到数据源的连接。

创建Connection后,您可以使用数据库容器创建远程视图。只需右键单击数据库容器,即可创建数据源中所需表的远程视图。在远程视图设计器中定义视图时,如果希望此视图可更新,请务必选中“更新”复选框。

然后在您的代码中,您可以让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中创建一个存储过程并将Begin和End Transactions放在那里。然后使用VFP SQLEXEC()调用这些SP。

答案 1 :(得分: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中做同样的事情。