線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1743
推到 Plurk!
推到 Facebook!

如何把資料裡的單括號替換掉?

答題得分者是:懷舊的人
binbinalia
一般會員


發表:14
回覆:23
積分:7
註冊:2003-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-11 15:31:43 IP:61.221.xxx.xxx 未訂閱
請教各位大大: 我的建立程式裡有一個備註欄位, 輸入元件用TMemo,資料庫型態是Text, 使用者輸入完我會用TQuery執行update語法把這個備註update到另一個table去. 在run時發現,如果資料裡有單括號(如: it's a good day), 就會update失敗. 我要如何才能在update前先把單括號替換成雙括號呢?
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-11 15:49:18 IP:210.65.xxx.xxx 未訂閱
Hi binbinalia,    使用 StringReplace Function(uses SysUtils)
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  Memo2.Lines.Clear;
  for i := 0 to Memo1.Lines.Count - 1 do
    begin
      Memo2.Lines.Add(StringReplace(Memo1.Lines.Strings[i],Chr(39),'"',[rfReplaceAll]));
    end;
end;
發表人 -
------
Fishman
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-11 16:42:57 IP:211.78.xxx.xxx 未訂閱
  Memo1.Text := StringReplace(Memo1.Text,Chr(39),'"',[rfReplaceAll]);
對於 TMEMO 欄位要 UPDATE 建議你最好改為使用參數的方式,也許就不用轉換了,例如
  UPDATE USETABLE
  SET MEMOFIELD = :A
  WHERE
     ......
  BDE : ParamByName('A').AsString := Memo1.Text;
  ADO:  Parameter.ParamByName('A').DataType := ftBLOB; (or ftMEMO)
        Parameter.ParamByName('A').Value := Memo1.Text;      UPDATE USETABLE
  SET MEMOFIELD = Memo1.Text (如果要直接將Memo1.Text給 MemoField 大部份的資料庫都會有長度限制)
  WHERE
     ......    
發表人 - 懷舊的人 於 2005/07/11 16:48:50
binbinalia
一般會員


發表:14
回覆:23
積分:7
註冊:2003-11-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-12 15:30:41 IP:61.221.xxx.xxx 未訂閱
關於懷舊大大提到用參數的方式, 我也覺得很奇怪, 之前是用參數接memo的資料, 結果超過255字時update過去會變亂碼. 我是用BDE連的(TQuery元件), 不知大大們有遇到過這種情況嗎?
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-12 17:42:09 IP:211.78.xxx.xxx 未訂閱
1. 如果妳用的是 TRichEdit 而 Property PlainText 設為 False 就有可能是 亂碼。 2. 可以請教用的資料庫是哪一種?
binbinalia
一般會員


發表:14
回覆:23
積分:7
註冊:2003-11-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-12 19:16:36 IP:61.221.xxx.xxx 未訂閱
to 懷舊大大: 資料先由一支建立作業(用TDBMemo元件)把資料存起來後, 再由一支中繼程式把資料讀出來,(到這裡還正常) 用update param的方式把資料copy到另一個table. 就是在這一段變成亂碼的. 資料格式是Text, 資料庫是SQL Server 2000.
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-13 13:06:56 IP:211.78.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
begin
  with QQ do begin
       Close;
       SQL.Clear;
       SQL.Add('UPDATE OTHERTABLE');
       SQL.Add('SET MEMOFIELD = :A');
       SQL.Add('WHERE');
       SQL.Add('  KEY1 = :P1');
       SQL.Add('AND');
       SQL.Add('  KEY2 = :P2');
       ParamByName('A').AsMemo := Query1.FieldByName('MEMOFIELD').AsString;
       ParamByName('P1').AsString := Query1.FieldByName('KEY1').AsString;
       ParamByName('P2').AsString := Query1.FieldByName('KEY2').AsString;
       try
         ExecSQL;
       except
         ShowMessage(SQL.Text);
       end;
  end;
end;
1. BDE 的 BLOBSIZE 預設只有 32K 如果 MEMOFILED 有超過 32 K 通常會有問題 , 建議改為 1024或改用 ADO
binbinalia
一般會員


發表:14
回覆:23
積分:7
註冊:2003-11-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-13 13:40:45 IP:61.221.xxx.xxx 未訂閱
感謝各位前輩幫忙. 照前輩的方法問題有獲得解決, 原來是ParamByName要用AsMemo的地方寫成AsString,所以變成亂碼. 也有聽說BDE在處理Text有問題,因為尚未遇到所以還在測試中. 再次感謝,感溫~
系統時間:2024-04-26 8:19:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!