注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

鑫淼梦园的博客

圆你的梦想 从这里开始

 
 
 

日志

 
 

delphi通过format()函数设计动态sql语句  

2014-09-14 09:43:52|  分类: delphixe7 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

作者:[美国] Steve Teixeira 
改编: doomtoo0(红羽) 

动态sql是指在运行过程中根据不同的情况来修改的sql语句。delphi中TQuery的sql属性编辑器可输入静态的sql语句,当然您可以这样写: 
select *from CUSTOMER where COUNTRY=:abcdef; 
这样您就可以传参数值实现动态sql查询了。 

对于参数化查询来说,delphi可供的方法很多,列如通过params特性或params特性编辑器提供参数值、调用ParamByName()方法提供参数。 

下面两个sql语句似乎是都是对的: 
SELECT *FROM PART ORDER BY:ORDERVAL; 
SELECT *FROM:TABLENAME; 
不幸的是,您无法改变sql语句的字段名和表名,那么,如何使sql语句具有灵活性?这里介绍format()函数来构建sql语句。 
如果您有C或C++编程的经验,您会发现,format()函数与C中的print()函数很相似. 
这里简单介绍format()函数,详细说明请查阅帮助。 

使用format()来自定义字符串,需要指定格式化子句。格式化子句指明在一个给定字符串的何处插入特定类型的字符串。格式化子句是由一个百分比符号%和一个类型符组成的。下面列出了一些类型符: 
c 字符类型 
d 整数类型 
f 浮点类型 
p 指针类型 
s 字符串类型 
请看下面的例子: 
s:=format(‘My name is %s and I‘m %d years old.‘,[‘Xavier‘,32]); 
有两个格式化子句。%s表示此处插入一个字符串,%d表示此处插入一个整数。 
format()函数用一个参数数组给出要替换的值,然后返回结果字符串。 

这样,象前面列举的两个sql语句,要构造字段名和表名可变的sql语句,您就可以使用format()函数。 

下面给出程序代码(指定字段排序),在type段有程序用到的控件,table1对应与PARTS.DB表。

unit MainFrm; 

interface 

uses 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
Grids, DBGrids, DB, DBTables, StdCtrls; 

type 
TMainForm = class(TForm) 
dbMain: TDatabase; 
lbFields: TListBox; 
tblParts: TTable; 
dsParts: TDataSource; 
dbgParts: TDBGrid; 
qryParts: TQuery; 
lblFields: TLabel; 
procedure FormCreate(Sender: TObject); 
procedure lbFieldsClick(Sender: TObject); 
private 
{ Private declarations } 
public 
{ Public declarations } 
end; 

var 
MainForm: TMainForm; 

implementation 

{$R *.DFM} 

procedure TMainForm.FormCreate(Sender: TObject); 
//将字段名列到列表框中 
begin 
{ Retrieve a list of field names from the PARTS.DB table so that 
the use can select the field on which to sort the query. These 
fields names are placed into a TListBox. } 
tblParts.Open; 
try 
tblParts.GetFieldNames(lbFields.Items); 
finally 
tblParts.Close; 
end; 
end; 

procedure TMainForm.lbFieldsClick(Sender: TObject); 
{ 使用format()函数指定排序的字段} 
{ Define a constant string from which the SQL string will be built } 
const 
SQLString = ‘SELECT * FROM PARTS ORDER BY %s‘; 
//定义一个常量字符串以供sql语句使用. 
begin 
with qryParts do 
begin 
Close; // Make sure the query is closed. 
SQL.Clear; // Clear any previous SQL statement. 
{ Now add the new SQL statement constructed with the format 
function } 
SQL.Add(Format(SQLString, [lbFields.Items[lbFields.ItemIndex]])); 
//加入用format函数构建的新sql语句. 
Open; { Now open Query1 with the new statement } 
end; 
end; 

end.  



类似情况应该这样处理:delphi xe7 FireDAC中测试通过
以动态字段模糊查询实例:【本博作者:鑫淼梦园】写于2014-09-14 上午10:27分
var
  findname:String;//动态字段

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  Label2.Caption := '按【' + Column.Title.Caption + '】查询';
  findname := Column.Title.Caption;
end;


const
  SQLString = 'SELECT * FROM 已经参保人员 where %s like :value';
//定义一个常量字符串以供sql语句使用.
begin
  with FDQuery1 do
  begin
    Close;
    SQL.Clear; 
    ss := Format(SQLString, [findname]);
    SQL.Add(ss);
    Params[0].Name := 'value';
    Params[0].DataType := ftString;//这里根据具体字段类型更改
    Params[0].ParamType := ptInput;
    params.ParamValues['value'] := '%' + Edit1.Text + '%';
    Open; 
    Label1.Caption := '共有 ' + IntToStr(RecordCount) + ' 人';
  end;
  评论这张
 
阅读(221)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017