Jump to content
Fivewin Brasil

problemas para gravar foto em banco de dados MYSQL


marcioe

Recommended Posts

Amigos, estou tendo problemas para gravar foto de clientes em banco de dados.

O problema ocorre devido ao tamanho da imagem, que é obtida de uma WEBCAM.

Vejam a estrutura da tabela

xetm.jpg

x8ff.jpg

Sempre ante gravar eu deleto a foto do cliente caso exista

ESTRANHO DEMAIS...

ABAIXO O CÓDIGO DE GRAVAR A FOTO NA TABELA

*-------------------------------------------------------------------------------
* Gravar a foto do cliente
*-------------------------------------------------------------------------------
FUNCTION INSERE_APAGA_FOTO_CLIENTE(T_OPERACAO_CLIENTES)
	T_ID_FOTO	:= 0     
  	Cursor("SQL")
   IF SELECT("foto_cliente") != 0
		foto_cliente->(DbCloseArea())
	ENDIF		
	cQuery:='select * from foto_cliente where CODIGO_CLIENTE = ' +  TRANSFORMA_SQL(T_CODI_CLIENTE,"N",06,0)  + ' ORDER BY ID_FOTO DESC'
	use sql cQuery alias "foto_cliente" new via 'MYSQL'
	foto_cliente->( DbGoTop())
	T_ID_FOTO	:= foto_cliente->ID_FOTO 
	IF LEN( T_FOTOGRAFIA) != 0
	   BEGIN TRANSACTION
			cQuery_Mtabela  := 'DELETE from foto_cliente where CODIGO_CLIENTE = ' +  TRANSFORMA_SQL(T_CODI_CLIENTE,"N",06,0)  
			COMITAR_DADOS_SQL(cQuery_Mtabela)
		END TRANSACTION
		* TENTEI CNVERTENDO ARA HEXA, MAS MESMO ASSIM DÁ ERRO
		*T_FOTOGRAFIA := StrToHex(MemoRead(DRIVE_TR+"\"+CURDIR() + "\TMP_IMG.JPG"))
		IF SELECT("foto_cliente") != 0
			foto_cliente->(DbCloseArea())
		ENDIF		
	   BEGIN TRANSACTION
			cQuery_Mtabela  := 						"INSERT INTO foto_cliente ( "
			cQuery_Mtabela	 := cQuery_Mtabela + " CODIGO_CLIENTE 	"
			cQuery_Mtabela	 := cQuery_Mtabela + ",DATA_FOTO			"
			cQuery_Mtabela	 := cQuery_Mtabela + ",FOTO				"					
			cQuery_Mtabela	 := cQuery_Mtabela +	" ) VALUES ( "
			cQuery_Mtabela	 := cQuery_Mtabela +	TRANSFORMA_SQL(T_CODI_CLIENTE,"N",06,0) 		+ ","
			cQuery_Mtabela	 := cQuery_Mtabela + TRANSFORMA_SQL(DATE(),"D",08,0) 					+ ","
			cQuery_Mtabela	 := cQuery_Mtabela + ANY2SQL( MemoRead( ALLTRIM(T_FOTOGRAFIA) ) )  
			cQuery_Mtabela	 := cQuery_Mtabela + " )"
			COMITAR_DADOS_SQL(cQuery_Mtabela)
		END TRANSACTION
	ENDIF
	RELEASE T_FOTOGRAFIA, cFile, IMG_FOTO
	T_FOTOGRAFIA       			:= SPACE(200)
   cFile					 			:= SPACE(200)
	IMG_FOTO				 			:= SPACE(200)
	HB_GCAll(.T.)
RETURN .T.                                                           

Link to comment
Share on other sites

Olá Márcio,

Quando passei por um problema semelhante o que eu fiz foi separar a gravação da foto do cliente, produto ....

pode ver que é semelhante ao seu comando

sqlexecute("UPDATE cadcli SET FOTO = " + Any2Sql( memoread('C:\CiaLoja\foto_cli\CL'+ncodcli+'.JPG') ) + " where cadcli.CODCLI='"+ncodcli+"'")

Daniel Segura

Link to comment
Share on other sites

Amigo, obrigado por responder, mas eu já estou fazendo isso até melhor ainda, pois a tabela de foto é separada do cadastro do cliente

E eu sempre apago a foto antiga para gravar uma nova.

pelo que percebi está relacionado com o tamanho do arquivo que é de 900 KB (921.654 bytes) 640x480

Se for uma imagem pequena dá certo.

Porem esse cliente comprou uma web de alta qualidade justamente para isso. Pois ele quer ter qualidade na foto dos seus clientes.

Link to comment
Share on other sites

Uma coisa você sempre tem que fazer:

- Verificar o valor de max_allowed_packet e ver se o tamanho da imagem enviada é menor que este valor, caso NÃO seja, inserir mensagem de bloqueio no sistema.

Outra coisa que se tem que fazer, talvez, seja aumentar o valor dessa variável, pois creio que o padrão seja apenas 1Mb. Aumentando o tamanho dela, não significa que não terá que fazer o teste acima.

Para alterar o valor dela (a variável), tem várias formas:

http://stackoverflow.com/questions/8062496/how-to-change-max-allowed-packet-size

Link to comment
Share on other sites

Faz isso aqui Márcio, e depois me fala se deu certo.

SET @maximo_em_mb:=20;
 
SET global MAX_ALLOWED_PACKET:= GREATEST( 1024*1024*@maximo_em_mb , @@NET_BUFFER_LENGTH ) ;

caso NÃO dê certo, fala o tamanho em mega da sua imagem

veja que o primeiro SET é pra você definir qual será o máximo em mega bytes que suas imagens irão ter

obs.: fiz um edit, veja o 1024*1024 : fiz isso para você converter mega bytes para kbytes para bytes...

Edited by Erciley Junior
Link to comment
Share on other sites

Olá,

Embora o autor do post não tenha informado a mensagem de erro gerada, este tipo de comportamento é característico de quando o banco de dados não está configurado para trabalhar com buffers de dados muito longos.

Se for isto mesmo - eu também acho que é - o Erciley está correto e basta configurar o banco adequadamente para sanar o problema. Em caso de dúvidas, efetuar uma busca na página do MySQL a respeito do problema ou até mesmo no Google pois esquecer de configurar isto é uma falha muito comum.

Link to comment
Share on other sites

Erro de Lost Connection pode ser várias "coisas".

Geralmente ocorre quando uma instrução fica na fila do banco (o seu insert por exemplo), e por algum motivo, a tabela está "locada" e aí ocorre o erro de time out.

Creio que pode ser devido o tamanho da imagem, e blablabla.

Há variável para controlar o time out também, para aumentar o tempo de espera.

Procure aí: variável time out mysql

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...