有人在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,交易有效。
答案 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中做同样的事情。