在Delphi中動態地使用SQL查詢語句
在一般的數據庫管理系統中,通常都需要應用SQL查詢語句來提高程序的動態 特性。下面介紹如何在Delphi中實現這種功能。 在Delphi中,使用SQL查詢語句的途徑是:在窗體中置入TQuery構件,設置其 SQL屬性的內容值,此內容為一個字符串數組,數組的每個值對應一行SQL查詢語句。 可以在程序設計過程中事先指定,也可以在程序運行中重新賦值,即可以實現動態 地改變程序中的查詢語句。假定程序的窗體中有一個名為Query1的TQuery構件,在 程序運行過程中需要改變它的SQL查詢語句內容,則可以引用以下程序行。 Query1.close; {先關閉以前查詢的連接} Query1.SQL.Clear; {清除以前的查詢語句} Query1.SQL.Add('select * from mytable'); {增加新的查詢語句內容為select * from mytable} Query1.Prepare; {發送查詢到Borland Database Engine (BDE)} Query1.open; {建立新的查詢語句的數據庫連接} 在Delphi中,要靈活地使用SQL查詢語句,還需要使用TQuery構件的Params特性, 即在查詢語句中使用參數。Delphi中的SQL語句如需參數,則在參數名稱前使用一個 冒號':'來作為標識。例如:'select * from mytable where id_no=:p'一句,其中 p為參數,可以在程序運行過程進行在賦值。在程序運行期動態地創建帶參數的SQL 查詢語句較為復雜,其過程如下: Query1.close; {先關閉以前查詢的連接} Query1.SQL.Clear; {清除以前的查詢語句} Query1.Params.Clear; {清除以前查詢語句的參數} Query1.Params.CreateParam(ftString, 'p',ptInput); {創建新的查詢語句的參數p} Query1.SQL.Add('select * from title1 where NO_GLOBE=:p'); {增加新的查詢語句內容為select * from title1 where NO_GLOBE=:p} {其中p為新建的參數} Query1.ParamByName('p').asstring:= '1'; {給新的參數賦值為'1'} Query1.Prepare; {發送查詢到Borland Database Engine (BDE)} Query1.open; {建立新的查詢語句的數據庫連接} 以上兩個示例中,SQL查詢語句都是SELECT語句,而當SQL語句是UPDATE或INSERT、DELETE時,其中的Query1.Open需要改為Query1.ExecSQL。 4、動態SQL應用實例介紹 下面給出一個完成動態SQL查詢、批記錄移動的數據庫程序。程序從數據庫my_database的表TITLE_L.DBF中選取符合要求日期的記錄,並批量移動到同一個數據庫的表my_table.dbf中。 {指定所要連接的數據庫別名} Database1.AliasName:='MYDATABASE'; Database1.DatabaseName:=my_database; Database1.connected :=True; {指定目標表是Table1} Table1.DatabaseName:= ' my_database'; Table1.TableName:= ' my_table.dbf'; Table1.Active:=True; {指定源數據的內容對應查詢Query1} Query1.DatabaseName:= ' my_database'; Query1.close; {程序運行時動態添加SQL查詢語句} Query1.SQL.Clear; Query1.Params.Clear; Query1.Params.CreateParam(ftInteger, 'update',ptInput); Query1.Params.CreateParam(ftInteger, 'dndate',ptInput); Query1.SQL.Add('SELECT* FROM TITLE_L'); Query1.SQL.Add('where LET_DATE<=:update'); Query1.SQL.Add('AND LET_DATE>:dndate'); Query1.SQL.Add('ORDER BY NO_LOCAL'); Query1.Prepare; Query1.Params[0].asInteger:=Up_Date; Query1.Params[1].asInteger:=Down_Date; Query1.open; Query1.Active:=True; {用DBGrid1來顯示將要移動的記錄} DataSource1.DataSet:= Query1; DBGrid1.DataSource:= DataSource1; {進行批量記錄移動} BatchMove1.Mode:=batAppend; BatchMove1.RecordCount:=0 BatchMove1.Source:=Query1; BatchMove1.Destination:=Table1; BatchMove1.Execute; |