I don´t get original information that I saved in varchar(8000) field into sql server 2014

by JotaDevelop   Last Updated September 11, 2019 19:26 PM - source

No puedo recuperar el mensaje binario que guardé en la base de datos para separar cada uno de sus datos.

Dentro de un archivo binario se encuentra una parte llamada "mensaje". Este contiene información como "ip que lo envio", "formato de mensaje", entre otros datos. Y este "mensaje" se debe guardar en un campo de la base de datos sql server 2014, para lo cual se ha utilizado un campo de tipo varchar(8000). En delphi se utilizó un componente fdquery para crear la sentencia Insert y se pasó por parámetro la informacion mediante un parametro tmemorystream. Al revisar por longitud tanto el mensaje original como lo guardado en sql coinciden. Pero al intentar leer de la base de datos mediante un componente fdquery no se logra obtener el valor original.

Lectura del mensaje del archivo binario

BlockRead( ArchivoB, Msg^, CtrlTrnInfo.ReqMsgLen );

Se almacena en variable TMemoryStream

msgTrnStream := TMemoryStream.Create;
msgTrnStream.Clear;
msgTrnStream.Write(msg^, MsgLen) ;

se asigna a componente fdquery

FDQuery_msg.ParamByName('P_IdTrn').AsString  := entOrigen + fecha;
FDQuery_msg.ParamByName('P_MsgTrn').AsStream:= msgTrnStream;

Se observa la inserción en DB sqlsserver 2014

declare @p1 int
set @p1=8
exec sp_prepare @p1 output,N'@P1 varchar(8000),@P2 varchar(max)',N
'INSERT INTO MSGTRNSWB (  IdTrn,  MsgTrn  )  VALUES  (  @P1,  @P2  ) ',1
select @p1
go
exec sp_execute 8,'1520190513231936011','BCWS     127.0.0.1      ''  §€+ßIå@¹  <RequestWSDLBancor><DatosBasicos><TipoCanal>0</TipoCanal><TipoTransa>6</TipoTransa><TipoOperacion>0</TipoOperacion><DirIPOrigen></DirIPOrigen><DirIPServidor></DirIPServidor><PtoIPServidor>0</PtoIPServidor><Aplicacion>BCMonitor</Aplicacion><CodEntOrigen>15</CodEntOrigen><CodSedOrigen></CodSedOrigen><CodEstOrigen></CodEstOrigen><FecTranOrigen>2019-05-13</FecTranOrigen><HorTranOrigen></HorTranOrigen><SecOrigen>20190513231935985MONITOR</SecOrigen><SecReversion></SecReversion><CodUsuario>SYSTEM</CodUsuario><CodTransaccion>M01</CodTransaccion><CodCausal>15</CodCausal><CodSubCausal>003</CodSubCausal><TipKeyMaestro></TipKeyMaestro><KeyMaestroAso></KeyMaestroAso></DatosBasicos></RequestWSDLBancor>'
go

Se realiza select y se obtiene:

select distinct msgtrn from MSGTRNSWB where idtrn = '1520190513231936058' and LEN(msgtrn) >200
(result) BCWS

Se realiza la consulta mediante fquery

FDQuery1.Close;
FDQuery1.ParamByName('P_IDTRN').AsString := '1520190513232001996';
FDQuery1.Open();

varMensaje := FDQuery1.FieldByName('MSGTRN').AsString;

Se obtiene BCWS

Debería recuperar el mensaje original, parece que los caracteres especiales incluyen un "enter" o algo y al intentar recuperar la información de la base de datos ya solo recupero los caracteres que se encuentran antes de un caractér especial.



Related Questions



Converting from SQL Date to DateTime in Delphi XE

Updated November 02, 2017 03:26 AM


Using ADOQuery sum in Delphi

Updated September 30, 2018 23:26 PM

adoquery Execute multiple sql can't rollback

Updated December 19, 2017 06:26 AM