窗体上有控件:dbgrid,adoconnection,adoquery,adotable,datasource,为什么不能指定不了datasource的dataset属性为adoquery,只能设为adotable
解决方案 »
- 如何让我的窗体程序在什么环境下都在最上层。
- AAFont 平滑特效字体控件包升级需求调查
- 大家来给公司起个名字吧!
- help
- 如何在网页中调用OCX控件中的方法?OCX控件中如何添加方法?
- 在LAN中如何通过A计算机发送时钟对时指令给B计算机,让B的系统时间和A的同步?
- 使用QRPreview.QRPrinter.Load()方法为何总是出现EAccessViolation错误?
- 100分_求购qb
- build的error
- 用了udp控件就不能正常关机,必须先退出使用udp控件的程序,才能正常关机,这是为什么?能解决吗?
- TQuery/TADOQuery怎样获取查询到的distinct值
- 如何使DBGrid可以改变列的大小(即宽度),但不能拖动列的位置呢?
以下几个控件在连接数据库时是用得比较多的,并且通常的的连接架构是————————————————————
数据库
↑
ADOConnection
↑ ↑
ADOCommand ADODataSet
↑
DataSource
↑
DBGrid
————————————————————或者————————————————————
数 据 库
↑ ↑
ADOCommand ADODataSet
↑
DataSource
↑
DBGrid
————————————————————
也就是说,ADOCommand和ADODataSet既可以通过ADOConnection连接数据库,也可以不用,分别直接连接数据库,因为这三个控件都有一个共同的ConnectionString属性。第一种比第二种更节省资源,因为当要使用多个ADOCommand、ADODataSet等控件时,使用第一种连接架构只需将所有这些控件的Connection属性设置(选择)为同一个ADOConnection,这样就只有一个ADOConnection控件与数据库打交道,毕竟连接数据库是一种比较大开销的资源,尽量节省可以提高运行速度。ConnectionString属性的设置很简单。选中要设置这一属性的控件后,再点击其ConnectionString 属性框。如果熟悉的话可以直接在这里输入,但由于这一属性值比较长,所以通常的做法是构建,并且步骤也不多,一目了然:·点击属性框后面的“...”小按钮,出现“连接源”对话框,选中“使用连接字符串”,再点击“构建...” 按钮;
·首先选择“提供程序”。以连接SQL Server 2000 数据库为例,提供程序选择“Microsoft OLE DB Provider for SQL Server”;
·点击下一步;选择或输入服务器名框中,可以输入计算机名,也可使用计算机的IP地址,特别地,如果是单机使用的,可输入一个便于移植使用的IP地址,即指向本机的IP地址“127.0.0.1”;
·登录服务器信息,如果SQL Server 是集成登录的,选中“使用Windows NT 集成安全设置(W)”,然而多数情况下是选中“使用指定的用户名和密码”,并分别输入登录数据库的用户名和密码,通常是sa用户,而且如果是空密码的,可以选中下面的“空白密码”,至于“允许保存密码”,选不选就看个人喜好了;
·“在服务器上选择数据库”,选中所要连接的数据库;
·最后点击“测试连接”,通常会弹出“测试成功”的提示,确定即可。当然,前提是SQL 服务管理器已启动。ADOCommand适合执行无返回结果的SQL语句,如插入、删除、更新等;ADODataSet则用于执行有返回结果的SQL语句,如查询;两都都有一个共同的CommandText属性,用以设置其所要执行的 SQL语句。通常所要执行的SQL语句不是固定不变的,而是在程序运行时根据用户的操作动态生成的。对于ADODataSet,可双击相应按钮(如“提交查询”),在其onClick事件中相应的SQL语句赋值语句,再将ADODataSet的CommandText属性设置为该字符串,最后改变ADODataSet 的Active属性即可,如:sql:='select * from ....'; //其中sql为已定义的String类型变量
ADODataSet1.Active:=false;
ADODataSet1.CommandText:=sql;
ADODataSet1.Active:=true;执行查询操作后,判断查询结果是否为空,如果非空,并且可以确定查询结果是唯一,则可分别直接引用查询结果的各个字段:if (ADODataset1.FieldValues['字段名1']<>NULL) then
//此处的“字段名1”为查询结果中的字段名,即数据库里相应表的字段名
begin
Edit1.Text:=ADODataset1.FieldValues['字段名1'];
//可引用查询结果,分别为各Edit控件的Text属性赋值,使之显示
Edit2.Text:=ADODataset1.FieldValues['字段名2'];
//等等
end而如果查询结果不唯一,也可逐一引用各字段,不过需要稍加修改。而此时最常用的是向下拉框Combobox控件中添加项目,并且通常放在窗体的onShow事件中执行:______________________________________________________________________________unit Unit1; //当前窗体文件名interfaceuses
//.....
type
//……//...procedure TForm1.FormShow(Sender: TObject); //窗体的显示事件
var
i,j:integer; //for循环变量只能是局部变量
sql,item:String //字符串型
begin
//...sql:='select 字段1 from ....'; //通常是查询单个字段
ADODataSet1.Active:=false;
ADODataSet1.CommandText:=sql;
ADODataSet1.Active:=true;j:=ADODataSet1.RecordCount; //j和后面的i定义为整形变量
ADODataSet1.First; //使指针指向(移动到)第一条记录
Combobox1.Items.Clear; //下拉框Combobox1.Items.Add('请选择...'); //添加一个提示项到下拉框项目中
for i:=1 to j do //j为查询结果的记录数
begin
item:=ADODataSet1.FieldValues['字段1'];
//逐一引用当前记录的指定字段值
Combobox1.Items.Add(item); //添加到下拉框项目中
ADODataSet1.Next; //指针移动,指向下一条记录
end;
Combobox1.Text:='请选择...'; //显示提示值
//...end;//...end.
______________________________________________________________________________这样,在程序运行时打这个Form1窗体,该Combobox1下拉框的显示值就为“请选择...”,点击下拉框,其中就会有从数据库中查询出来的各个项目显示出来,以供用户选择。毕竟选择比输入快,而且如果输入的话,还要用户记住其内容,非常不方便。
至于查询有多个返回结果并且查询多个字段的,可以用DBGrid控件以表格形式显示全部查询结果,不过此时需要添加一个DataSource控件,并且将将DBGrid的DataSource属性设置为该DataSource 控件,再将该DataSource的DataSet属性设置为相应的ADODataSet控件,如上面的连接架构所示。对于ADOCommand,稍稍有点不同。因为它是通过Execute方法执行SQL语句的:begin
sql2:='insert into 表1 ......';
//可用于执行insert into,update,delete语句
ADOCommand1.Execute;
showmessage('操作成功。'); //操作完成后给出提示
end如果要使用的ADOCommand、ADODataSet等控件不多时,可以不用ADOConnection 控件,直接使用ADODataSet和(或)ADOCommand控件,只需分别设置其ConnectionString 属性;若要使用多个ADOCommand、ADODataSet等控件时,有一个办法可以节省使用控件的数量:建立一个DataModule窗体,假设窗体名为DataModule1,并将ADOConnection、ADOCommand、 ADODataSet、DataSource等数据库控件建立在该DataModule1窗体中,然后在所有需要使用这些控件连接数据库的窗体中使用该DataModule1窗体。如果该DataModule1 窗体名保存为Unit2文件,则在需要使用这些控件的Uses列表中加入Unit2即可,但在引用时需要在控件名前加上窗体名,如:unit Unit3; //当前窗体文件名interfaceuses
//.....
Unit2; //引用DataModule1窗体的窗体文件名Unit2type
//……DataModule1.ADODataSet1.Active:=false;
DataModule1.ADODataSet1.CommandText:=sql;
DataModule1.ADODataSet1.Active:=true;
//...
Edit1.Text:=DataModule1.ADODataset1.FieldValues['字段名1'];
//...
DataModule1.ADOCommand1.Execute;也就是:如果所使用的控件不是在当前窗体的,而是通过使用窗体引用的,就需要在控件名前加上窗体名。或者可以这样省略窗体名:with DataModule1 do
begin
ADODataSet1.Active:=false;
ADODataSet1.CommandText:=sql;
ADODataSet1.Active:=true;
//...
end
Var StrSQL,Sv:String;
tAdo:TADOConnection;
tQuery: TADOQuery;
Begin
tAdo:=TAdoConnection.Create(nil);
tQuery:=TAdoQuery.Create(nil);; tADO.LoginPrompt:=False;
tAdo.ConnectionString:=MyConnectString; //SQL连接字符串
tQuery.Connection:=tAdo; StrSQL:='select DISTINCT server from mail order by server';
tQuery.SQL.Clear;
tQuery.SQL.Add(StrSQl);
tQuery.Open;
while not tQuery.Recordset.EOF do
Begin
SV:=tQuery.Fields[0].asString;
Form1.ListBox_Server.Items.Append(SV);
tQuery.Next;
end;
tQuery.Close;
tQuery.Destroy;
tAdo.Close;
tAdo.Destroy;
end;
1.dbgrid 。
2.datasource 在data access里面
3.adoquery。
设置 adoquery的connection。可以写语句
也可以放置 adoconnection在ado里面
设置adoconnection的connectstring
设置 datasource的dataset为adoquery1
设置 dbgrid的datasource为datasource1 begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('select * from table');
open;
{
sql.add('insert into table (a,b,c) value(a,b,c)');
execsql;
}
{
sql.txt:='update table set a=a ';
execsql;
}
end;
end;