Не работает Rollback в OleDbTransaction для VFPOLEDB.1

GennadyK
Дата: 01.09.2005 21:52:27
DBF с OleDbProvider=VFPOLEDB.1
После "успешного" отката захожу в SUBID.DBF и вижу там неоткатившееся 1111, вместо исходного 1756. Может кто знает в чем дело.

Огромное спасибо!

Dim myConnection As New OleDbConnection("Provider=VFPOLEDB.1;" + _
"Data Source=C:\MACIR\Data;")
myConnection.Open()
Dim myCommand As OleDbCommand = myConnection.CreateCommand()
Dim myTrans As OleDbTransaction
' Start a local transaction
myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted)
' Assign transaction object for a pending local transaction
myCommand.Connection = myConnection
myCommand.Transaction = myTrans
Try
myCommand.CommandText = "UPDATE SUBID SET ID=1111"
myCommand.ExecuteNonQuery()
'Изначально ошибочная команда для выполнения Rollback:
myCommand.CommandText = "Insert into SUBID (ID) VALUES ('103')"
myCommand.ExecuteNonQuery()
myTrans.Commit()
Console.WriteLine("Both records are written to database.")
Catch e As Exception
Try
myTrans.Rollback()
Catch ex As OleDbException
If Not myTrans.Connection Is Nothing Then
Console.WriteLine("An exception of type " & ex.GetType().ToString() & _
" was encountered while attempting to roll back the transaction.")
End If
End Try
Console.WriteLine("An exception of type " & e.GetType().ToString() & _
"was encountered while inserting the data.")
Console.WriteLine("Neither record was written to database.")
Finally
myConnection.Close()
End Try
Sergey Ch
Дата: 01.09.2005 23:15:56
Меня очень смущает данная строка:

myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted)
VFP не поддерживает такие виды транзакций... Там все просто - BEGIN TRANSACTION and END TRANSACTION...

Или я что - то путаю...
Sergey Ch
Дата: 02.09.2005 00:06:31
Вот пример с моего коммерческого сайта, немного запутано, но думаю, что Вы идею поймете:

             Dim myTrans As OleDBTransaction = shopcartConn.BeginTransaction()
              cmd.connection=shopcartConn
              cmd.Transaction = myTrans
 
           Try
           
               cmd.ExecuteNonQuery()
               myTrans.Commit()
               lblasp.text="Your record has been added to basket."
           Catch m As Exception
            Try
               myTrans.Rollback()
               Catch ex As OleDBException
           If Not myTrans.Connection Is Nothing Then
             lblasp.text="An exception of type " & ex.GetType().ToString() & _
                        " was encountered while attempting to roll back the transaction."
            End If
           End Try

              lblasp.text="An exception of type " & e.GetType().ToString() & _
                    "was encountered while inserting the data. Your goods was not added to basket."
           Finally
               shopcartConn.Close()
           End Try
GennadyK
Дата: 02.09.2005 21:38:17
Спасибо, Сергей,
но все равно не работает. Может что с версиями?
Использую:
Microsoft OLE DB Provider for Visual FoxPro 9.0
VB.NET 2003
GennadyK
Дата: 02.09.2005 21:51:47
Если я правильно понимаю, главное не роллбэк, а коммит. Даже если оборвать программу после первого апдейта ничего не должно измениться в дбф файле. Но почему-то 1-й апдейт меняет файл выполняя myCommand.ExecuteNonQuery(). Где система хранит неподтвержденные данные и как транзакция коммитится? Серверной части ведь нет, как у SQL сервера.

Спасибо!
Sergey Ch
Дата: 03.09.2005 12:20:39
GennadyK
Если я правильно понимаю, главное не роллбэк, а коммит. Даже если оборвать программу после первого апдейта ничего не должно измениться в дбф файле. Но почему-то 1-й апдейт меняет файл выполняя myCommand.ExecuteNonQuery(). Где система хранит неподтвержденные данные и как транзакция коммитится? Серверной части ведь нет, как у SQL сервера.

Спасибо!

Я тут подумал и пришел к выводу, что Вы пытаетесь все сделать не правильно... Дело в том, что в FoxPro нет транзакций для свободных таблиц (эта возможность появилась только в версии 9.0, но она еще сыроватая и немного запутанная). Аналогично и в ADO.NET нет соответствующего механизма для поддержки транзакций в FoxPro...

Если использовать контейнер базы данных FoxPro - то в этом случае разработка баз данных мало отличается от SQL Server - Вы создаете хранимые процедуры, в кторых и выполняете как и в SQL Server явные BEGIN TRANSACTION/END TRANSACTION/COMMIT... В своих WEB проектах с базами данных FoxPro я использую хранимые процедуры в тех местах, где идет изменение в более чем двух местах. В этом случае все работает очень правильно и хорошо...

Извините, что не понял до конца Вашего вопроса, просто я давно перешел на Web Services - которые уже вызваются из под ASP.NET а сами Web Service написаны на самом FoxPro... Так что все получается очень дешево и очень сердито...

Good luck!
GennadyK
Дата: 06.09.2005 18:46:44
Сергей, огромное спасибо Вам за разъяснение.
Я уже начал писать свою поддержку транзакций через бэкап изменяемых файлов - благо эта конкретная задача позволяет.
Sergey Ch
Дата: 06.09.2005 22:44:13
GennadyK
Сергей, огромное спасибо Вам за разъяснение.
Я уже начал писать свою поддержку транзакций через бэкап изменяемых файлов - благо эта конкретная задача позволяет.

В принципе для свободных таблиц я пошел по этому-же пути, даже писал репликации и Daemon's которые как MS SQL Server синхронизировали таблицы на разных серверах... Работет до сих пор, хотя и питания и сервера от жары уже несколько раз "падали"... Все зависит только от Вас.

Good luck!
GennadyK
Дата: 08.09.2005 20:15:23
И у меня уже все работает.

Спасибо