ADO, atualizar o registro.

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

ADO, atualizar o registro.

Mensagem por Itamar M. Lins Jr. »

Ola!

Código: Selecionar todos

*-----------------------------------------------------------------------------*
METHOD Update() CLASS DBADO
*-----------------------------------------------------------------------------*
Local oErr, lRet := .T., OleError
	TRY
		IF ::oRs:LockType = adLockBatchOptimistic
			If !::EOF
				::oRs:UpdateBatch()
			Endif
		ELSE
			::oRs:Update()
		ENDIF
	CATCH oErr
//		lRet := MyDefError(oErr, .F., self)  // Mi manejadr de errores
		OleError := ::oRs:ActiveConnection:Errors[0]
		MsgStop(oErr:Description+hb_OsNewLine()+"Native Error "+STR(OleError:NativeError),"Error al guardar")
		lRet := .F.
	END
Return lRet
O ADO cuida de tudo isso, se eu tiver um RecordSet armado com o comando oRs: = chave SELECT, nome, endereço FROM clientes se quiser alterar o nome, só preciso fazer oRs: Campos (1): Valor: = new_name ou usando ado .prg (acabei de compartilhar um link para download) Posso executar oRs: Nome: = new_name, então oRs: Update () e pronto, ele é atualizado no banco de dados.
Usando ADO, basta atualizar o field via x:value := "X..." depois oRS:update() que atualiza ?
Não precisamos usar comandos SQL "insert into..., UPDATE..." ? se for assim tá legal.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ADO, atualizar o registro.

Mensagem por JoséQuintas »

Itamar M. Lins Jr. escreveu:Usando ADO, basta atualizar o field via x:value := "X..." depois oRS:update() que atualiza ?
Não precisamos usar comandos SQL "insert into..., UPDATE..." ?
se for assim tá legal.
Isso mesmo, mas depende do ODBC ser totalmente compatível.
Inclusive no VB fica mais integrado, pode-se usar RS!Codigo ao invés de RS.Fields( "código" ).Value
Mas depende do ODBC estar completo, do fabricante ter liberado tudo.
Na dúvida melhor SQL mesmo.

https://ns7.webmasters.com/caspdoc/html ... method.htm

Código: Selecionar todos

` Change data in edit buffer. 
rstEmployees!fname = "Linda" 
rstEmployees!lname = "Kobara"
` Show contents of buffer and get user input. 
strMessage = "Edit in progress:" & vbCr & _ 
" Original data = " & strOldFirst & " " & _ 
strOldLast & vbCr & " Data in buffer = " & _ 
rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _ 
"Use Update to replace the original data with " & _ 
"the buffered data in the Recordset?"
If MsgBox(strMessage, vbYesNo) = vbYes Then 
   rstEmployees.Update 
Else 
   rstEmployees.CancelUpdate 
End If
Nota: considerar rstEmployees!fname como rstEmployess:Fields( fname ):Value
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ADO, atualizar o registro.

Mensagem por JoséQuintas »

Tem mais que isso:

No Access existe a opção de VINCULAR DBF ao banco Access, através de ADO, ou qualquer outra base de dados.
Ou seja... o Harbour poderia trabalhar normalmente com o MDB, como um banco Access comum, mas estar atualizando qualquer outra base de dados.

O Harbour tem LIB pra trazer as coisas pra formato DBF ou formato array
O ADO trás pra formato ADO
O Access trás pra formato Access
E por aí vai.

No final expande as opções:

O programador precisa decidir se quer trabalhar com formato array, DBF, ADO, SQL, misto, etc.
Depois/durante a decisão, pode escolher o conector que vai usar e/ou LIB que vai usar.
Nada impede de testar várias opções até mesmo ao mesmo tempo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

ADO, atualizar o registro.

Mensagem por alxsts »

Olá!

Depende de como o recordset foi criado (método Open).
Valor/Constante Tipo/Descrição

3 / adOpenStatic
Define um cursor do tipo Static. Um cursor deste tipo contém uma cópia estática dos registros. O conteúdo do RecordSet é definido no momento da criação do mesmo. Caso sejam feitas alterações no Banco de dados, estas alterações não serão visíveis para o RecordSet que utiliza um cursor do tipo Static. Somente recriando o RecordSet é que poderemos ter acesso as alterações efetuadas. Podemos movimentar o ponteiro de registro em ambas as direções, isto é, podemos utilizar os métodos MoveNext, MovePrevious e assim por diante.

0 / adOpenForwardOnly
Cria um cursor do tipo Forward Only. Este é o valor padrão que será utilizado caso não seja definido nenhum outro tipo. Somente podemos utilizar o método MoveNext. Se tentarmos utilizar um outro método de movimentação, será gerado um erro e a página não será carregada. Também é um cursor do tipo Static, com a diferença que somente podemos nos movimentar para a frente.

2 / adOpenDynamic
Cria um cursor do tipo Dynamic. Um cursor deste tipo não possui um conjunto fixo de registros. Quaisquer alterações, adições e exclusões feitas por outros usuários serão visíveis para o objeto RecordSet, sem que o mesmo tenha que ser eliminado e recriado. Podemos nos movimentar em ambas as direções dentro do RecordSet.

1 / adOpenKeyset
Cria um cursor do tipo Keyset. Um cursor deste tipo é parecido com um cursor Dynamic, com a exceção de que o conjunto de registros é fixo. O RecordSet enxerga as alterações feitas por outros usuários, porem a adição de novos registros não é visível para um RecordSet do tipo Keyset. Caso algum registro seja eliminado por outros usuários, o respectivo registro estará inacessível no RecordSet. Podemos nos movimentar em ambas as direções dentro do RecordSet.
Fonte: Júlio Battisti
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

ADO, atualizar o registro.

Mensagem por Itamar M. Lins Jr. »

Ola!
Vendo com calma, tem vantagens e desvantagens.
A vantagem principal que vejo é para quem está migrando do DBF, trabalhar de forma igual mas com BD relacional.
A desvantagem é ficar fora do padrão, totalmente preso sem saber usar os outros comandos, SQL, INSERT, UPDATE.
O SQLMIX obriga usar os comandos SQL, para gravar, incluir e ler.
Algumas pessoas acham isso um incomodo, pois não querem digitar as longas "QUERYES", ... INSERT INTO bla,bla,bla... mas isso lá na frente tem um ganho pq já fica pronto para qualquer linguagem "OFF WINDOWS". E um maior controle, sem as falhas "possíveis" desta técnica particular do ADO, conforme relato do José Quintas. Seria a mesma coisa de usar ADO igual a DBF, ai o sujeito trocou 6 por meia dúzia.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

ADO, atualizar o registro.

Mensagem por Itamar M. Lins Jr. »

Ola!
Depende de como o recordset foi criado (método Open).
Deve está desatualizado.

Código: Selecionar todos

rs.CursorLocation=adUseClient
rs.CursorType=adOpenStatic
rs.LockType=adLockBatchOptimistic
adUseClient 3 Uses a client-side cursor supplied by a local cursor library. For backward compatibility, the synonym adUseClientBatch is also supported

Código: Selecionar todos

oC := win_oleCreateObject( "ADODB.Connection" )
	oC:CursorLocation := adUseClient
	oC:ConnectionTimeout := 10
	oC:CommandTimeOut := 15 //30

	DO CASE
	CASE Engine  == "MARIADB"
		nOption := 3+4194304+67108864	// dont know + auto_reconect + multiple_statementes_allowed
		sconection := "Provider=MSDASQL;Driver={MariaDB ODBC 3.0 Driver};" + ;
							"Server=" + Server + ;
							";Database=" + Database + ;
							";User=" + User + ;
							";Password=" + Pass + ;
							";Option="+str(INT(nOption))+if(Port <> NIL, ";Port="+Port ,";")
	
Essa é a forma que não precisa usar SQL, é tratado igual a DBF. oRS:Update() grava do bando de dados.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Responder