在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;
|