1

FoxPro リモート ビューで MYSQL トランザクションを使用した人はいますか? コミットとロールバックのシナリオに関するいくつかのサンプルを共有していただけますか。

これらのコードは機能しません。Rollback を発行してもレコードはコミットされます。

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, 'START TRANSACTION')

アップルブランク

cfield1 を Trans(DateTime()) に置き換えます

=SQLExec(lnHandle, 'ROLLBACK')

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

ありがとう。

編集: InnoDB を使用し、SPT を使用すると、トランザクションが機能します。

4

2 に答える 2

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 に答える
0

MYSQL などの外部データソースで Foxpro のリモート ビューを使用する場合は、"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 をそこに配置することです。次に、これらの SP を VFP SQLEXEC() で呼び出します。

于 2012-08-30T13:01:51.580 に答える