亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rowdata.pas

?? 仿sql查詢分析器
?? PAS
字號:
// TRowDataList:
//  存放Recordset的數據.
unit RowData;

interface
uses Classes, SysUtils, ADOInt, Variants;

type
  PRowData = ^TRowData;
  TRowData = array[0..0] of string;

  TRowDataList = class
  private
    FData: TList;
    FFieldCount: Integer;
    FFieldNames: array of string;

    procedure Clear;
    procedure FreeRowData(P: PRowData);
    function AllocRowData: PRowData;
    function GetFieldName(Index: Integer): string;
    function ImportByBinding(Rst: _Recordset; var Canceled: Boolean): Boolean;
    function ImportByNormal(Rst: _Recordset; var Canceled: Boolean): Boolean;
  public
    constructor Create;
    destructor Destroy; override;

    // 字段個數
    property FieldCount: Integer read FFieldCount;
    // 字段名稱
    property FieldName[Index: Integer]: string read GetFieldName;
    // 數據.
    property Data: TList read FData;
    // 導出數據.
    // Rst: ADO Recordset對象
    // Canceled: 取消標志. 傳入時為FALSE, 函數在導入每一行數據后, 檢測此變量,
    // 如果Canceled為TRUE, 則取消導入. (可以在另一線程更改此變量).
    // 返回: TRUE 成功導入; FALSE 導入時Canceled變量設為TURE
    function ImportRecordset(Rst: _Recordset; var Canceled: Boolean): Boolean;
  end;

implementation

uses ADOBinding, Pub;

{ TRowDataList }

function TRowDataList.AllocRowData: PRowData;
begin
  Result := AllocMem(FFieldCount * SizeOf(Pointer));
end;

procedure TRowDataList.Clear;
var
  I: Integer;
  P: PRowData;
begin
  for I := 0 to FData.Count-1 do
  begin
    P := FData[I];
    FreeRowData(P);
    FreeMem(P);
  end;
end;

constructor TRowDataList.Create;
begin
  FData := TList.Create;
end;

destructor TRowDataList.Destroy;
begin
  Clear;
  FData.Free;
  inherited;
end;

procedure TRowDataList.FreeRowData(P: PRowData);
var
  I: Integer;
begin
  for I := 0 to FFieldCount - 1 do
    P[I] := '';
end;

function TRowDataList.GetFieldName(Index: Integer): string;
begin
  if (Index < 0) or (Index >= FFieldCount) then
    raise Exception.Create('Index out of bound.');

  Result := FFieldNames[Index];
end;

function TRowDataList.ImportByBinding(Rst: _Recordset;
  var Canceled: Boolean): Boolean;
var
  Binding: TADOBinding;
  I: Integer;
  Fld: Field;
  FieldData: PColumnRawData;
  P: PRowData;
  s: string;
  FldTypes: array of Integer;

M,N: Integer;

  function IsCanceled: Boolean;
  begin
    Result := Canceled;
  end;
begin
  Result := True;
  Binding := TADOBinding.Create;
  try
    SetLength(FldTypes, FFieldCount);
    // set bindings
    for I := 0 to FFieldCount - 1 do
    begin
      Fld := Rst.Fields[I];
      FldTypes[I] := Fld.Type_;
      // 一律轉化為string, 讓OLE DB內部去搞吧.
      case Fld.Type_ of
        adLongVarChar,
        adLongVarWChar,
        adLongVarBinary,
        adBinary,
        adVarBinary,
        adBSTR,
        adChar,
        adVarChar,
        adWChar,
        adVarWChar:
          Binding.AddBinding(I + 1, adVarChar, 256 + 1, False);

//        adBSTR,
//        adChar,
//        adVarChar:
//          Binding.AddBinding(I + 1, adVarChar, Fld.DefinedSize + 1, False);
//
//        adWChar,
//        adVarWChar:
//          Binding.AddBinding(I + 1, adVarChar, Fld.DefinedSize + 1, False);

      else
        Binding.AddBinding(I + 1, adVarChar, 50 + 1, False);
      end;
    end;

    (Rst as IADORecordBinding).BindToRecordset(Binding.GetADOBindingData);

    M := 0;
    while not Rst.EOF do
    begin
      P := AllocRowData;
      N := 0;
      for I := 0 to FFieldCount - 1 do
      begin
        FieldData := Binding.AsRawData[I];
        if not (FieldData.Status in
              [adFldOK, adFldNull, adFldTruncated, adFldDefault]) then
        begin
          // 假如出錯, 應該是OLE DB不能處理的一些數據轉換.
          raise Exception.Create('ADO.ISqlW: get field data error.');
        end;

        if FieldData.Status = adFldNull then
          P[I] := 'NULL'
        else
        begin
          try

          case FldTypes[I] of
            adLongVarChar,
            adLongVarWChar,
            adLongVarBinary,
            adBinary,
            adVarBinary,
            adBSTR,
            adChar,
            adVarChar,
            adWChar,
            adVarWChar:
              if FieldData.DataLength > 256 then
                FieldData.DataLength := 256;
          else
            if FieldData.DataLength > 50 then
              FieldData.DataLength := 50;
          end;

          SetString(s, PChar(@FieldData.RawData), FieldData.DataLength);
          if (FldTypes[I] = adLongVarBinary) or
            (FldTypes[I] = adVarBinary) or (FldTypes[I] = adBinary)
          then s := '0x' + s;

          P[I] := s;

          except  // 好像還有問題, 姑且留著
            s := Format('Row:%d, Field:%d, Len: %d, Stat: %d', [M, N, FieldData.DataLength, FieldData.Status]);
            raise Exception.Create(s); 
          end;
        end;
        Inc(N);
      end;

      FData.Add(P);

      if IsCanceled then
      begin
        Result := False;
        Exit;
      end;

      Rst.MoveNext;
      Inc(M);
    end;
  finally
    (Rst as IADORecordBinding).BindToRecordset(nil);
    Binding.Free;
  end;
end;

function TRowDataList.ImportByNormal(Rst: _Recordset;
  var Canceled: Boolean): Boolean;
var
  I: Integer;
  P: PRowData;
  V: OleVariant;

  function IsCanceled: Boolean;
  begin
    Result := Canceled;
  end;
begin
  Result := True;
  while not Rst.EOF do
  begin
    P := AllocRowData;
    for I := 0 to FFieldCount - 1 do
    begin
      V := Rst.Fields[I].Value;
      if VarIsNull(V) then
        P[I] := 'NULL'
      else if VarIsArray(V) then
        P[I] := '(Blob)'
      else
        P[I] := String(V);
    end;

    FData.Add(P);

    if IsCanceled then
    begin
      Result := False;
      Exit;
    end;

    Rst.MoveNext;
  end;
end;

function TRowDataList.ImportRecordset(Rst: _Recordset; var Canceled: Boolean): Boolean;
var
  I: Integer;
  Ver: Double;

  function IsCanceled: Boolean;
  begin
    Result := Canceled;
  end;

begin
  Result := True;

  // 清除舊的數據.
  Clear;

  if (Rst <> nil) and ((Rst.State and adStateOpen) = adStateOpen) then
  begin
    // 創建新的
    FFieldCount := Rst.Fields.Count;
    SetLength(FFieldNames, FFieldCount);
    for I := 0 to Rst.Fields.Count-1 do
      FFieldNames[I] := Rst.Fields[I].Name;

    if Rst.Supports(adMovePrevious) then Rst.MoveFirst;

    Ver := StrToFloat(Pub.ADOVer);
    if Ver >= 2.0 then // 用ADO Binding效率會高一些.
      Result := ImportByBinding(Rst, Canceled)
    else
      Result := ImportByNormal(Rst, Canceled);
  end;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美剧情片在线观看| 玉足女爽爽91| 一区二区三区电影在线播| 美洲天堂一区二卡三卡四卡视频 | 欧美电影免费提供在线观看| 中国色在线观看另类| 老司机精品视频在线| 久久综合精品国产一区二区三区| 一区二区在线看| 懂色av一区二区三区免费观看| 欧美一区午夜精品| 午夜精品久久久久久久久| 99这里只有久久精品视频| 久久久.com| 国内外精品视频| 日韩精品中文字幕在线一区| 亚洲午夜一区二区| 在线欧美日韩国产| 亚洲精品中文字幕乱码三区| 国产 日韩 欧美大片| 国产调教视频一区| 国产乱色国产精品免费视频| 精品国产91乱码一区二区三区 | 欧美乱妇20p| 亚洲五月六月丁香激情| 一本大道av伊人久久综合| 国产精品久久777777| 成人黄色大片在线观看| 欧美国产综合一区二区| 国产成人免费视频| 美女精品自拍一二三四| 日韩一区二区高清| 久久99热狠狠色一区二区| 欧美成人精精品一区二区频| 奇米精品一区二区三区四区| 日韩一区二区三区视频| 韩国成人福利片在线播放| 国产亚洲一区二区三区四区 | 在线观看中文字幕不卡| 一区二区三区在线观看国产| 日本韩国一区二区三区视频| 亚洲一区二区五区| 51精品视频一区二区三区| 日韩av成人高清| 欧美变态tickle挠乳网站| 精品影视av免费| 国产欧美日本一区视频| 91免费视频观看| 亚洲综合免费观看高清完整版| 精品视频在线看| 另类小说视频一区二区| 国产日韩欧美不卡在线| 色噜噜久久综合| 日本在线播放一区二区三区| 亚洲精品一线二线三线| 成人精品一区二区三区中文字幕| 尤物在线观看一区| 欧美一区二区三区人| 国产精品亚洲第一区在线暖暖韩国 | 亚洲色图清纯唯美| 91精品久久久久久久91蜜桃 | 一本一本大道香蕉久在线精品 | 久久久久久**毛片大全| 99精品黄色片免费大全| 天天影视网天天综合色在线播放| 日韩成人dvd| 国产三级精品三级在线专区| 91视频国产观看| 久久se精品一区精品二区| 亚洲美女一区二区三区| 日韩视频在线永久播放| 91亚洲午夜精品久久久久久| 日韩av中文字幕一区二区三区| 国产欧美日韩在线视频| 欧美日韩一区二区三区视频| 国产伦精品一区二区三区免费 | 久久精品夜色噜噜亚洲a∨| 日本丰满少妇一区二区三区| 另类综合日韩欧美亚洲| 亚洲在线免费播放| 国产精品久久久久9999吃药| 欧美一区二区三区精品| 91福利视频在线| 成人精品在线视频观看| 黄色日韩网站视频| 日韩综合在线视频| 一片黄亚洲嫩模| 国产精品污www在线观看| 26uuu精品一区二区| 777亚洲妇女| 欧美午夜一区二区| 97se亚洲国产综合自在线| 激情欧美一区二区三区在线观看| 亚洲午夜羞羞片| 亚洲免费观看高清完整| 中文字幕日本乱码精品影院| 久久综合九色综合97_久久久| 亚洲免费大片在线观看| 国产女同互慰高潮91漫画| 欧美成人性战久久| 日韩三级视频在线看| 91精品欧美一区二区三区综合在 | 欧美电影免费观看高清完整版在线 | 亚洲成a人v欧美综合天堂下载| 国产精品麻豆99久久久久久| 精品免费视频一区二区| 日韩三级在线观看| 精品日韩在线一区| 日韩午夜激情视频| 精品国产免费人成在线观看| 日韩欧美高清在线| 日韩免费观看高清完整版在线观看| 欧美性生活久久| 欧美日韩国产美| 欧美一区二区三区思思人| 日韩欧美一区二区视频| 91精品国产全国免费观看| 欧美一区二区久久| 日韩精品一区二| 久久午夜羞羞影院免费观看| 国产亚洲人成网站| 欧美国产一区在线| 亚洲欧美日韩在线播放| **性色生活片久久毛片| 亚洲色欲色欲www| 性欧美大战久久久久久久久| 日韩avvvv在线播放| 极品瑜伽女神91| 国产成人在线看| 99re这里只有精品首页| 欧美日韩在线直播| 欧美一区二区黄色| 国产亚洲视频系列| 亚洲视频在线一区| 日本欧美在线观看| 国产裸体歌舞团一区二区| 大美女一区二区三区| 色综合天天综合| 欧美一区二区三区免费大片 | 亚洲一区二区欧美激情| 日本免费新一区视频| 国产老女人精品毛片久久| av在线不卡观看免费观看| 欧美午夜精品久久久久久孕妇| 91麻豆精品久久久久蜜臀| 久久久亚洲精品一区二区三区| 中文字幕在线免费不卡| 日韩在线卡一卡二| 成人小视频免费观看| 欧美日韩二区三区| 日本一区二区成人| 日韩av一区二| 99精品视频在线观看| 欧美一区二区三级| 亚洲日本在线观看| 国产一区二区精品久久| 日本高清视频一区二区| 久久久噜噜噜久噜久久综合| 夜夜夜精品看看| 国产成人免费视频一区| 7777精品伊人久久久大香线蕉最新版| 欧美激情综合网| 日本视频在线一区| 91国偷自产一区二区三区成为亚洲经典| 国产精品99久久久久久有的能看 | 国产精品欧美久久久久一区二区| 亚洲午夜激情网站| 成人免费视频caoporn| 精品久久人人做人人爰| 樱花草国产18久久久久| 粉嫩av一区二区三区粉嫩 | 精品视频在线视频| 亚洲欧美一区二区视频| 国产精品综合网| 欧美高清视频www夜色资源网| 亚洲欧洲美洲综合色网| 国产麻豆日韩欧美久久| 欧美一级精品大片| 亚洲国产三级在线| 日本精品视频一区二区三区| 中文字幕亚洲一区二区av在线| 久久国产人妖系列| 欧美久久久一区| 亚洲成人在线免费| 色呦呦国产精品| 中文字幕亚洲在| av中文字幕不卡| 国产精品毛片久久久久久| 国产九色精品成人porny| 精品久久人人做人人爽| 日本不卡在线视频| 51精品秘密在线观看| 丝袜亚洲另类欧美| 欧美精品自拍偷拍| 日韩精品亚洲专区| 欧美一区二区三区免费| 青青青伊人色综合久久| 日韩免费成人网| 精品一区二区成人精品| 久久婷婷成人综合色|