Problema com campo blob no DBExpress 4
Olá, acontece o seguinte. Estou tentando inserir o conteúdo de um memo para dentro de um campo blob e no .ApplyUpdates(0); do ClienteDataSet me retorna a seguinte mensagem de exceção: ´Incorrect values within SQLDA structure´.
O campo está definido da seguinte forma: ´BLOB SUB_TYPE 0 SEGMENT SIZE 80 CHARACTER SET WIN1252´. ( Firebird 2.0/ DBExpress 4 / Delphi 2009 ) Sempre funcionou antes do DBExpress 4. Tentei trocar também a dll, tanto do firebird/interbase quanto a dll do proprio dbexpress. Mas persiste o erro.
Se alguém tiver mais alguma sugestão que possa dar uma iluminada no assunto, será bem-vinda.Já tentei usar uma SQLQuery para fazer um UpDate direto. O erro persiste. Obrigado pela atenção e aguardo alguma ajuda.
O campo está definido da seguinte forma: ´BLOB SUB_TYPE 0 SEGMENT SIZE 80 CHARACTER SET WIN1252´. ( Firebird 2.0/ DBExpress 4 / Delphi 2009 ) Sempre funcionou antes do DBExpress 4. Tentei trocar também a dll, tanto do firebird/interbase quanto a dll do proprio dbexpress. Mas persiste o erro.
Se alguém tiver mais alguma sugestão que possa dar uma iluminada no assunto, será bem-vinda.Já tentei usar uma SQLQuery para fazer um UpDate direto. O erro persiste. Obrigado pela atenção e aguardo alguma ajuda.
Lcfinformatica
Curtidas 0
Respostas
Discorpio
26/05/2009
Bom dia Lcfinformatica.
Os campos Blob sub_type 0 é campo binário para armazenamento do tipo de imagens, para campos Memo, o tipo correto é Blob sub_type 1 ou Blob sub_type text e o segment size pode continuar sendo 80
Os campos Blob sub_type 0 é campo binário para armazenamento do tipo de imagens, para campos Memo, o tipo correto é Blob sub_type 1 ou Blob sub_type text e o segment size pode continuar sendo 80
GOSTEI 0
Lcfinformatica
26/05/2009
Obrigado pela ajuda. Realmente é verdade o que disse. Mas aqui, mesmo mudando de zero para 1, o erro persiste. Vou continuar tentando alternativas e esperando dicas.
GOSTEI 0
Discorpio
26/05/2009
Bom dia Lcfinformatica.
Retire o texto [color=blue:06eb2fa233]´CHARACTER SET WIN1252´[/color:06eb2fa233] na declaração do campo e veja o que acontece
Retire o texto [color=blue:06eb2fa233]´CHARACTER SET WIN1252´[/color:06eb2fa233] na declaração do campo e veja o que acontece
GOSTEI 0
Lcfinformatica
26/05/2009
Caro Discorpio, obrigado novamente pela ajuda. Mas acontece o seguinte, até a versão 7 do Delphi eu consigo trabalhar com o campo blob desta forma ou das formas que voce sugeriu. Mas nesta versão da IDE, 2009, o dbexpress não está salvando o campo. Ele consegue ler o campo do banco e mostrar na tela. Mas no momento em que se altera e salva, acontece o erro. Acredito eu que esse problema começou com o Delphi 2007, mas não cheguei a usá-la muito. Ainda tentando uma correção. Abri um ticket em outro site também e consultei um representante da CodeGear e ainda espero resposta. Se voce lembrar de mais alguma coisa que possa ajudar, estarei acompanhando.
GOSTEI 0
Discorpio
26/05/2009
Boa noite Lcinformatica.
Bom, se o mesmo está lendo e não está salvando, então dê dois clicks no ClientDataSet e selecione o campo Blob, vá no Object Inspector e verifique se a propriedade ReadOnly está setada para True, se estiver, configure-a para false.
Outra coisa que voce deve observar é que o ApplyUpdates(0) por si só não salva o registro no banco físico, apenas atualiza o DataSet local no Client, e prepara os dados para DataSetProvider empacotá-los, porém os dados só são confirmados no banco físico após o método Commit do SQLConnection ser acionado.
Para salvar com o Commit é assim:
Bom, se o mesmo está lendo e não está salvando, então dê dois clicks no ClientDataSet e selecione o campo Blob, vá no Object Inspector e verifique se a propriedade ReadOnly está setada para True, se estiver, configure-a para false.
Outra coisa que voce deve observar é que o ApplyUpdates(0) por si só não salva o registro no banco físico, apenas atualiza o DataSet local no Client, e prepara os dados para DataSetProvider empacotá-los, porém os dados só são confirmados no banco físico após o método Commit do SQLConnection ser acionado.
Para salvar com o Commit é assim:
Evento OnClick De Um Botão Qualquer(Sender : Tobject); Var Transacao : TTransactionDesc; Begin Transacao.TransactionID := 1; Transacao.IsolationLevel := xilREPEATABLEREAD; SqlConnection.StartTransaction(Transacao); Try Tabela.Post; SqlConnection.Commit(Transacao); Except SqlConnection.Rollback(Transacao); End; End;
GOSTEI 0
Lcfinformatica
26/05/2009
Para esta situação não estou usando transação e, desculpe informar , está salvando todos os outros campo só com o ApplyUpdates(0), menos o blob. O campo não está ReadOnly, pois se estivesse não poderia alimentá-lo. Mas fui conferir mesmo assim. Obrigado mais uma vez pela ajuda Discorpio . :)
GOSTEI 0