如何存取 TBlob Field 而不會改變內容.. |
尚未結案
|
LPH
一般會員 發表:53 回覆:43 積分:19 註冊:2003-04-02 發送簡訊給我 |
我有一個 256 Bytes 的 Blob 欄位存入任意 0~255 char 要存滿256 Bytes
Type TBlobData = String; var buffer : Pchar; liststr: string; i : integer; schr : string; begin .. .. ParamByName('mBlobField').AsBlob := Buffer; .. .. end;資料存入沒有問題..可是資料取出時為什麼有些 Char 會被轉掉...如.. liststr := fieldByname('mblobfield').asstring; for i := 1 to 256 do schr := Format('%X', [Ord(liststr[i])]); schr 的值會和存入時相同可是 liststr 卻出現 ? 這個字符 Hex 3F... 我不管是用 Stream, TblobStream 都一樣... 請問有人知道如何解決嗎.... |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
引言: 我有一個 256 Bytes 的 Blob 欄位存入任意 0~255 char 要存滿256 Bytes請問你是用 TQuery or TTable 這類的元件嗎 ? 我記得用 AsString (AsBlob 沒用過), 好像會重新編碼過(不知道是不是 BDE 編碼設定的關係), 而且會切成 255 (還是 256) byte, 後面部份會忽略掉. 如同 ha0009 兄所言 Blob Field 都是透過 TStream 來處理的.Type TBlobData = String; var buffer : Pchar; liststr: string; i : integer; schr : string; begin .. .. ParamByName('mBlobField').AsBlob := Buffer; .. .. end;資料存入沒有問題..可是資料取出時為什麼有些 Char 會被轉掉...如.. liststr := fieldByname('mblobfield').asstring; for i := 1 to 256 do schr := Format('%X', [Ord(liststr[i])]); schr 的值會和存入時相同可是 liststr 卻出現 ? 這個字符 Hex 3F... 我不管是用 Stream, TblobStream 都一樣... 請問有人知道如何解決嗎....
------
將問題盡快結案也是一種禮貌! |
LPH
一般會員 發表:53 回覆:43 積分:19 註冊:2003-04-02 發送簡訊給我 |
引言:引言: 我有一個 256 Bytes 的 Blob 欄位存入任意 0~255 char 要存滿256 Bytes請問你是用 TQuery or TTable 這類的元件嗎 ? 我記得用 AsString (AsBlob 沒用過), 好像會重新編碼過(不知道是不是 BDE 編碼設定的關係), 而且會切成 255 (還是 256) byte, 後面部份會忽略掉. 如同 ha0009 兄所言 Blob Field 都是透過 TStream 來處理的.Type TBlobData = String; var buffer : Pchar; liststr: string; i : integer; schr : string; begin .. .. ParamByName('mBlobField').AsBlob := Buffer; .. .. end;資料存入沒有問題..可是資料取出時為什麼有些 Char 會被轉掉...如.. liststr := fieldByname('mblobfield').asstring; for i := 1 to 256 do schr := Format('%X', [Ord(liststr[i])]); schr 的值會和存入時相同可是 liststr 卻出現 ? 這個字符 Hex 3F... 我不管是用 Stream, TblobStream 都一樣... 請問有人知道如何解決嗎.... procedure TmXMLFORM.CreatXMLBtnClick(Sender: TObject); var Buffer : Pchar; MemSize: Integer; Stream : TBlobStream; mydoc : IDOMDocument; myrecs : IDOMNode; myrec : IDOMNode; mymsh : IDOMNode; mychild:IDOMNode; mymb : IDOMNode; mymb1 : IDOMNode; I : Integer; R : Integer; X : Integer; tempfile : string; ttime : String; skey : string; TI : Integer; begin XMLDocument1.Active := False; XMLDocument1.XML.Text := ''; XMLDocument1.Active := True; XMLDocument1.Version := '1.0'; XMLDocument1.Encoding := 'Big5'; mydoc := XMLDocument1.DOMDocument; myrecs := mydoc.appendChild(mydoc.createElement('Mtest')); for R := 1 to Txmltab.RecordCount do begin myrec := myrecs.appendChild(mydoc.createElement('Mtesta')); mymsh := myrec.appendChild(mydoc.createElement('Mtestb')); for I := 0 to 2 do begin mychild := mymsh.appendChild(mydoc.createElement(Txmltab.Fields[I].FieldName)); mychild.appendChild(mydoc.createTextNode(Txmltab.fields[I].AsString)); end; mymb := myrec.appendChild(mydoc.createElement('MTestc')); mymb1 := mymb.appendChild(mydoc.createElement('Mtestd')); for I := 3 to Txmltab.FieldCount - 1 do begin if Txmltab.Fields[I].AsString <> '' then begin if I = 14 then // Field[14] Is A Binary Field begin Stream := TBlobStream.Create(Txmltab.FieldByName('A22') as TBlobField, bmRead); try MemSize := 256; Inc(MemSize); Buffer := allocMem(MemSize); try Stream.Read(Buffer^, MemSize); mychild := mymb1.appendChild(mydoc.createElement(Txmltab.Fields[I].FieldName)); skey := ''; //====== Test Source Hex Code for ti := 0 to 255 do begin skey := skey Format('%X', [Ord(Buffer[ti])]); end; showmessage(buffer); showmessage(inttostr(length(Buffer))); showmessage(Skey); //==== 和原先存入的16進位碼一樣 skey := ''; mychild.appendChild(mydoc.createTextNode(Buffer)); //== CreatTextNode(Buffer) 存入的長度和編碼錯誤 finally FreeMem(Buffer, MemSize); end; finally Stream.Free; end; end else begin mychild := mymb1.appendChild(mydoc.createElement(Txmltab.Fields[I].FieldName)); mychild.appendChild(mydoc.createTextNode(Txmltab.Fields[I].Value)); end; end; end; OpdDm.Txmltab.Next; end; ttime := timetostr(time); ttime := copy(ttime,6,2) copy(ttime,9,2) copy(ttime,12,2); tempfile := 'C:\MyXML\' TrDate.Text ttime '.xml'; XMLDocument1.SaveToFile(tempfile); OpenDialog1.FileName := tempfile; AssignFile(xmlfile, opendialog1.FileName); reset(xmlfile); xmlsize := FileSize(xmlfile); UFileName.Text := tempfile; UFileSize.Text := IntToStr(xmlsize); R := Txmltab.RecordCount; UFileRecCount.Text := Inttostr(R); end;Buffer 裡面的長度確實是256 為什麼存入Xml file 之後卻不足.... 請指教.. 謝謝... |
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
这跟PChar与String有关,PChar是以第一个#0作为结束,而CreateTextNode是Widestring参数,因此,如果你的资料里有#0,实际写入的可能要小,你试试
用string代替buffer:
var s:string; ....... SetLength(s,Stream.Size); Stream.Read(s[1],Stream.Size); mychild.appendChild(mydoc.createTextNode(s));發表人 - mustapha.wang 於 2003/05/30 17:06:16
------
江上何人初见月,江月何年初照人 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |