⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 一个sql语法分析程序
💻 PAS
字号:
{*******************************************************}
{                                                       }
{       Advanced SQL statement parser demo program      }
{       Copyright (c) 2001 AS Gaiasoft                  }
{       Created by Gert Kello                           }
{                                                       }
{*******************************************************}

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, gaAdvancedSQLParser, ActnList, Menus;

type
  TfrmMain = class(TForm)
    pnlButtons: TPanel;
    pgcSQL: TPageControl;
    tshSQLText: TTabSheet;
    tshNewSQLText: TTabSheet;
    tshTokenInfo: TTabSheet;
    memSQLText: TMemo;
    memRebuildedSQL: TMemo;
    edToken: TEdit;
    lblTokenText: TLabel;
    lblTokenType: TLabel;
    edTokenType: TEdit;
    lblStringDelimiter: TLabel;
    edStringDelimiter: TEdit;
    lblStatementParserClass: TLabel;
    edStatementParserClass: TEdit;
    lblStatementType: TLabel;
    edStatementType: TEdit;
    lblParsedSQL: TLabel;
    memParsedSQL: TMemo;
    btnReset: TButton;
    btnNextToken: TButton;
    btnReplace: TButton;
    btnAll: TButton;
    ActionList1: TActionList;
    actLoadSQL: TAction;
    actSaveSQL: TAction;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    LoadSQL1: TMenuItem;
    LoadSQL2: TMenuItem;
    SaveSQL1: TMenuItem;
    procedure btnResetClick(Sender: TObject);
    procedure btnNextTokenClick(Sender: TObject);
    procedure btnAllClick(Sender: TObject);
    procedure btnReplaceClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure actSaveSQLUpdate(Sender: TObject);
    procedure actSaveSQLExecute(Sender: TObject);
    procedure actLoadSQLExecute(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    QueryParser: TgaAdvancedSQLParser;
    procedure SetValues;
    procedure TokenParsed(Sender: TObject);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

uses
  gaSelectStm, gaDeleteStm, gaBasicSQLParser, gaSQLParserHelperClasses, TypInfo;

{$R *.DFM}

procedure TfrmMain.btnResetClick(Sender: TObject);
begin
  QueryParser.SQLText := memSQLText.Lines;
  SetValues;
end;

procedure TfrmMain.btnNextTokenClick(Sender: TObject);
begin
  QueryParser.NextToken;
  SetValues;
end;

procedure TfrmMain.btnAllClick(Sender: TObject);
begin
  QueryParser.Reset;
  while not (QueryParser.TokenType = stEnd) do
    QueryParser.NextToken;
  SetValues;
end;

procedure TfrmMain.btnReplaceClick(Sender: TObject);
begin
  QueryParser.SQLText := memSQLText.Lines;
  QueryParser.Reset;
  while not (QueryParser.TokenType = stEnd) do
    QueryParser.NextToken;
  QueryParser.CurrentStatement.AllTables.First;
  while not QueryParser.CurrentStatement.AllTables.Eof do
  begin
    (QueryParser.CurrentStatement.AllTables.CurrentItem as TgaSQLTable).TablePrefix := 'here.athome';
    if (QueryParser.CurrentStatement.AllTables.CurrentItem as TgaSQLTable).IsAliasAllowed then
      (QueryParser.CurrentStatement.AllTables.CurrentItem as TgaSQLTable).TableAlias := 'MeMyself';
    QueryParser.CurrentStatement.AllTables.Next;
  end;
  if QueryParser.CurrentStatement is TgaSelectSQLStatement then
  begin
    if Assigned((QueryParser.CurrentStatement as TgaSelectSQLStatement).OrderByClause) then
      (QueryParser.CurrentStatement as TgaSelectSQLStatement).OrderByClause.AsString := 'order BY Test';
    if Assigned((QueryParser.CurrentStatement as TgaSelectSQLStatement).WhereClause) then
      (QueryParser.CurrentStatement as TgaSelectSQLStatement).WhereClause.AsString := '(Test = ''Test'') and (My = "My")';
  end;
  if QueryParser.CurrentStatement is TgaDeleteSQLStatement then
  begin
    if Assigned((QueryParser.CurrentStatement as TgaDeleteSQLStatement).WhereClause) then
      (QueryParser.CurrentStatement as TgaDeleteSQLStatement).WhereClause.AsString := '(Test = ''Test'') and (My = "My")';
  end;
  SetValues;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  QueryParser := TgaAdvancedSQLParser.Create(Self);
//  QueryParser.OnTokenParsed := TokenParsed;
end;

procedure TfrmMain.TokenParsed(Sender: TObject);
begin
  SetValues;
end;

function GetReadableString(const InStr: string): string;
var
  cPos: PChar;
begin
  Result := '';
  cPos := PChar(InStr);
  while cPos^ <> #0 do
  begin
    if cPos^ > ' ' then
      Result := Result + cPos^
    else
      Result := Format('%s#%2.2d', [Result, Ord(cPos^)]);
    Inc(cPos);
  end;
end;

procedure TfrmMain.SetValues;
begin
  edToken.Text := GetReadableString(QueryParser.TokenString);
  edStringDelimiter.Text := QueryParser.QuoteChar;
  edTokenType.Text := GetEnumName(TypeInfo(TSQLToken), Ord(QueryParser.TokenType));
  edStatementParserClass.Text := QueryParser.CurrentStatement.ClassName;
  edStatementType.Text := GetEnumName(TypeInfo(TSQLStatementType),
    Ord(QueryParser.CurrentStatement.StatementType));
  memRebuildedSQL.Lines.Text := QueryParser.CurrentStatement.AsString;
  memParsedSQL.Lines.Text := QueryParser.CurrentStatement.OriginalSQL.AsString;
end;

procedure TfrmMain.actSaveSQLUpdate(Sender: TObject);
begin
  actSaveSQL.Enabled := memSQLText.Lines.Count > 0;
end;                                                   

procedure TfrmMain.actSaveSQLExecute(Sender: TObject);
begin
  if SaveDialog1.Execute then
    memSQLText.Lines.SaveToFile(SaveDialog1.FileName);
end;

procedure TfrmMain.actLoadSQLExecute(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    memSQLText.Lines.LoadFromFile(OpenDialog1.FileName);
    btnResetClick(Self);
  end;
end;

procedure TfrmMain.FormShow(Sender: TObject);
begin
  QueryParser.SQLText := memSQLText.Lines;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -