Ir para conteúdo
  • Cadastre-se

dev botao

Salvar Tstringstream No Bd


Ver Solução Respondido por Danilo,
  • Este tópico foi criado há 4260 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Alguém já fez algo parecido, salvar um objeto TStringStream no BD via SQL sem ter que usar CDS ou outros...

 

Ex:

 

SQL := ' update nfe_cabecalho set XML_ULTIMO = ' + TStringStream + ' where id = ' + '"'+pIdNFeCAB+'"';

 

 

 qual seria a alternativa pra salvar os xml's direto no bando sem salvar em disco ?

 

 

Se alguém puder ajudar, agradeço...

Postado

Obrigado pelas sugestões, mas infelizmente não deu certo... se eu salvar em disco da certo, mas salvando a string no bd e recuperando ela depois pra imprimir um danfe por ex... ele nao valida:

 

acusa:  Não encontrei inicio do URIId=

class function TldiNFe.Retornar_XML(pIdNFeCAB: String; pTipo_RET: string):TRetorno_XML;
var
 ConsultaSQL : WideString;
 resDBX : TDBXReader;
 cdsXML_T : TClientDataSet;
begin

  ConsultaSQL := 'select XML_ULTIMO from nfe_cabecalho where ID = ' + pIdNFeCAB;

  resDBX:= TORM.Consulta(ConsultaSQL);

  cdsXML_T := TClientDataSet.Create(nil);
  cdsXML_T.FieldDefs.Clear;
  cdsXML_T.FieldDefs.add('XML', ftBlob);
  cdsXML_T.CreateDataSet;

  while resDBX.Next do
   begin
    cdsXML_T.Insert;
    cdsXML_T.FieldByName('XML').AsAnsiString := UpperCase(ResultSet.Value['XML_ULTIMO'].AsString);
   end;

   //MessageInfo(cdsXML_T.FieldByName('XML').AsString);

   if pTipo_RET = 'XML' then
    begin
      Result.trXML := TStringStream.Create(cdsXML_T.FieldByName('XML').Value);
    end;

   if pTipo_RET = 'TXT' then
    begin
     Result.trXMLtxt := cdsXML_T.FieldByName('XML').AsString;
    end;
end;
Postado

Qual é seu banco de dados?

 

Utilizo SQL Server e faço isso tratando o campo como varchar(max) mesmo ele sendo do tipo XML,

 

Amanhã posto o código de como gravar ele em banco, para ler, basta converter o campo para varchar.

- Sou desenvolvedor.

- De que linguagem, delphi? .NET? Java?

- Qualquer uma, sou desenvolvedor.

Postado (editado)

Qual SGDB você utiliza?

 

Salvo em um campo do tipo Blob Text utilizando o Firebird normalmente.

 

Para salvar utilizo algo do tipo:

 

var
  lStream: TStringStream;
begin
  lStream := TStringStream.Create;
  try
    // Utilizado para carregar o conteúdo do arquivo na memória:
    lStream.LoadFromFile('c:\arquivo.xml');
    // Ou se preferir use:
    lStream.WriteString('conteudo xml aqui...');
    
    qryNotas.Edit;
    qryNotasCAMPOXML_BLOB.LoadFromStream(lStream); // Este campo deve ser do tipo TBlobField
    qryNotas.Post;
  finally
    lStream.Free;
  end;
Editado por Herik
Postado

Bom dia,

 

eu utilizo o MySQL, mas hospedado em datacenter... e outro problema que notei é q quando se está hospedado, ele passa a ser case sensitive.. rs.. só pra piorar.. 

Postado

Bom dia,

 

eu utilizo o MySQL, mas hospedado em datacenter... e outro problema que notei é q quando se está hospedado, ele passa a ser case sensitive.. rs.. só pra piorar.. 

Bom dia.

 

O MySQL é CaseSensitive quando está instalado em sistemas Linux Like.

 

Mas em ambientes Windows não.

 

Atenciosamente.

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

Postado

Bom dia.

 

O MySQL é CaseSensitive quando está instalado em sistemas Linux Like.

 

Mas em ambientes Windows não.

 

Atenciosamente.

 

Então por isso q localmente ele nao é case sensitive, meu plano de hospedagem é linux... bom saber, obrigado.

  • Solution
Postado

Deu certo, consegui trabalhar apenas com xml no bando, evitando salvá-los no disco. 

 

Usei o código para persistir no BD, antes eu passava um lowerCase na consulta, mas agora uso um específico no ORM que não trata isso, no caso so xml, isso bagunçava e por isso não validava, claro, além da assinatura do certificado que tbm perdia a validade.

 

class function TldiNFe.Grava_XML_No_BD(pXML: TStringStream; pIdNFeCAB: String): Boolean;
var
 SQL  : WideString;
 sXML : WideString; // Conteudo do XML
 sList: TStringList;
begin
  try
   try
   Result := true;
   sList:= TStringList.Create;
   sList.LoadFromStream(pXML);
   sXML := sList.CommaText;
   SQL := ' update nfe_cabecalho set XML_ULTIMO = ' + sXML + ' where id = ' + pIdNFeCAB;
   TORM.Consultar_Case_Sensitive(SQL);
  except
    Result := false;
  end;
  finally
    sList.Free;
  end;
end;

 

 

Uso esse código para recuperar o "xml" do BD:

 

class function TldiNFe.Retornar_XML_Do_BD(pIdNFeCAB: String): TStringStream;
var
 ConsultaSQL : WideString;
 reader      : TDBXReader;
 sXML        : TStringStream;
begin
 try
  sXML:= TStringStream.Create;
  ConsultaSQL := 'select XML_ULTIMO from nfe_cabecalho where ID = ' + pIdNFeCAB;

  reader := TORM.Consulta(ConsultaSQL);

  while reader.Next do
   begin
     sXML.WriteString(reader.Value['XML_ULTIMO'].AsString);
   end;
    Result :=  sXML;
 finally

 end;
end;

 

 

Agradeço à todos pelas dicas, elas foram importantes para eu chegar à esse resultado. Principalmente a dica do Erik, sempre tive dificuldades de trabalhar com TStringStream, essa linha aqui me salvou: (sXML.WriteString(' xml.... '))

 

tbm mudei o tipo de dado de (text) para (longtext) no MySQL

  • 2 meses depois ...
Postado (editado)

ola Danilo tudo bem ! nao consegui abrir para imprimir o xml que vem do db, vc tem o exemplo

Editado por wilmar
Postado (editado)

bom dia... eu trago do BD o xml e coloco em um memo, dai eu passo do memo para uma variavel q através de um laço "monta" o xml corretamente e consigo trabalhar com o result normalmente... segue abaixo a rotina:

 

postei só a rotina que trata o xml ja trazido do banco, pq fora isso é um select normal... 

 

var
 s           : TStrings;
 z           : AnsiString;
 i           : integer;
 sMemo       : TMemo;
begin
 try
  sMemo := TMemo.Create(nil);
  sMemo.Parent := Fmenu.PaneldoMemo;
  sMemo.Visible := false;
  sMemo.Clear;

    s := sMemo.Lines;
    for I := 0 to s.Count - 1 do
     begin
       z := z + s.Strings[i];
     end;

    Result :=  z;

 finally
   sMemo.Destroy;
 end;

Editado por Danilo
Postado (editado)

muito bom ate agora ... mas como faço agora para imprimir o danfe do memo

 

 

ACBrNFe.NotasFiscais.LoadFromString(aqui vai o result da função);

ACBrNFe.NotasFiscais.Imprimir;

Editado por Danilo
  • Este tópico foi criado há 4260 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.