全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1452
推到 Plurk!
推到 Facebook!

如何存取 TBlob Field 而不會改變內容..

尚未結案
LPH
一般會員


發表:53
回覆:43
積分:19
註冊:2003-04-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-27 09:44:06 IP:218.162.xxx.xxx 未訂閱
我有一個 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-28 14:28:11 IP:61.30.xxx.xxx 未訂閱
一般處理 Blob 的資料都會使用 TStream 物件或指標, 除非非常確定 Blob 內容全是一般文字(中英文,數字..), 因為 ASCII 中除了可是字元尚包含不可視的控制或表格字元。 如果這個答案有不妥的,希望各位前輩不吝賜教。 
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-28 16:25:50 IP:218.187.xxx.xxx 未訂閱
引言: 我有一個 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 都一樣... 請問有人知道如何解決嗎....
請問你是用 TQuery or TTable 這類的元件嗎 ? 我記得用 AsString (AsBlob 沒用過), 好像會重新編碼過(不知道是不是 BDE 編碼設定的關係), 而且會切成 255 (還是 256) byte, 後面部份會忽略掉. 如同 ha0009 兄所言 Blob Field 都是透過 TStream 來處理的.
------
將問題盡快結案也是一種禮貌!
LPH
一般會員


發表:53
回覆:43
積分:19
註冊:2003-04-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-28 17:03:57 IP:218.162.xxx.xxx 未訂閱
引言:
引言: 我有一個 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 都一樣... 請問有人知道如何解決嗎....
請問你是用 TQuery or TTable 這類的元件嗎 ? 我記得用 AsString (AsBlob 沒用過), 好像會重新編碼過(不知道是不是 BDE 編碼設定的關係), 而且會切成 255 (還是 256) byte, 後面部份會忽略掉. 如同 ha0009 兄所言 Blob Field 都是透過 TStream 來處理的.
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-30 17:04:11 IP:218.1.xxx.xxx 未訂閱
这跟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
------
江上何人初见月,江月何年初照人
系統時間:2024-05-18 15:29:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!