delphi SQL查询并显示
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi SQL查询并显示相关的知识,希望对你有一定的参考价值。
有个问题请教一下,我用delphi,ADOQuery连接数据库,因为程序前面做了很多东西,都用的是stringGrid,代码也写了很多,现在想添加一个功能,可以用stringGrid显示数据库里面的内容,数据库表kaoqin,里面字段
姓名 性别 上班 下班
现在写入数据库已经可以写入了,那么如果我要查看,怎么查看,我的数据库是Access的,不知道能否用stringGrid实现,如果可以,怎么实现,请贴出代码,谢谢.
Delphi数据库处理
第一节 BDE、ADO、InterBase和dbExpress
Delphi中处理数据库主要有两种方法,也就是BDE、ADO,从Delphi
6.0开始还加入了一种dbExpress方法。 另外,Delphi还提供了专门处
理Borland 公司自己的数据库产品InterBase 数据库的专门的方法。
BDE(Borland Databas Engine), 是Delphi中最古老的技术,从
delphi 2.0加入BDE 技术以后,一直是Delphi处理数据库的事实上的标
准。BDE 是一个基于驱动程序的体系结构,每一种数据格式或数据源都
有一种驱动程序来驱动相近的数据源。BDE 可以很好的支持现在最流行
的ODBC API方法,
ODBC是一种C/C++ 应用程序编程接口(API ),无论是对任何一种
客户/ 服务器关系型数据库管理系统(RDBMS ),还是最流行索引顺序
访问方法(ISAM)数据库(Jet、Foxpro), 都能很好的访问。
同时,由于BDE 的驱动程序主要直接来自于第三方开发商,所以,
对于像Oracle这些非微软的数据库,执行效率上比较高。正是这些特点,
使BDE 技术还是得到了很多数据库开发程序员的欢迎。
ADO 技术是微软提出来的处理关系型数据库和非关系型数据库的新
技术,它基于微软被称为OLE DB的数据访问模式,它是专门为了给大范
围商业数据源提供访问而设计的,包括传统的关系型数据表、电子邮件
系统、图形格式、Internet资源等。ADO 所需内存更少,更适合大流量
和大事务量的网络计算机系统。
ADO 顶层有三个对象:Connection、Command、Recordset。
Connection用以指定数据源,建立和数据源的连接。
Command 对象用以对数剧源执行指定的命令,可以接受SQL 语句,
表和存储过程的名称,执行SQL 查询,更新数据,插入纪录等。
Recordset 对象表示的是来自表或命令执行结果的记录全集,操纵
来自提供者的几乎所有数据。
由于ADO 技术的迅速普及,从Delphi 5.0 开始,加入了ADO 技术
的模块,并逐步成为Delphi数据库设计的主流。但是,和VB的ADODC 相
比,它还是有所不同的,在数据绑定上,它更多的吸收了BDE 的特点,
以做到和原来的程序兼容,同时,它又可以接受标准ADO 技术的各种属
性和方法,在接受这些属性和方法时,它是和数据绑定控件脱离的,当
然从某种意义上来说,这种方案提高了执行效率,给设计人员以更多的
选择。
dbExpress 是Delphi 6.0加入的最新的数据库模块,它不使用缓存,
可以快速浏览大量的数据,但是,不使用缓存就不能更改,所以它的标
准方式是只读的。它一个重要的特点是交叉平台,可以和Linux 数据库
连接,速度相当快。
下面的讨论,将以ADO 技术为主线,最后再说明BDE 和dbExpress
的应用方式。
第二节 ADO 面板的主要组件
ADO 面板一共有7 个组件:
ADOConnection: 主要用于建立数据库的连接;
ADOdataSet:ADO 提取和操作数据库的主要数据集,可以直接连接
到数据库,也可以通过 ADOConnection连接到数据库。
ADOtable:主要用以操作和提取单个基表的数据,可以直接连接到
数据库,也可以通过 ADOConnection连接到数据库。
ADOquery:通过SQL 语言提取数据,其连接数据库的方式和前两种
一样。
ADOStoredProc: 这个组件专门用于运行数据库中的存储过程。
ADOCommand:该组件用于运行一些SQL 命令,这个组件可以和支持
数据集的组件一起使用,也可以直接从一个基表中提取一个数据集。
RDSConnection: 一个进程或一台计算机传递到另一个进程或计算
机的数据集合。
为了连接数据绑定控件,上述组件往往要和处于Data Access 中的
Datasource配合使用。
可以看出,和VB的ADODC 不同的,Delphi中解决同一个问题提供了
多种方案,看起来似乎增加了麻烦,但是却可以给程序员更大的自由空
间,便于设计出高效率的数据库程序来。
下面通过几个例子来说明ADO 控件的用法。
第三节 ADOtable组件
ADOtable、ADOdataSet、ADOquery和ADOStoredProc都继承了同一
个父类TCustomADODataSet,所以,在属性事件和方法上有很多相似的
地方,但它主要是针对数据库中的表进行操作。
ADO -〉ADOtable
属性:
Name=\'控件名\'
ConnectionString=\'连接字符串\'
可以通过点击右边的按钮,通过向导建立数据源。有时候需要
知道相对路径,可以用下面的方法找到程序当前的路径:
tpath:=ExtractFilepath(Application.Exename);
文件名:=Tpath+\'..\\data\\Test.mdb\'
表明数据库在当前程序上一层的Data文件夹下。
TableName=\'表名\'
Active=true
这就激活了数据源,为了和绑定控件联系,要增加一个DadaSource
控件。事实上,所有的绑定控件都是和DadaSource联系。
Data Access-〉DadaSource
属性:
Dataset=ADOtable.Name
加入绑定控件:
Data Controls-〉
DBgrid(表格)
属性
DadaSource=\'DadaSource.Name\'
DBNavigator(导航条)
属性
DadaSource=\'DadaSource.Name\'
运行一下可以看出关系
下面介绍一下ADOtable的一些重要的方法,这些方法大部分和Table
是兼容的。
为了便于叙述,ADOtable控件的Name定为 ADOtable1
1)移动指针
第一个: ADotable1.First;
最后一个: ADotable1.Last;
下一个: ADotable1.Next;
前一个: ADotable1.Prior;
2)从字段中取出数据
通过如下方法可以访问字段的值
ADOtable1.FieldValues[\'字段名\']
ADOtable1.Field[索引值]
在读写字段的时候,又是根据需要可以加上强制类型转换
例如:
Edit1.text:=ADOtable1.Field[0].AsString;
用下面的方法可以去除字段的性质:
ADOtable1.fielddefs[索引值].name; 字段名
ADOtable1.fielddefs[索引值].Size; 字段大小
ADOtable1.fielddefs[索引值].Datatype; 字段属性
3)修改数据:
修改数据的时候,需要先建立EDIT方法,然后用Post方法才能真
正的写入。
ADOtable1.edit;
ADOtable1.FieldValues[\'姓名\']:=\'王秀琴\';
ADOtable1.post;
4)增加一条空纪录: ADOtable1.append;
新增纪录也可以用如下方法,在新增纪录的同时输入数据
ADOtable1.appendRecord(xxx,xxx,xxx,....);
5)删除当前纪录:ADOtable1.delete;
如果在ADOtable1的OnBeforeDelete方法中写下:
if messagedlg(\'确实要删除吗?\',mtinformation,[mbyes,mbno],
0)=mrno then abort();
可以实现删除前的提示。
6)过滤
可以用如下的方法实现数据的过滤
在ADOtable1的OnFilterRecord方法中写下:
Accept:=(条件);
然后
ADOtable1.filtered:=true; 为实现过滤。
ADOtable1.filtered:=false; 为解除过滤。
7)指针在文件的头尾
指针在最后一条记录之后 ADOtable1.Eof
指针在第一条记录之前 ADOtable1.Bof
如此可以实现对数据库的遍历
form1.ADOtable1.first;
while not form1.ADOtable1.eof do
Begin
.......
form1.ADOtable1.next;
End;
8)此外, ADOtable组件还继承了ADO 中的RecordSet对象几乎
全部属性和方法,简述如下:
with adoTable1.Recordset do
begin
//属性
PageSize 一页所包含的记录数
PageCount 数据的页数
AbsolutePage; 当前记录所在页
AbsolutePosition; 当前记录的序号位置
BOF; 指针在第一个记录之前
EOF; 指针在最后一个记录之后
//方法
AddNew fieldList,Values; 创建新记录,其中fieldList为用数
组表示的字段名集,Values为用数组表
示的数据集。
Cancel; 取消上一步所作的修改
Update Fields,Values; 保存对当前记录所作的修改
Delete; 删除当前记录
Move(n); 移动n 条记录
MoveFirst; 移动到第一条纪录
MoveLast; 移动到最后一条纪录
MoveNext 移动到下一条纪录
MovePrevious 移动到上一条纪录
Requery; 通过从新执行对象所基于的查询,以
更新RecordSet 对象中的数据。
end;
使用Recordset 对象来处理数据集的数据,会发现数据帮定控件的指
针一般不会跟着移动,这实际上给设计者提供了另一个在后台快速处理数
据的方法。
附录:关于TActionList控件的使用
在Standard面板,提供了一个TActionList 控件,它集中了大部分按
钮的使用方法,可以简化按钮的设计。
方法:
调入TActionList,双击,可以看到一个面板,右键 -〉New Standard
Action 选择 Datasat下的适当的控制,可以选择多个。
以后加入的开关,只要在属性Action 中选择适当的项目就可以了,不
需要专门编程,实例见“ActionList应用”。
第四节 ADOQuery组件
和ADOtable组件一样,ADOquery继承了同一个父类TCustomADODataSet,
所以,上面说到的ADOtable属性事件和方法基本上是通用的,但它主要是
针对数据库中的SQL 命令进行操作。
下面主要说一下ADOquery特殊的地方。
1)SQL 属性
SQL 是TStrings类型的属性,包含了ADOquery组件要执行的SQL 命令,
是ADOquery最为重要的属性之一。
在应用程序中,需要调用Open方法或者ExecSQL 方法来执行在SQL 中
的命令。在设计阶段,可以利用属性编辑起来编写。
例如:
Width ADOquery do
Begin
//重新写入时,要关闭原来的查询
Close;
width SQL do
Begin
//因为Add是在原来的基础上加入,所以先清除原来的SQL命令
Clear;
Add(\'selsct 编号,姓名,奖金\')
Add(\'From 奖金表\')
End;
//执行SQL 命令
Open;
End;
查询命令也可以这样来写:
s1:=\'编号\';
s2:=\'姓名\';
s3:=\'金额\';
with ADOquery1 do
begin
sql.Clear;
SQL.Add(\'select \');
SQL.Add(s1+\',\'+s2+\',\'+s3);
SQL.Add(\' From 奖金 \');
execsql;
active:=true;
end;
效果是一样的。
第五节 ADOConnection 和 ADODataSet
虽然ADOTable和ADOQuery组件可以非常简单的连接数据库,但是当需
要更加精细的控制数据库的时候,往往需要应用ADO 更多的方法,我们知
道,支撑ADO 的主要由Connection,Command,Recordsrt三个对象组成,
对应的就有ADOConnection和ADOCommand控件,而Recordsrt对象属性和方
法,封装在ADODataSet中,同时ADODataSet本身,也具备和ADOtable组件
相同的对数据绑定控件控值的属性和方法。
这就大大提高了对数据库的控制能力。
在ADO 顶层有三个对象中Connection处在最顶层,用以指定数据源,
建立和数据源的连接。所以,ADOConnection必须和其它的数据控件连接
才有效,最常用的就是和ADODataSet配合。
下面首先介绍连接方法,然后再讨论其它的问题
1)ADOConnection的加入和连接
加入ADOConnection
属性:ConnectionString=\'连接字符串\'
加入ADODataSat
属性:Connection=\'ADOConnection1\' ..... (ADOConnection,Name)
CommandType=cmdtable ...使用表连接
CommandText 根据上面的选择,或选择表,或出现SQL 编辑框。
Active=True 激活。
加入DataSource
属性:Dataset=ADODataSat 完成连接,再连接数据绑定控件。
2)ADOConnection的重要属性和方法
属性:
a).Attributes
设置连接的数据库自动处理事务的能力
xCommitRetaining:提交一个事务后自动开始一个新事务
xAbortRetaining :回退一个事务的同时开始一个新事务
b).Connected
标识和数据库的连接受否处于激活(True)
方法:
c).Open(UserID,PassWord)
打开一个连接(可以提供用户名和密码)
d).Cancel
关闭数据库的连接
e).Close
释放所有的系统关联资源
f).Execute 执行一个SQL 命令。
完整的表述是
Execute(SQL命令,该命令设计的记录数目,Option)
其中,Option的值如下
eoAsyncExecute 异步执行指定的命令
eoAsyncFetch 给定Cache属性的值后,再异步的取得数据
eoAsyncFetchNonBlocking 非阻塞式线程执行
eoExecuteNoRecords 没有返回纪录
g).GetProcedureNames(List:Tstring);
获取数据库服务器上的存储过程名称,过程名保留在List参
数中。
f).GetTableNames(List:Tstring;SystemTables:Boolean=False)
获取数据库的数据表,表名存放在List参数中,SystemTables
指示是否获取数据库系统表的名称,系统表是关于数据库类型定义
和用户信息的数据表,是数据库本身自动产生的。在特殊的设计中,
这个表格可能会有用。
3)ADODataSet的属性和方法
我们在ADOTable中讨论的属性和方法,几乎都可以在ADODataSet中得
到应用,但还有几个特殊的属性:
CommandType
主要用于控制CommandText属性的状态,其中:
cmdtable ...CommandText使用“表名”连接
(内部是做了SQL 对各列的查询);
cmdTableDirect ...CommandText使用“表名”连接
(内部不做SQL ,而是真正的表名连接);
cmdtext ....使用SQL命令文本;
cmdfile ....CommandType属性值作为持久的文件名;
cmdStoredProc...CommandType属性值作为存储过程名称
来计算;
cmdUnKnown ....不知道(默认为SQL)
CommandText
根据CommandType的设置,向提供者发出“表名”或SQL 命令。 参考技术A stringgrid.rows:=adoquery.recordcount;
while not adoquery.eof
begin
stringgrid.cells[0,stringgrid.row]:=adoquery.fieldbyname('姓名').asstring;
stringgrid.cells[1,stringgrid.row]:=adoquery.fieldbyname('性别').asstring;
stringgrid.cells[2,stringgrid.row]:=adoquery.fieldbyname('上班').asstring;
stringgrid.cells[3,stringgrid.row]:=adoquery.fieldbyname('下班').asstring;
adoquery.next;
end;
就可以实现了 参考技术B 有点不太明白,你是想把adoquery1中flashname字段的值自动赋给combobox1吧?
定义一个变量:var
i:integer;
combobox1.clear;
adoquery1.first;
if
combobox1.items.indexof(adoquery1.fieldvalues['flashname'])
then
//此处为避免combobox1中出现重复
begin
for
i:=0
to
adoquery1.recordcount-1
do
begin
combobox1.items.add(adoquery1.fieldvalues['flashname']);
adoquery1.next;
end;
end;
combobox1.text:=combobox1.items[0];让text中显示第一个值. 参考技术C //初始化stringgrid
procedure TF_wgsss.FormActivate(Sender: TObject);
begin
StringGrid1.ColWidths[0]:=35;
StringGrid1.ColWidths[1]:=200;
StringGrid1.ColWidths[2]:=160;
StringGrid1.ColWidths[3]:=160;
StringGrid1.Font.Size :=12;
StringGrid1.Cells[0,0]:='姓名';
StringGrid1.Cells[1,0]:='性别';
StringGrid1.Cells[2,0]:='上班';
StringGrid1.Cells[3,0]:='下班';
end
procedure TF_wgsss.SpeedButton1Click(Sender: TObject);
var i,k:integer;
ado:TADOQuery;
begin
dm.con;
ado:=Tadoquery.Create(self);
ado.Connection:=conn;
with ado do
begin
close;
sql.Clear;
sql.Add('select * from kaoqin');
open;
end;
if ado.RecordCount =0 then
begin
for k:=1 to StringGrid1.RowCount-1 do
for i:=0 to 3 do StringGrid1.Cells[i,k]:= '';
StringGrid1.RowCount:=2;
exit;
end;
ado.First;
stringgrid1.RowCount:=ado.RecordCount +1;
for i:=1 to ado.RecordCount do
begin
stringgrid1.cells[0,i]:=ado.fieldbyname('姓名').asstring;
stringgrid1.cells[1,i]:=ado.fieldbyname('性别').asstring;
stringgrid1.cells[2,i]:=ado.fieldbyname('上班').asstring;
stringgrid1.cells[3,i]:=ado.fieldbyname('下班').asstring;
ado.Next;
end;
ado.Free;
conn.Free;
end;本回答被提问者采纳 参考技术D 自己控制啊,读一条显示一条
偷懒的话用 DBGRID
以上是关于delphi SQL查询并显示的主要内容,如果未能解决你的问题,请参考以下文章