Olá!
asimoes escreveu:Poderia mostrar o código da função ExecSQL ?
Essa forma só vendo como funciona a função ExecSQL( "BEGIN TRANSACTION;" )
O exemplo que postei acima é genérico e ExecSQL foi apenas uma referência a uma função que deve ser escrita pelo programador, de acordo com o método de acesso que ele utiliza (ADO, ODBC, SQLRDD...)
asimoes escreveu:BeginTrans(), CommitTrans() e RollBackTrans() são métodos do objeto ADODB.Connection, CommitTrans() e RollBackTrans() são métodos do objeto ADODB.Connection
Verdade. Mas antes de serem estes métodos do ADO, são comandos SQL, entendidos pelo SGBDR. ADO apenas encapsula isto em seus métodos. Quando solicitado, ADO executa o comando correspondente no SGBDR. Portanto, nada impede que, ao invés de consumir o método BeginTrans(), envie-se o correspondente comando ao SGBDR. No caso do MariaDB, pode ser "BEGIN" ou "START TRANSACTION". "COMMIT" e "ROLLBACK" são iguais aos demais bancos.
cnn.Execute "BEGIN",0, adExecuteNoRecords
cnn.Execute "ROLLBACK",0, adExecuteNoRecords
cnn.Execute "COMMIT",0, adExecuteNoRecords
A função ExecSQL() deve executar comandos SQL. Os comandos SQL poder ser divididos, a grosso modo, em duas categorias:
os que retornam dados (um record set) e os que não fazem isto. Este fato deve ser considerado na construção de uma função tipo ExecSQL(). Tem programador que cria duas funções, uma para cada situação. Outros escrevem apenas uma, controlando a situação através de parâmetros recebidos. Assim podemos ter: ExecSQLQuery( oConn, cQuery ) ou ExecSQLNonQuery( oConn, cQuery ) ou ExecSQL( oConn, cQuery, lNonQuery ). E tem aqueles que usam ADO e não escrevem uma função - usam o método execute do objeto cone
Xão ou open do objeto recordset.
No
tópico escrevi a função abaixo usando open do objeto recordset:
STATIC FUNCTION ExecuteSql( cSql )
LOCAL oRs As Object
LOCAL oErr As Object
Try
oRs := win_OleCreateObject("ADODB.RecordSet")
With Object oRs
:activeConnection := oCn:connectionString
:cursorLocation := adUseClient
:cursorType := adOpenDynamic
:lockType := adLockOptimistic
//:maxRecords := 100000
:cacheSize := 100
:source := cSql
:open()
End With
If ! oRs:eof()
oRs:moveFirst()
Endif
Catch oErr
Throw( oErr )
Finally
IF oRs:state() = adStateOpen
oRs:close()
ENDIF
End
RETURN oRs
Fernando queiroz escreveu:Bom eu não faço o COMMIT e todas as transações são gravadas. ( sera que so funciona automatico no MARIADB ?? )
Os SGBDR tem como padrão o autocommit. No MariaDB, para desativar este padrão, pode-se executar o comando:
SET AUTOCOMMIT=0; -- desativa
SET AUTOCOMMIT=1; -- ativa autocommit
Quando autocommit está ativo, o commit é feito após a execução de cada comando.
Não me lembro onde li isto:
Quando se inicia uma transação (BEGIN ou SET TRANSACTION), internamente o SGBDR emite um SET AUTOCOMMIT=0;, desativando
o commit automático. Se aparecer um comando ROLL BACK ele despreza tudo e volta o estado anterior do auto commit. Se aparecer um
COMMIT, ele grava tudo e volta o estado anterior do auto commit.Se der tempo, depois posto um exemplo.