亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi7中存儲unicode的BUG

2019-11-18 18:00:49
字體:
來源:轉載
供稿:網友
 

Delphi7中存儲unicodeBUG?

近日,在用delphi7unicode的程序時發現了這樣一個問題,就是使用TADOCommand組件執行sql語句時,如果sql語句中有unicode字符,存儲在數據庫里會出現亂碼,使用TTntADOQuery也是一樣(使用參數方式不會出現亂碼,這里只討論純sql的方式)。但是TADOCommand本身是支持widestring的呀,CommandText屬性也是widestring類型的,為什么會出現這個問題呢?我試著改變TADOCommand的幾個屬性值,發現了一個怪現象,只要把ParamCheck屬性置為false就可以正常的存儲unicode字符,而置為true時就出現亂碼。為什么會出現這種情況?這個屬性看起來和unicode本身沒有任何關系,究竟是什么原因導致了亂碼的發生呢?我通過研究TADOCommand所在的adodb.pas文件,發現了問題的所在,我們看一下bug所在的過程:

PRocedure TADOCommand.AssignCommandText(const Value: WideString; Loading: Boolean);

  procedure InitParameters;

  var

    I: Integer;

    List: TParameters;

    NativeCommand: string;

  begin

    List := TParameters.Create(Self, TParameter);

    try

      NativeCommand := List.ParseSQL(Value, True);

      { Preserve existing values }

      List.AssignValues(Parameters);

      CommandObject.CommandText := NativeCommand;

      if not Loading and (Assigned(Connection) or (ConnectionString <> '')) then

      begin

        try

          SetConnectionFlag(cfParameters, True);

          try

            { Retrieve additional parameter info from the server if supported }

            Parameters.InternalRefresh;

            { Use additional parameter info from server to initialize our list }

            if Parameters.Count = List.Count then

              for I := 0 to List.Count - 1 do

              begin

                List[I].DataType := Parameters[I].DataType;

                List[I].Size := Parameters[I].Size;

                List[I].NumericScale := Parameters[I].NumericScale;

                List[I].Precision := Parameters[I].Precision;

                List[I].Direction := Parameters[I].Direction;

                List[I].Attributes := Parameters[I].Attributes;

              end

          finally

            SetConnectionFlag(cfParameters, False);

          end;

        except

          { Ignore error if server cannot provide parameter info }

        end;

        if List.Count > 0 then

          Parameters.Assign(List);

      end;

    finally

      List.Free;

    end;

  end;

begin

  if (CommandType = cmdText) and (Value <> '') and ParamCheck then

    InitParameters

  else

  begin

    CommandObject.CommandText := Value;

    if not Loading then Parameters.Clear;

  end;

end;

看看這一條語句:

if (CommandType = cmdText) and (Value <> '') and ParamCheck then

    InitParameters

也就是當ParamChecktrue時,會執行InitParameters過程,我們看看這個InitParameters過程中發生了什么:

首先它定義個一個變量:NativeCommand: string;,注意,是stirng不是widestring;我們接著往下看:

NativeCommand := List.ParseSQL(Value, True);

      { Preserve existing values }

      List.AssignValues(Parameters);

CommandObject.CommandText := NativeCommand;

在這里,Valuewidestring類型的,而List.ParseSQL返回的是string類型的,同時NativeCommand也是string類型的,就這樣,一個好好的widestring的變量被放到了string類型的變量當中,然后又把NativeCommand賦給了CommandObject.CommandText,因此導致了CommandObject.CommandText并沒有得到應該賦給它的widesting值,這也就最終導致了存儲unicode時亂碼的發生。

       解決方法也很簡單,(如果你不愿意修改delphi源程序的話)只需要把ParamCheck置為false就可以了(delphi默認把ParamCheck置為true)。



上一篇:DELPHI加注冊表自啟動的最簡單代碼

下一篇:Delphi數據庫應用程序中常見錯誤

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av不卡在线| 欧美激情欧美激情在线五月| 国产精品综合不卡av| 热99精品里视频精品| 欧美性黄网官网| 国产精品r级在线| 夜夜嗨av色综合久久久综合网| 色噜噜狠狠色综合网图区| 亚洲新声在线观看| 亚洲香蕉伊综合在人在线视看| 91国产在线精品| 狠狠色狠狠色综合日日小说| 欧美大人香蕉在线| 欧美大尺度激情区在线播放| 国产精品日日摸夜夜添夜夜av| 午夜精品久久久久久久99黑人| 日韩在线一区二区三区免费视频| 国产精品久久久久久久久久尿| 黑人巨大精品欧美一区免费视频| 亚洲激情电影中文字幕| 国产精品无码专区在线观看| 欧美成人精品一区| 97av在线视频| 国产精品都在这里| 欧美性高跟鞋xxxxhd| 日韩美女福利视频| 97精品视频在线观看| 亚洲天堂影视av| 亚洲精品国产成人| 在线日韩精品视频| 国产亚洲精品va在线观看| 精品福利在线观看| 亚洲精品av在线| 久久久久久69| 精品国偷自产在线| 国产亚洲精品91在线| 国产精品白丝jk喷水视频一区| 亚洲国产精品成人一区二区| 亚洲视频网站在线观看| 欧美www视频在线观看| 深夜福利日韩在线看| 亚洲欧美一区二区三区久久| 欧美日韩国产91| 久久成人精品一区二区三区| 欧美日韩国产在线| 国产精品一区专区欧美日韩| 亚洲成av人片在线观看香蕉| 欧美另类在线播放| 亚洲一区二区三区成人在线视频精品| 久国内精品在线| 欧美性猛交xxxx乱大交蜜桃| 欧美肥老妇视频| 欧美日产国产成人免费图片| 国产午夜精品全部视频播放| 91精品国产乱码久久久久久久久| 亚洲图中文字幕| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲精品久久久久久久久久久久| 亚洲国产高清高潮精品美女| 精品视频在线播放色网色视频| 91亚洲精品久久久久久久久久久久| 超碰日本道色综合久久综合| 欧美激情视频网| 91精品国产777在线观看| 日韩电影免费在线观看中文字幕| 日韩视频免费中文字幕| 国产在线视频一区| 在线a欧美视频| 国产精品网站视频| 国产精品久久不能| 中文字幕av一区中文字幕天堂| 亚洲一区精品电影| 久久这里有精品视频| 欧美日韩亚洲国产一区| 综合网中文字幕| 欧美精品久久久久久久| 亚洲国产黄色片| 日韩欧美一区视频| 久久精品人人做人人爽| 91av视频在线播放| 在线视频日本亚洲性| 欧美色图在线视频| 亚洲级视频在线观看免费1级| 国产视频在线观看一区二区| 欧美电影在线免费观看网站| 欧美日韩亚洲一区二| 国产视频精品xxxx| 亚洲自拍偷拍色图| 91色p视频在线| 久久精品国产一区二区电影| 亚洲精品视频免费| 亚洲aaaaaa| 欧美激情综合亚洲一二区| 久久久亚洲天堂| 国产精自产拍久久久久久| 国产精品久久精品| 97**国产露脸精品国产| 国产精品日韩欧美综合| 永久免费看mv网站入口亚洲| 欧洲成人在线视频| 国产精品网红福利| 久久久人成影片一区二区三区| 91高清视频在线免费观看| 欧美日韩成人免费| 久久精品电影网| 精品中文字幕在线2019| 国产精品69精品一区二区三区| xvideos亚洲| 国产亚洲精品一区二555| 日韩中文字幕精品| 国产suv精品一区二区三区88区| 国产综合久久久久| 色偷偷噜噜噜亚洲男人的天堂| 欧美性受xxxx黑人猛交| 日本精品免费观看| 国产日韩在线一区| 亚洲综合成人婷婷小说| 国产亚洲精品va在线观看| 欧洲亚洲女同hd| 亚洲精品小视频在线观看| 国色天香2019中文字幕在线观看| 91欧美精品午夜性色福利在线| 操人视频在线观看欧美| 亚洲精品狠狠操| 成人精品一区二区三区电影黑人| 欧美激情精品久久久久久久变态| 亚洲电影免费在线观看| 日韩欧美中文第一页| 亚洲精品一区中文| 亚洲aⅴ日韩av电影在线观看| 国产欧美日韩丝袜精品一区| 亚洲精品综合久久中文字幕| 亚洲韩国欧洲国产日产av| 日韩av成人在线观看| 中文字幕在线日韩| 日韩av电影在线网| 超薄丝袜一区二区| 亚洲视频在线播放| 亚洲国产精品va| 日本一欧美一欧美一亚洲视频| 亚洲精品第一国产综合精品| 国产精品成人va在线观看| 久久69精品久久久久久国产越南| 精品国产区一区二区三区在线观看| 国产精品久久久久久久久久小说| 欧美色道久久88综合亚洲精品| 欧美做爰性生交视频| 国产精品久久久一区| 亚洲欧美在线一区| 欧美成人午夜激情| 国产成人精品免费视频| 国产成人精彩在线视频九色| 69久久夜色精品国产7777| 亚洲新声在线观看| 欧美国产第一页| 欧美日韩国产一区二区| 一区二区三区视频在线| 欧美大胆在线视频| 久久久久五月天| 日韩欧美在线视频| 国产成人自拍视频在线观看| 欧美寡妇偷汉性猛交| 国产一区二区成人| 国产日韩av在线|