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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sqlqry.pas

?? 仿sql查詢分析器
?? PAS
?? 第 1 頁 / 共 3 頁
字號:

      if (SSErrInfo.lNative = 0) or (SSErrInfo.lNative = 5701) then
      begin // 應(yīng)該是PRINT 返回的消息, 或更改數(shù)據(jù)庫信息
        if SSErrInfo.lNative = 0 then
          ErrMsg := String(SSErrInfo.pwszMessage)
        else
          ErrMsg := '';
        InfoMsg := True;
      end
      else
      begin
        ErrMsg := Format('服務(wù)器: 消息 %d, 級別 %d, 狀態(tài) %d',
                      [SSErrInfo.lNative, SSErrInfo.bClass, SSErrInfo.bState]);
        ProcName := String(SSErrInfo.pwszProcedure);
        if ProcName <> '' then
          ErrMsg := ErrMsg + Format(', 過程 %s', [ProcName]);
        ErrMsg := ErrMsg + Format(', 行 %d', [SSErrInfo.wLineNumber]);
        ErrMsg := ErrMsg + #13#10 + String(SSErrInfo.pwszMessage);

        // 11 可能是連接中斷問題, 但未見正式的文檔說明.
        if SSErrInfo.lNative = 11 then ConnClosed := True;
      end;

      Result := True;
      ActiveX.CoTaskMemFree(SSErrInfo);
      ActiveX.CoTaskMemFree(pStrBuf);
    end;
  end;

  function GetErrInfo(ErrInfo: IErrorInfo): string;
  var
    Msg: WideString;
  begin
    if ErrInfo.GetDescription(Msg) = S_OK then
      Result := Format('%s', [string(Msg)])
    else
      Result := '';
  end;
begin
  InfoMsg := False;
  ConnClosed := False;
  Result := 0;

  GetErrorInfo(0, OleErr);
  if OleErr <> nil then
  begin
    if Supports(OleErr, IErrorRecords, ErrRecords) then
    begin
      hr := ErrRecords.GetRecordCount(RecCnt);
      if hr <> S_OK then Exit;

      for I := 0 to RecCnt - 1 do
      begin
        if ErrRecords.GetCustomErrorObject(I, ISQLServerErrorInfo, IUnknown(SSqlErr)) = S_OK then
        begin
          if SSqlErr = nil then Continue;
          if not GetSSqlErrInfo(SSqlErr, ErrorMsg) then
          begin
            ErrorMsg := GetErrInfo(OleErr);
          end;
        end
        else
        begin
          ErrorMsg := GetErrInfo(OleErr);
        end;
      end;
    end
    else
    begin
      ErrorMsg := GetErrInfo(OleErr);
    end;

    if InfoMsg then
      Result := 2 else
    if ConnClosed then
      Result := 3 else
      Result := 1;
  end;
end;

procedure InitConnection(Conn: _Connection);
var
  RecsAffected: OleVariant;
begin
  Conn.Execute('set showplan_text off', RecsAffected, -1);
  Conn.Execute('SET NOEXEC OFF SET PARSEONLY OFF', RecsAffected, -1);
  Conn.Execute('set showplan_all off', RecsAffected, -1);
end;

function IsConnectionActive(Conn: _Connection): Boolean;
begin
  Result := (Conn.State and adStateOpen) = adStateOpen;
end;

type
  TExecuteThread = class(TThread)
  private
    FConnection: _Connection;
    FMain: TSqlQryFrm;
    FSQL: string;
    FParseOnly: Boolean;

    FCommand: CommandStd;
    FCanceled: Boolean;

    FInfoMsg: Boolean;  // 當(dāng)前是否有消息性錯(cuò)誤.

    FConnClosed: Boolean; // 是否遇到連接錯(cuò)誤.
    FHasErrors: Boolean;
    FTimeCost: TList;
    FMsgList: TStringList;
    FDataList: TList;

    FLock: TRTLCriticalSection;

    procedure AddMsg(AMsg: string);
    procedure AddRecordset(Rst: _Recordset);
    procedure ProcessResults;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Execute; override;
    procedure Cancel;
    procedure Lock;
    procedure Unlock;
  end;

{ TExecuteThread }

procedure TExecuteThread.AddMsg(AMsg: string);
begin
  FMsgList.Add(AMsg);
end;

procedure TExecuteThread.AddRecordset(Rst: _Recordset);
var
  RowData: TRowDataList;
  bNormal: Boolean;
begin
  RowData := TRowDataList.Create;
  try
    bNormal := RowData.ImportRecordset(Rst, FCanceled);
    if not bNormal and (RowData.Data.Count = 0) then
      FreeAndNil(RowData)
    else
      FDataList.Add(Pointer(RowData));

    if (RowData <> nil) and bNormal then
      AddMsg(Format(#13#10'(所影響的行數(shù)為 %d 行)'#13#10, [RowData.Data.Count]));
  except
    on E: Exception do
    begin
      RowData.Free;
      AddMsg(E.Message);
    end;
  end;
end;

procedure TExecuteThread.Cancel;
begin
  Lock;
  try
    FCanceled := True;
    if FCommand <> nil then FCommand.Cancel;
  finally
    Unlock;
  end;
end;

constructor TExecuteThread.Create;
begin
  inherited Create(True); // Create suspended

  InitializeCriticalSection(FLock);
  FTimeCost := TList.Create;
  FDataList := TList.Create;
  FMsgList := TStringList.Create;
end;

destructor TExecuteThread.Destroy;
begin
  FTimeCost.Free;
  FDataList.Free;
  FMsgList.Free;

  Lock;
  Unlock;
  DeleteCriticalSection(FLock);

  inherited;
end;

procedure TExecuteThread.Execute;
var
  Rst, Rst2: _Recordset;
  I, OldTick, NewTick, Affected: Integer;
  VarRecsAffected, Params: OleVariant;
  sqls: TStringDynArray;
  hr: HResult;
begin
  if FSQL = '' then Exit;

  CoInitialize(Nil);
  try

    SetLength(sqls, 0);
    sqls := SplitSQL(FSQL);

    FMain.FExecuting := True;

    // 如果連接已經(jīng)關(guān)閉, 重新建立.
    if not IsConnectionActive(FConnection) then
    begin
      (FConnection as ConnectionStd).Open('', '', '', -1);
      ProcessResults;
    end;

    // 連接無法建立. 退出.
    if not IsConnectionActive(FConnection) then Exit;

    // 建立Command 對象
    FCommand := CoCommand.Create as CommandStd;
    FCommand.Set_ActiveConnection(FConnection);

    if FParseOnly then
    begin
      hr := (FConnection as ConnectionStd).Execute('set parseonly on',
                  VarRecsAffected, adExecuteNoRecords, Rst2);
      if hr <> S_OK then Exit;
    end;

    for I := 0 to Length(sqls) - 1 do
    begin
      if FCanceled or FConnClosed then Break;

      OldTick := GetTickCount;
      try
        FCommand.Set_CommandText(sqls[I]);
        Params := EmptyParam;
        hr := FCommand.Execute(VarRecsAffected, Params, 0, Rst);

        NewTick := GetTickCount;
        FTimeCost.Add(Pointer(NewTick - OldTick));

        if hr <> S_OK then
        begin
          if LoWord(hr) <> adErrOperationCancelled then FHasErrors := True;
          ProcessResults;
          Continue;
        end;
      except
        On E: Exception do begin
          NewTick := GetTickCount;
          FTimeCost.Add(Pointer(NewTick - OldTick));
          AddMsg(E.Message);
          FHasErrors := True;
          Continue;
        end;
      end;

      while (Rst <> nil) and (not FCanceled) and (not FConnClosed) do
      begin
        ProcessResults;

        Affected := VarRecsAffected;
        if (Rst.State and adStateOpen) = adStateOpen then
        begin
          AddRecordset(Rst);
        end
        else if not FInfoMsg and (Affected >= 0) then
        begin
          AddMsg(Format(#13#10'(所影響的行數(shù)為 %d 行)'#13#10, [Affected]));
        end;

        if FCanceled then Break;

        hr := RecordsetStd(Rst).NextRecordset(VarRecsAffected, Rst2);
        if hr <> S_OK then
          if LoWord(hr) <> adErrOperationCancelled then FHasErrors := True;
        Rst := Rst2;
        Rst2 := nil;
      end;
    end;

    // 有時(shí)候釋放Recordset要花很長時(shí)間, 特別SELECT帶有image類型的字段
    Rst := nil;

    Lock;
    try
      FCommand := nil;
    finally
      Unlock;
    end;

    if FParseOnly then
    begin
      hr := (FConnection as ConnectionStd).Execute('set parseonly off',
                    VarRecsAffected, adExecuteNoRecords, Rst2);
      if hr <> S_OK then Exit;
    end;

    if FCanceled then
    begin
      AddMsg('用戶已取消查詢');
    end;

    // 清除TSqlQryFrm中的線程變量.
    Self.Synchronize(FMain.ClearVarRef);

  finally
    CoUninitialize;
  end;
end;

procedure TExecuteThread.Lock;
begin
  EnterCriticalSection(FLock);
end;

procedure TExecuteThread.ProcessResults;
var
  err_type: Integer;
  ErrMsg: string;
begin
  err_type := ProcessResult(ErrMsg);
  if ErrMsg <> '' then AddMsg(ErrMsg);
  FInfoMsg := err_type = 2;
  FConnClosed := err_type = 3;
end;

procedure TExecuteThread.Unlock;
begin
  LeaveCriticalSection(FLock);
end;

{ TSqlQryFrm }

procedure TSqlQryFrm.CancelExecute;
begin
  FCanceling := True;
  if FExecThread <> nil then
  begin
    TExecuteThread(FExecThread).Cancel;
    SBar.SimpleText := '正在取消批查詢, 請等待...';
  end;
end;

procedure TSqlQryFrm.ClearResults;
var
  I: Integer;
  Ctrl: TControl;
begin
  Pgc1.ActivePageIndex := 0;
  for I := PnlResult.ControlCount - 1 downto 0 do
  begin
    Ctrl := PnlResult.Controls[I];
    Ctrl.Free;
  end;
  PnlResult.Align := alTop;
  PnlResult.Height := SbxResult.ClientHeight;

  MoMsg.Clear;
end;

procedure TSqlQryFrm.Execute;
var
  sql: string;
begin
  if Self.Executing or (MoSql.Text = '') then Exit;

  if MoSql.SelLength = 0 then
    sql := MoSql.Text
  else
    sql := MoSql.SelText;

  // 清除結(jié)果.
  ClearResults;

  FCanceling := False;

  if FConnClosed and IsConnectionActive(FConnection) then
  begin
    // 即使是執(zhí)行過程中, 遇到通訊問題, State仍然不會(huì)變成adStateClosed
    // 所以必須重新關(guān)閉, 再建立聯(lián)接
    FConnection.Close;
    FConnClosed := False;
  end;

  SBar.SimpleText := '正在執(zhí)行批查詢...';

  FExecThread := TExecuteThread.Create;
  FExecThread.FreeOnTerminate := True;
  FExecThread.OnTerminate := OnThreadTerminate;
  TExecuteThread(FExecThread).FConnection := FConnection;
  TExecuteThread(FExecThread).FMain := Self;
  TExecuteThread(FExecThread).FSQL := sql;
  TExecuteThread(FExecThread).FParseOnly := FParseOnly;
  FExecThread.Resume;
end;

procedure TSqlQryFrm.ParseSQL;
begin
  if Self.Executing then Exit;

  FParseOnly := True;
  try Execute; except end;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av资源网一区| 成人网在线免费视频| 奇米一区二区三区av| 午夜av区久久| 麻豆成人免费电影| 国产一区二区成人久久免费影院 | 中文字幕一区二区在线观看| 国产亚洲福利社区一区| 中文字幕亚洲电影| 亚洲另类色综合网站| 亚洲一区视频在线| 奇米一区二区三区| 国产精品资源网| 99精品视频在线观看| 欧美中文字幕一二三区视频| 欧美老肥妇做.爰bbww视频| 欧美哺乳videos| 国产日产精品1区| 一个色妞综合视频在线观看| 日本人妖一区二区| 国产91清纯白嫩初高中在线观看| 91美女福利视频| 欧美一区二区在线播放| 欧美激情一区在线观看| 日本不卡视频一二三区| 99久久综合狠狠综合久久| 欧美性受极品xxxx喷水| 精品国产精品一区二区夜夜嗨| 国产精品国产精品国产专区不蜜 | 久久久高清一区二区三区| 中文字幕精品综合| 日韩中文字幕av电影| 国产美女久久久久| 在线看国产日韩| 亚洲精品在线观看网站| 最新热久久免费视频| 日韩1区2区3区| 成人免费毛片片v| 日韩一卡二卡三卡四卡| 亚洲人成网站色在线观看| 九九久久精品视频| 欧美高清www午色夜在线视频| 中文字幕乱码久久午夜不卡 | 欧美老年两性高潮| 亚洲欧美另类综合偷拍| 国产黄色精品视频| 精品女同一区二区| 亚洲成人一区二区| 91天堂素人约啪| 久久久久国产精品人| 日本成人在线视频网站| 91小视频免费看| 久久久久久9999| 麻豆精品久久精品色综合| 在线欧美一区二区| 亚洲色图19p| www.性欧美| 国产色91在线| 国产一区三区三区| 欧美mv和日韩mv的网站| 亚洲成av人片在www色猫咪| 99久久精品国产一区| 久久一二三国产| 久久er99热精品一区二区| 欧美日韩一区在线观看| 亚洲色图视频网| 99久久久无码国产精品| 中文字幕乱码日本亚洲一区二区| 国产在线播精品第三| 欧美一级欧美一级在线播放| 亚洲综合视频在线| 欧美日韩免费电影| 亚洲第一福利视频在线| 欧美少妇bbb| 亚洲一区二区三区视频在线播放| 一本色道久久综合精品竹菊| 亚洲女性喷水在线观看一区| 91色九色蝌蚪| 亚洲国产精品自拍| 欧美日韩一区二区在线观看| 视频一区在线播放| 91精品国产日韩91久久久久久| 亚洲成a人片在线不卡一二三区| 99久久综合精品| 一卡二卡欧美日韩| 欧美绝品在线观看成人午夜影视| 亚洲香肠在线观看| 日韩西西人体444www| 国产一区二区伦理片| 欧美极品美女视频| 色婷婷综合激情| 亚洲电影在线免费观看| 欧美高清www午色夜在线视频| 久久国产三级精品| 国产精品麻豆欧美日韩ww| 欧美亚洲综合久久| 久久机这里只有精品| 久久精品一区二区三区不卡| 成人激情视频网站| 亚洲成人av电影| 欧美精品一区二区蜜臀亚洲| 99久久久无码国产精品| 亚洲伊人色欲综合网| 26uuu久久天堂性欧美| 99在线精品一区二区三区| 视频一区二区三区中文字幕| 久久影院午夜论| 欧美亚洲一区二区三区四区| 久久成人免费网站| 欧美性色aⅴ视频一区日韩精品| 午夜国产精品一区| 欧美性三三影院| 美腿丝袜亚洲三区| 中文字幕欧美日韩一区| 色综合咪咪久久| 亚洲成av人片一区二区三区| 欧美一卡在线观看| 成人av在线网| 久久综合综合久久综合| 亚洲天堂免费在线观看视频| 欧美精品在欧美一区二区少妇| 国产精品一线二线三线| 午夜精彩视频在线观看不卡| 国产欧美视频在线观看| 日韩一二在线观看| 日本韩国欧美一区二区三区| 蜜乳av一区二区三区| 亚洲精品老司机| 国产人伦精品一区二区| 日韩欧美综合在线| 日本韩国精品在线| 成人网在线播放| 精品一区二区免费看| 五月综合激情网| 亚洲综合丁香婷婷六月香| 国产精品成人一区二区三区夜夜夜| 欧美日韩电影在线| 欧美精品乱人伦久久久久久| 一本大道久久a久久综合婷婷| 国产成人啪免费观看软件| 日本欧美一区二区在线观看| 亚洲欧美日韩国产手机在线| 国产女同互慰高潮91漫画| 精品国偷自产国产一区| 欧美日韩国产电影| 在线视频欧美精品| 欧美在线观看你懂的| 成人av电影在线播放| 国产a精品视频| 国产一区二区三区在线看麻豆| 老司机午夜精品| 男女视频一区二区| 亚洲成人自拍偷拍| 五月天亚洲婷婷| 香蕉加勒比综合久久| 日韩高清在线观看| 日韩中文字幕不卡| 日产国产欧美视频一区精品 | 国产农村妇女精品| 国产午夜精品福利| 亚洲国产精品v| 国产色产综合产在线视频| 国产精品视频免费| 国产精品免费看片| 免费成人在线视频观看| 99免费精品视频| 精品国产欧美一区二区| 一区二区三区精密机械公司| 国产精品综合网| 日韩视频在线你懂得| 亚洲免费资源在线播放| 国产一区二区导航在线播放| 欧美日韩精品久久久| 中文字幕日韩av资源站| 人人超碰91尤物精品国产| 日本精品视频一区二区| 亚洲国产精品激情在线观看| 九一九一国产精品| 欧美视频自拍偷拍| 亚洲桃色在线一区| 国产成人免费在线视频| 欧美大片在线观看一区二区| 亚洲国产一二三| 色999日韩国产欧美一区二区| 国产视频一区二区三区在线观看 | 国产女主播一区| 韩国午夜理伦三级不卡影院| 欧美日韩不卡一区| 一区二区三区欧美在线观看| 不卡视频在线看| 国产精品乱码一区二三区小蝌蚪| 韩国成人精品a∨在线观看| 欧美一区二区不卡视频| 日韩成人一区二区| 911精品国产一区二区在线| 午夜成人免费电影| 91精品国产福利| 美国欧美日韩国产在线播放| 91精品国产色综合久久| 蜜桃精品视频在线|