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

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

?? objectsbrowser.pas

?? 仿sql查詢分析器
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
// 對象瀏覽器控件.
//
unit ObjectsBrowser;

interface
uses Windows, Messages, Classes, SysUtils, Controls, StdCtrls, ComCtrls,
    ExtCtrls, Graphics, ImgList, Variants, ADOInt, Pub, Forms, Menus;

type
  TObjectsBrowserPanel = class(TPanel)
  private
    FComboBox: TComboBox;
    FTreeView: TTreeView;
    FConnection: _Connection;
    FImageList: TImageList;
    FMenu: TPopupMenu;
    FRefreshMenu: TMenuItem;
    FServerInfos: TList;

    procedure LoadResBitmap;
    procedure OnSelectServer(Sender: TObject);
    procedure OnTreeNodeDeletion(Sender: TObject; Node: TTreeNode);
    procedure OnTreeNodeChanged(Sender: TObject; Node: TTreeNode);
    procedure OnTreeNodeExpanding(Sender: TObject; Node: TTreeNode;
                        var AllowExpansion: Boolean);

    procedure FillDatabases(Node: TTreeNode);
    procedure FillUserTables(Node: TTreeNode; dbName: string);
    procedure FillSysTables(Node: TTreeNode; dbName: string);
    procedure FillViews(Node: TTreeNode; dbName: string);
    procedure FillUserTypes(Node: TTreeNode; dbName: string);
    procedure FillTableColumns(Node: TTreeNode; Data: TObject);
    procedure FillTableIndexes(Node: TTreeNode; Data: TObject);
    procedure FillTableContraints(Node: TTreeNode; Data: TObject);
    procedure FillDepends(Node: TTreeNode; DBName: string; ObjID: Integer);
    procedure FillTriggers(Node: TTreeNode; DBName: string; ObjID: Integer);
    procedure FillViewColumns(Node: TTreeNode; Data: TObject);
    procedure FillViewIndexes(Node: TTreeNode; Data: TObject);
    procedure FillStoredProcs(Node: TTreeNode; dbName: string);
    procedure FillFunctions(Node: TTreeNode; dbName: string);
    procedure FillSProcParams(Node: TTreeNode; dbName, dbo, spname: string);

    function ExecuteSql(const Sql: string): Integer;
    function ExecuteRst(const Sql: string): _Recordset;
    function GetColumnDescription(colname, typename: string;
        size, prec, scale: Integer; nullable: Boolean): string;

    procedure Relayout;

    procedure DoRefresh(Sender: TObject);
    procedure DoMenuPopup(Sender: TObject);
  protected
    procedure CreateWnd; override;
    procedure Resize; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure RefreshObjects;
    procedure AddServer(AServer, AUserName, APwd,
                        ADataSource, ALoginName: string;
                        AuthType: TAuthType);
  end;

implementation

{$R ObjectsBrowser.RES}

type
  TServerInfo = class
    Server: string;
    UserName: string;
    Password: string;
    AuthType: TAuthType;
    DataSource: string;
  end;

  TDBItemType = (dtUnknown, dtUserTable, dtSysTable, dtView, dtStoredProc,
                  dtFunction, dtUserType);
  TTableItemType = (ttUnknown, ttColumn, ttIndex, ttContraint, ttDepend, ttTrigger);
  TViewItemType = (vtUnknown, vtColumn, vtIndex, vtDepend, vtTrigger);
  TSPItemType = (stUnknown, stParameter, stDepend);
  TFunctionItemType = (ftUnknown, ftParameter, ftDepend);

  TDBNode = class(TObject);

  TDBItemInfo = class
  public
    FDBName: string;
    FItemType: TDBItemType;
    constructor Create(ADBName: string; AType: TDBItemType);
  end;

  TTableNode = class(TObject);

  TTableItemInfo = class
  public
    FDBName: string;
    FTableID: Integer;
    FItemType: TTableItemType;
    constructor Create(ADBName: string; ATableID: Integer; AType: TTableItemType);
  end;

  TViewNode = class(TObject);

  TViewItemInfo = class
  public
    FDBName: string;
    FViewID: Integer;
    FViewName: string;
    FOwner: string;
    FItemType: TViewItemType;
    constructor Create(ADBName: string; AViewID: Integer;
                    AViewName: string; AOwner: string; AType: TViewItemType);
  end;

  TSPNode = class(TObject);
  
  TSPItemInfo = class
  public
    FDBName: string;
    FOwner: string;
    FSPName: string;
    FSPID: Integer;
    FItemType: TSPItemType;
    constructor Create(ADBName, AOwner, ASPName: string; ASPID: Integer;
                      AItemType: TSPItemType);
  end;

  TFuncNode = class(TObject);

  TFuncItemInfo = class
  public
    FDBName: string;
    FOwner: string;
    FFuncName: string;
    FFuncID: Integer;
    FItemType: TFunctionItemType;

    constructor Create(ADBName, AOwner, AFuncName: string; AFuncID: Integer;
                      AItemType: TFunctionItemType);
  end;

{ TDBItemInfo }

constructor TDBItemInfo.Create(ADBName: string; AType: TDBItemType);
begin
  FDBName := ADBName;
  FItemType := AType;
end;

{ TTableItemInfo }

constructor TTableItemInfo.Create(ADBName: string; ATableID: Integer;
                          AType: TTableItemType);
begin
  FDBName := ADBName;
  FTableID := ATableID;
  FItemType := AType;
end;

{ TViewItemInfo }

constructor TViewItemInfo.Create(ADBName: string; AViewID: Integer;
                    AViewName: string; AOwner: string; AType: TViewItemType);
begin
  FDBName := ADBName;
  FViewID := AViewID;
  FViewName := AViewName;
  FOwner := AOwner;
  FItemType := AType;
end;

{ TSPItemInfo }

constructor TSPItemInfo.Create(ADBName, AOwner, ASPName: string; ASPID: Integer;
                  AItemType: TSPItemType);
begin
  FDBName := ADBName;
  FOwner := AOwner;
  FSPName := ASPName;
  FSPID := ASPID;
  FItemType := AItemType;
end;

{ TFuncItemInfo }

constructor TFuncItemInfo.Create(ADBName, AOwner, AFuncName: string; AFuncID: Integer;
                  AItemType: TFunctionItemType);
begin
  FDBName := ADBName;
  FOwner := AOwner;
  FFuncName := AFuncName;
  FFuncID := AFuncID;
  FItemType := AItemType;
end;

const
  ConnStr1 = 'Provider=SQLOLEDB.1;Integrated Security=SSPI;' +
             'Persist Security Info=False;Data Source=%s;Application Name=SQL查詢器-對象瀏覽器';

  ConnStr2 = 'Provider=SQLOLEDB.1;Password=%s;' +
             'Persist Security Info=True;User ID=%s;Data Source=%s;' +
             'Application Name=SQL查詢器-對象瀏覽器';

procedure LoadRes;
var
  b: TBitmap;
begin
  b := TBitmap.Create;
  try
    b.LoadFromResourceName(SysInit.HInstance, 'B0');
  finally
    b.Free;
  end;
end;

{ TObjectsBrowserPanel }

procedure TObjectsBrowserPanel.AddServer(AServer, AUserName, APwd,
  ADataSource, ALoginName: string; AuthType: TAuthType);
  
  function FindServer: Boolean;
  var
    I: Integer;
    info: TServerInfo;
  begin
    for I := 0 to FComboBox.Items.Count-1 do
    begin
      info := TServerInfo(FComboBox.Items.Objects[I]);
      if info = nil then Continue;
      if SameText(info.Server, AServer) and SameText(info.UserName, AUserName)
          and SameText(info.Password, APwd) and (info.AuthType = AuthType) then
      begin
        Result := True;
        Exit;
      end;
    end;
    Result := False;
  end;     
var
  info: TServerInfo;
begin
  if FindServer then Exit;

  info := TServerInfo.Create;
  info.Server := AServer;
  info.UserName := AUserName;
  info.Password := APwd;
  info.AuthType := AuthType;
  info.DataSource := ADataSource;

  FServerInfos.Add(Pointer(info));
  FComboBox.AddItem(ADataSource + '(' + ALoginName + ')', TObject(info));
end;

constructor TObjectsBrowserPanel.Create(AOwner: TComponent);
begin
  inherited;

  Self.BevelOuter := bvNone;
  FServerInfos := TList.Create;

  FComboBox := TComboBox.Create(nil);
  FTreeView := TTreeView.Create(nil);
  FMenu := TPopupMenu.Create(nil);
  FRefreshMenu := TMenuItem.Create(nil);
  FMenu.Items.Add(FRefreshMenu);
end;

procedure TObjectsBrowserPanel.CreateWnd;
begin
  inherited;

  FComboBox.Parent := Self;
  FComboBox.Style := csDropDownList;

  FTreeView.Parent := Self;
  FTreeView.HideSelection := False;
  FTreeView.ReadOnly := True;
  FTreeView.PopupMenu := FMenu;

  FRefreshMenu.Caption := '刷新(&R)';
  FRefreshMenu.ShortCut := ShortCut(116 {VK_F5}, []);
  FRefreshMenu.OnClick := DoRefresh;
  FMenu.OnPopup := DoMenuPopup;

  LoadResBitmap;
  FTreeView.Images := FImageList;

  FComboBox.OnSelect := OnSelectServer;
  FTreeView.OnDeletion := OnTreeNodeDeletion;
  FTreeView.OnChange := OnTreeNodeChanged;
  FTreeView.OnExpanding := OnTreeNodeExpanding;

  Resize;
end;

destructor TObjectsBrowserPanel.Destroy;
var
  I: Integer;
begin
  FComboBox.Free;
  FTreeView.Free;
  FRefreshMenu.Free;
  FMenu.Free;
  FImageList.Free;;

  for I := 0 to FServerInfos.Count-1 do
    TObject(FServerInfos[I]).Free;
  FServerInfos.Free;

  FConnection := nil;

  inherited;
end;

procedure TObjectsBrowserPanel.DoMenuPopup(Sender: TObject);
var
  pt: TPoint;
  Node: TTreeNode;
begin
  GetCursorPos(pt);
  pt := FTreeView.ScreenToClient(pt);
  Node := FTreeView.GetNodeAt(pt.X, pt.Y);
  if Node <> nil then
    Node.Selected := True;

  if Node = nil then
    Node := FTreeView.Selected;

  if Node = nil then Exit;

  FMenu.Items[0].Enabled := Node.Data <> nil;
end;

procedure TObjectsBrowserPanel.DoRefresh(Sender: TObject);
var
  Node, theNode: TTreeNode;
  obj: TObject;
  I: Integer;
begin
  Node := FTreeView.Selected;
  if Node = nil then Exit;

  obj := TObject(Node.Data);
  if obj = nil then Exit;

  if (obj is TDBNode) or (obj is TTableNode) or (obj is TViewNode)
        or (obj is TSPNode) or (obj is TFuncNode) then
  begin
    for I := 0 to Node.Count-1 do
    begin
      theNode := Node[I];
      theNode.DeleteChildren;
      theNode.HasChildren := True;
    end;
  end
  else if (obj is TDBItemInfo) or (obj is TTableItemInfo)
      or (obj is TViewItemInfo) or (obj is TSPItemInfo)
      or (obj is TFuncItemInfo) then
  begin
    Node.DeleteChildren;
    Node.HasChildren := True;
  end;
end;

function TObjectsBrowserPanel.ExecuteRst(const Sql: string): _Recordset;
var
  VarAffected: OleVariant;
begin
  Result := FConnection.Execute(Sql, VarAffected, 0);
end;

function TObjectsBrowserPanel.ExecuteSql(const Sql: string): Integer;
var
  VarAffected: OleVariant;
begin
  FConnection.Execute(Sql, VarAffected, adExecuteNoRecords);
  Result := VarAffected;
end;

procedure TObjectsBrowserPanel.FillDatabases(Node: TTreeNode);

  procedure AddItemNode(PNode: TTreeNode; s: string; data: TDBItemInfo);
  var
    itemNode: TTreeNode;
  begin
    itemNode := FTreeView.Items.AddChild(PNode, s);
    itemNode.HasChildren := True;
    itemNode.ImageIndex := 2;
    itemNode.SelectedIndex := 3;
    itemNode.Data := Pointer(data);
  end;

const
  sql = 'exec sp_MShasdbaccess';
var
  Rst: _Recordset;
  dbNode: TTreeNode;
  dbname: string;
begin
  Rst := ExecuteRst(sql);

  while not Rst.EOF do
  begin
    dbname := String(Rst.Fields['dbname'].Value);
    dbNode := FTreeView.Items.AddChild(Node, dbname);
    dbNode.ImageIndex := 1;
    dbNode.SelectedIndex := 1;
    dbNode.Data := Pointer(TDBNode.Create);
    
    AddItemNode(dbNode, '用戶表', TDBItemInfo.Create(dbname, dtUserTable));
    AddItemNode(dbNode, '系統表', TDBItemInfo.Create(dbname, dtSysTable));
    AddItemNode(dbNode, '視圖', TDBItemInfo.Create(dbname, dtView));
    AddItemNode(dbNode, '存儲過程', TDBItemInfo.Create(dbname, dtStoredProc));
    AddItemNode(dbNode, '函數', TDBItemInfo.Create(dbname, dtFunction));
    AddItemNode(dbNode, '用戶定義的數據類型', TDBItemInfo.Create(dbname, dtUserType));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情一区二区三区不卡| 色狠狠一区二区| 亚洲激情校园春色| 日韩免费看网站| 欧洲亚洲精品在线| 国产精品正在播放| 日韩精品亚洲专区| 怡红院av一区二区三区| 国产喂奶挤奶一区二区三区| 欧美日韩精品三区| 色呦呦日韩精品| 国产成人免费视| 久久国内精品视频| 天天av天天翘天天综合网色鬼国产| 国产精品全国免费观看高清| 欧美成人一区二区三区在线观看| 精品视频一区三区九区| gogo大胆日本视频一区| 国产精品一区在线观看你懂的| 天堂av在线一区| 亚洲午夜av在线| 亚洲乱码国产乱码精品精的特点| 国产日韩欧美精品一区| 精品福利一区二区三区免费视频| 欧美高清视频一二三区| 91国内精品野花午夜精品| 99久久婷婷国产精品综合| 波波电影院一区二区三区| 国产精品白丝jk白祙喷水网站| 久久精品国产精品青草| 日本亚洲三级在线| 日韩精品一区第一页| 日韩精品电影在线观看| 日韩精品一二区| 免费一级片91| 麻豆一区二区99久久久久| 国产日韩亚洲欧美综合| 成人午夜激情视频| 亚洲国产精华液网站w| 99久久99久久精品免费看蜜桃| 国产主播一区二区三区| 麻豆久久一区二区| 国内成人精品2018免费看| 精品一区二区免费视频| 激情综合色综合久久| 国产真实精品久久二三区| 国产在线精品国自产拍免费| 国产一区二区在线影院| 国产精品小仙女| 成人精品小蝌蚪| 91丨九色丨蝌蚪富婆spa| 91精彩视频在线| 欧美日韩国产在线播放网站| 欧美一区二区三区婷婷月色| 久久综合九色综合欧美98| 国产亚洲自拍一区| 亚洲欧洲色图综合| 亚洲午夜精品网| 久久99精品久久久久婷婷| 国产精品18久久久久久久网站| 成人少妇影院yyyy| 欧美色区777第一页| 日韩午夜激情免费电影| 欧美经典一区二区| 亚洲码国产岛国毛片在线| 亚洲成人av免费| 经典三级视频一区| av在线不卡观看免费观看| 欧美天堂一区二区三区| 精品美女一区二区| 国产精品国产成人国产三级| 亚洲成人av福利| 国产精品88888| 在线观看91精品国产入口| 精品奇米国产一区二区三区| 国产精品国产三级国产普通话三级 | 亚洲免费色视频| 调教+趴+乳夹+国产+精品| 国产99久久久国产精品免费看| 91麻豆国产福利精品| 日韩丝袜情趣美女图片| 欧美激情一区二区三区不卡 | 亚洲成a人片综合在线| 国产综合成人久久大片91| 色婷婷av一区| 久久精品人人做人人综合| 一区二区三区在线播放| 韩国v欧美v日本v亚洲v| 色婷婷av一区二区三区gif| 久久久亚洲精华液精华液精华液 | 欧美一个色资源| 亚洲伦在线观看| 国产一区二区精品久久| 欧美视频一区二区在线观看| 国产日韩欧美高清在线| 日韩国产欧美视频| 91麻豆国产精品久久| 国产亚洲欧美一级| 日韩精品视频网站| 91美女福利视频| 欧美经典一区二区三区| 日本vs亚洲vs韩国一区三区二区 | 2017欧美狠狠色| 亚洲成av人**亚洲成av**| 不卡视频一二三四| 久久亚洲欧美国产精品乐播| 亚洲午夜一区二区三区| 91年精品国产| 国产精品视频yy9299一区| 精品亚洲成a人| 91精品视频网| 亚洲午夜在线视频| 91国产成人在线| 国产精品福利av| 国产成人精品免费| 欧美精品一区二区高清在线观看| 日韩和欧美的一区| 欧美丝袜丝交足nylons图片| 亚洲视频免费看| 成人短视频下载| 欧美国产一区二区在线观看| 国内不卡的二区三区中文字幕| 6080午夜不卡| 天堂精品中文字幕在线| 欧美日韩成人一区二区| 亚洲成va人在线观看| 欧美三区免费完整视频在线观看| 亚洲欧美一区二区久久| 99精品视频免费在线观看| 国产亲近乱来精品视频| 成人美女视频在线观看18| 日本一区二区三区久久久久久久久不 | 国产福利精品导航| 国产人成一区二区三区影院| 国产精品66部| 欧美激情一区二区三区四区| 成人午夜私人影院| 综合分类小说区另类春色亚洲小说欧美| 国产成人精品1024| 国产精品乱人伦| 91最新地址在线播放| 亚洲欧洲另类国产综合| 91丨porny丨首页| 91久久精品国产91性色tv| 色琪琪一区二区三区亚洲区| 日韩电影免费在线看| 中文字幕不卡在线播放| 日韩一区二区视频| 成人妖精视频yjsp地址| 欧美白人最猛性xxxxx69交| 亚洲高清在线视频| 91 com成人网| 久色婷婷小香蕉久久| 日韩美女在线视频| 国产精品 日产精品 欧美精品| 国产欧美精品一区| 91女神在线视频| 日日夜夜精品免费视频| 精品久久国产老人久久综合| 国产精品66部| 一区二区三区中文在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲电影一区二区| 91精品国产麻豆| 国产高清不卡二三区| 亚洲欧美中日韩| 欧美精品自拍偷拍| 在线视频综合导航| 欧美成人官网二区| 国产网站一区二区三区| 91精品国产综合久久蜜臀| 91国产福利在线| 国产成人午夜电影网| 色久综合一二码| 综合在线观看色| 欧美日韩亚洲综合在线| 久久精品国产一区二区三区免费看 | 欧美日韩国产一区| 韩国成人精品a∨在线观看| 亚洲欧洲日本在线| 日韩三区在线观看| aaa亚洲精品一二三区| 日本欧美在线观看| 亚洲日本青草视频在线怡红院| 在线成人免费视频| youjizz国产精品| 日本免费在线视频不卡一不卡二| 中文av一区特黄| 日韩一级大片在线| 色综合天天综合网天天狠天天| 久久er99热精品一区二区| 国产精品电影一区二区| 日韩欧美自拍偷拍| 色综合天天性综合| 紧缚奴在线一区二区三区| 亚洲成在人线免费| 欧美国产丝袜视频| 成人免费va视频| 亚洲精品一区在线观看| 国内精品免费在线观看|