批量執(zhí)行SQL語句的示例
在項目中,經(jīng)常會遇到需要批量執(zhí)行SQL語句的情況,下面將為您示例說明批量執(zhí)行SQL語句的方法,希望對教您學(xué)習(xí)SQL語句有所幫助。
當(dāng)然,我們更想在程序中去執(zhí)行這些語句,而不是再去打開查詢分析器。
當(dāng)我們要在程序中批量執(zhí)行SQL語句時,需要明白AdoConnection,或AdoQuery(假設(shè)我們使用ADO組件)可以執(zhí)行的語句有什么要求。
1、在查詢分析器里,一條SQL語句,我們可以直接寫成
Select * from aTable where ID=123
或者
Select * from aTable where ID=123;
這兩條語句結(jié)果相同。不同的地方只是第二條多了一個“;”,用來表示一條語句結(jié)束。
2、在查詢分析器里,多條SQL語句的寫法
insert into aTable(Field1,Field2) values( '值一','值二')
go
這里的 go 表示一個批處理
根據(jù)以上兩點,我們可以看出,我們要在程序中批量執(zhí)行SQL語句,需要判斷一個完整的操作包含幾條語句,這些語句是不是可以單獨執(zhí)行等。
下面是一個示例程序(程序中不涉及到Select操作)
- unit BatchSQL;
- {
- 批量執(zhí)行SQL腳本
- E-main: goldli@163.com
- }
- interface
- uses
- SysUtils,ADODB,Classes;
- type
- TOnException = procedure(const E: Exception) of object;
- TOnSQLExecute = procedure(const strSQL: string;const RowsAffected:Integer) of object;
- type
- {完整的SQL語句}
- TSQLString = class
- private
- FBuffer:string;
- FSQL:TStrings;
- FChanged:Boolean;
- function GetSQL:string;
- public
- constructor Create;
- destructor Destroy;override;
- procedure Append(const StrSQL:string);
- property SQL:string read GetSQL;
- end;
- TBatchSQL = class
- private
- FConnection:TADOConnection;
- FSQLList:TList;
- FOnException:TOnException;
- FOnSQLExecute:TOnSQLExecute;
- public
- constructor Create(const AConnection:TADOConnection);
- destructor Destroy;override;
- property Connection:TADOConnection write FConnection;
- procedure LoadFromFile(const FileName:string);
- procedure Execute;
- property OnException:TOnException write FOnException;
- property OnSQLExecute:TOnSQLExecute write FOnSQLExecute;
- end;
- implementation
- { TSQLString }
- procedure TSQLString.Append(const StrSQL: string);
- begin
- FSQL.Append(StrSQL);
- FChanged:=True;
- end;
- constructor TSQLString.Create;
- begin
- FSQL:=TStringList.Create;
- end;
- destructor TSQLString.Destroy;
- begin
- FSQL.Free;
- inherited;
- end;
- function TSQLString.GetSQL: string;
- begin
- if FChanged then
- begin
- FBuffer:=FSQL.Text;
- FChanged:=False;
- end;
- Result:=FBuffer;
- end;
- { TBatchSQL }
- constructor TBatchSQL.Create(const AConnection: TADOConnection);
- begin
- if Assigned(AConnection) then
- FConnection:=AConnection;
- FSQLList:=TList.Create;
- end;
- destructor TBatchSQL.Destroy;
- var
- i:Integer;
- begin
- FConnection:=nil;
- for i:= FSQLList.Count -1 downto 0 do
- TSQLString(FSQLList.Items[i]).Free;
- FSQLList.Free;
- inherited;
- end;
- procedure TBatchSQL.Execute;
- var
- i:Integer;
- Qry:TADOQuery;
- SQLString:TSQLString;
- begin
- Assert(Assigned(FConnection),'數(shù)據(jù)庫連接不能為nil.');
- Assert(FSQLList.count > 0,'請先加載SQL文件.');
- FConnection.LoginPrompt:=False;
- FConnection.Connected:=True;
- Qry:=TADOQuery.Create(nil);
- with Qry do
- begin
- Connection:=FConnection;
- Prepared:=True;
- for i:=0 to FSQLList.Count -1 do
- begin
- SQLString:=TSQLString(FSQLList.Items[i]);
- SQL.Clear;
- SQL.Add(SQLString.SQL);
- try
- ExecSQL;
- if Assigned(FOnSQLExecute) then
- FOnSQLExecute(SQLString.SQL,RowsAffected);
- except
- on E:Exception do
- if Assigned(FOnException) then
- FOnException(E)
- else
- raise Exception.Create('SQL語句出錯:' + sLineBreak + SQLString.SQL);
- end;
- end;
- Free;
- end;
- end;
- procedure TBatchSQL.LoadFromFile(const FileName: string);
- var
- SqlStr,Tmp:string;
- F:TextFile;
- SQLString:TSQLString;
- begin
- Assert(FileExists(FileName),'SQL文件不存在,不能加載.');
- AssignFile(F,FileName);
- Reset(f);
- Repeat
- Readln(F,Tmp);
- if Tmp='GO' then
- begin
- SQLString:=TSQLString.Create;
- SQLString.Append(SqlStr);
- FSQLList.Add(SQLString);
- SqlStr:='';
- Tmp:='';
- end;
- SqlStrSqlStr:=SqlStr + Tmp;
- Until eof(F);
- Closefile(F);
- end;
- end.
【編輯推薦】