Everest
|
BARRA MANSA RJ - BRASIL
|
|
ENUNCIADA !
|
|
|
Postada em 10/07/2006 11:19 hs
Desta vez vo tentar ser o mais claro possivel..... ' CursorType ' ' 2 - adOpenDynamic ' 0 - adOpenForwardOnly ' 1 - adOpenKeyset ' 3 - adOpenStatic ' ' LockType ' ' 4 - adLockBatchOptimistic ' 3 - adLockOptimistic ' 2 - adLockPessimistic ' 1 - adLockReadOnly ' Set rst = New ADODB.Recordset rst.CursorLocation = adUseClient rst.Open "sp_geral('2')", DBConn, _ adOpenDynamic, adLockPessimistic, _ adCmdStoredProc Debug.Print "CursorType: "; rst.CursorType; "LockType: " & rst.LockType Estou usando o banco de dados MSDE que esta no servidor e estou acessando o banco por uma estação (client/server). É o seguinte, quero abrir uma tela de cadastro, mas para isso quero abrir a tabela deste cadastro como CursorType: adOpenDynamic para que eu possa navegar nos registros em todas as direçoes e LockType: adLockPessimistic para que o registro que eu esteja editando possa estar bloqueado para qualquer outro usuário, só que o problema é o seguinte quando eu do um Debug.Print "CursorType: "; rst.CursorType; "LockType: " & rst.LockType vejo que o CursorType foi rebaixado para adOpenKeyset e o LockType foi para adLockBatchOptimistic. Por que isso acontece??? Quer dizer que eu nunca vo poder usar adOpenDynamic e adLockPessimistic??? Quando eu posso fazer isso junto? O que eu devo fazer para quando um usuário estiver editando um registro ele esteja bloqueado para os outros usuários? e com esse mesmo recordset eu possa navegar em todas as direções, movenext, moveprevious, etc..
|
|
|
|
|
Postada em 10/07/2006 12:00 hs
O MSDE e a maioria dos bancos não suportam o LockPessimistic... é pouco seguro, extremamente lento e acaba com a performance do servidor... Prefira usar sempre o LockOptimistic... em 5 anos programando nunca encontrei necessidade de travar um registro como Pessimistic... Qto ao OpenDinamic, ele só funciona com cursores do lado do servidor... como vc usou o adUseClient, precisa usar o adOpenKeyset... funciona exatamente como o Dinamic, mas do lado do cliente... Outra coisa: não adianta tentar mudar o CursorLocation do Recordset, como vc fez... ele vai herdar a propriedade CursorLocation da conexao... Uma ultima consideração: Nunca passe o nome da conexao como vc fez, no metodo Open do recordset... isso faz abrir uma nova instancia da conexao... vc perde em desempenho... sempre abra seus recordsets assim: Set rst = New ADODB.Recordset Set rst.ActiveConnection = DBConn rst.Open "sp_geral('2')", , adOpenKeyset, adLockOptimistic, adCmdStoredProc Bem, espero ter ajudado... Flw! t+
Elieser Carlos Topassi Analista de Sistemas - Desenvolvedor VB/ASP/.Net
e-mail/msn: elieser_topassi@yahoo.com.br
São José do Rio Preto,SP - Brasil _____________________________________________________ "O caminho do tolo aos seus prórios olhos lhe parece reto, mas o sábio ouve conselhos" (Pv 12:15)
|
|
|
Everest
não registrado
|
|
ENUNCIADA !
|
|
|
Postada em 10/07/2006 12:08 hs
Topassi minha ideia é a seguinte,
Vamos supor que eu tennha um cadastro de clientes, ok?!
Entao uma pessoa em uma determinada estação (pc) coloque o registro do cliente Numero '5' em edição, ou seja, ele esta fazendo uma alteração no cadastro, neste mesmo momento uma outra pessoa em uma outra estação (pc) acessa o cadastro de clientes e navega pelos registros no momento que ele vizualiza o cliente numero '5' ele resolve editar (alterar) este registro, neste momento que quero que o sistema seja capaz de informar a este usuário que este registro ja esta em edição por outro usuário.
Como eu faço isso?
|
|
|
|
Postada em 10/07/2006 13:48 hs
everest, eu faço da seguinte maneira: tenho uma tabela de logs, quando o usuario edita um registro eu gravo nessa tabela um log , com nome do usuario, data, hora e a chave primaria da tabela, etc... quando outro usuario tenta editar o mesmo registro, eu verifico nessa tabela se o registro esta sendo editado, se sim, nao deixo ele alterar, dou uma mensagem dizendo que ja esta sendo utilizado, caso contrario, ele edita o registro, e assim que termino a edição, quando vou gravar apago o log na tabela.
|
|
|
Everest
não registrado
|
|
ENUNCIADA !
|
|
|
Postada em 10/07/2006 13:57 hs
Mas este procedimento é viavel tecnicamente? o recordset do ADO nao possui este recurso de bloquear o registro para outros usuarios somente para edição/alteração (e pra consultar fica livre)?
|
|
|
|
Postada em 11/07/2006 16:04 hs
Cardoso, vc ja pensou em como vai funcionar esse seu método em uma rede com 100 maquinas, acessando um banco com 16GB de informações... só na tabela de clientes, mais de 50.000 registros, e cerca de 100 alterações por dia nesses registros, após uns 5 anos de operação do sistema??? bem, vc vai ter uma tabela de log com mais de 150.000 registros e vai levar pelo menos 5 minutos para um servidor decente responder se o registro esta liberado ou nao... Outro problema seria um usuario "gravar" nessa tabela que esta alterando um registro, e de repente cai a rede dele, reinicia a maquina, cai a energia... coisas do tipo... ai o registro esta travado... para sempre!!! (ou até vc ir la destravar manualmente na tabela)
Elieser Carlos Topassi Analista de Sistemas - Desenvolvedor VB/ASP/.Net
e-mail/msn: elieser_topassi@yahoo.com.br
São José do Rio Preto,SP - Brasil _____________________________________________________ "O caminho do tolo aos seus prórios olhos lhe parece reto, mas o sábio ouve conselhos" (Pv 12:15)
|
|
|
|