1

有人在 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)

开放数据测试数据

使用表1

=SQLEXEC(lnHandle, '开始交易')

申请空白

用 Trans(DateTime()) 复制 cfield1

=SQLExec(lnHandle, '回滚')

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

谢谢。

编辑:我使用 InnoDB 并使用 SPT,事务有效。

4

2 回答 2

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

于 2012-08-30T13:01:51.580 回答
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 中做同样的事情。

于 2013-02-06T03:47:07.083 回答