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

如何將一連串控制宇元或不可見字元存到SQL Server的CHAR欄位

尚未結案
marlon_wu
一般會員


發表:5
回覆:6
積分:2
註冊:2002-09-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-26 16:39:47 IP:203.204.xxx.xxx 未訂閱
我想將50個Byte值以Chr(Byte)存到SQL Server的CHAR(50)欄位中, 讀出後可以將CHAR(50)還原成正確的50個Byte值, 直接讓 DataSet.Fields[].AsString:=這50個字元, 透過BDE的存檔後會產生不可預期的錯誤, 如50個字元都是Chr(136)時, 存到SQL Server時只剩25個字元, 有時會產生 ' 字元造成SQL語法錯誤, 要如何做才能正確的將字元集存檔?
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-26 18:49:08 IP:211.20.xxx.xxx 未訂閱
引言: 我想將50個Byte值以Chr(Byte)存到SQL Server的CHAR(50)欄位中, 讀出後可以將CHAR(50)還原成正確的50個Byte值, 直接讓 DataSet.Fields[].AsString:=這50個字元, 透過BDE的存檔後會產生不可預期的錯誤, 如50個字元都是Chr(136)時, 存到SQL Server時只剩25個字元, 有時會產生 ' 字元造成SQL語法錯誤, 要如何做才能正確的將字元集存檔?
marlon_wu 你好
  一般遇到這種情形,解決的方法,我都是用ParamByName的方式如下
  // 產生要存入的資料變數
  vField := '' ;
  For i:=1 To 50 Do Begin
    vField := vField+#136 ;
  End;
  With Query1 Do Begin
    Close;
    SQL.Text := 'Update TableName Set Field1=:vField1 Wher ....' ;
    ParamByName('vField1').AsString := vField;
    ExecSQL;  // 寫入資料庫
  End;
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-26 22:13:16 IP:218.32.xxx.xxx 未訂閱
marlon_wu 你好: 既然是不可見字元, 資料庫為何要用 CHAR DataType ? 用 Binary(50) 不是比較恰當 ?
marlon_wu
一般會員


發表:5
回覆:6
積分:2
註冊:2002-09-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-30 10:32:28 IP:203.204.xxx.xxx 未訂閱
Thank you! But it doesn't work. My trial: procedure TForm1.Button4Click(Sender: TObject); var i: integer; s: string; begin s:=''; for i:=1 to 50 do s:=s Chr(136); With qSave do begin Close; ParamByName('pvstr').AsString := s; ParamByName('role_id').AsString:= Query1.FieldByName('role_id').AsString; ExecSQL; end; end; procedure TForm1.Button5Click(Sender: TObject); var i: integer; s: string; begin s:=''; for i:= 1 to Length(Query1.FieldByName('privileged').AsString) do s:=s IntToStr(Ord(Query1.FieldByName('privileged').AsString[i])); Edit1.Text:=s; end; Edit1.Text=63..63(25 Sets) i.e. Text=#63..#63 (Length=25) SQL Monitor: SQL Prepare: MSSQL - UPDATE role SET privileged=:1 WHERE role_id = :2 SQL Data In: MSSQL - Param = 1, Name = , Type = fldZSTRING, Precision = 50, Scale = 0, Data = ????????????????????????? << Data = ? x 25 >>
marlon_wu
一般會員


發表:5
回覆:6
積分:2
註冊:2002-09-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-30 10:54:18 IP:203.204.xxx.xxx 未訂閱
>> 用 Binary(50) 不是比較恰當 ? Yes! Thank you! procedure TForm1.Button1Click(Sender: TObject); var i: integer; v: Variant; begin V := VarArrayCreate([0, 49], VarByte); for i:=0 to 49 do v[i]:=136; Query1.FieldByName('privileged').AsVariant:=v; end;
系統時間:2024-11-22 4:22:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!