delphi关联两条记录设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi关联两条记录设置相关的知识,希望对你有一定的参考价值。

今天终于把纠缠了几天的问题改完了,说到底只是一个很小的问题,就是ADOQuery的一个小属性。

把控件DBGridEh的一列的checkbox设为true,将其绑定DataSourceA和DOQuery。用Button添加了一个事件,用来取消对checkbox的操作:ADOQuery.CancelBatch();可是只能取消最后一步的操作。检查了很长时间才发现在DBGridEh的DataSource的Dataset 下的LockType的属性设置问题,我设置成了:ItOptimistic 后来将此属性改为:ltBatchOptimistic 就可以了

在网上查了一下,有如下说法:

1.ADOQuery.Update;ADOQuery.Delete;不用设置属性.
2.locktype指定用户打开数据集时对数据集的锁定级别:
ltUnspecified 未指定锁定级别
ltReadOnly Read-only 只读
ltPessimistic 记录级别(该记录被编辑时其它用户不能用)
ltOptimistic 独立模式(与原来结果集对照,如果在此期间其它用户修改了结果,则你的结果不能保存)
ltBatchOptimistic 批量模式(使用缓存,进行批量提交)

ADOQuery的属性含义:

ltUnspecified 不特别指定
ltReadOnly 选出来的资料表只能读,无法写入
ltPessimistic 选出来的资料表可以写入,当改记录写入时会立刻写入并锁定
ltOptimistic 选出来的资料表可写入,当该记录表写入时不会立刻写入但会锁定,当执行updates时才正式写入改记录
ltBatchOptimistic 选出来的资料表可写入,当该记录写入时不会立刻写入但会锁定,当执行updates才正式整批写入该记录(可以修改多条整批update)

二、

Delphi中的ADOquery 用法

都知道Delphi在数据库操作是非常好用的,delphi把ADO一些方法属性都集成了,以下是我的一些总结:
***************************************
通过sql的存储过程来实现:
添加
With ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(' Insert Into Table1(Field1,Field2)')
SQL.Add(' Values(10,20)');
ExecSQL;
end;

修改
With ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(' Update Table1 Set Field1=20,Field2=30)')
ExecSQL;
end;

删除
With ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(' Delete From Table1')
SQL.Add(' Where Field1=20 and Field2=30');
ExecSQL;
end;

查询
With ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(' Select Field1,Field2 From Table1')
SQL.Add(' Where Field1=20 and Field2=30');
Open;
end;

***************************************************
通过Delphi自有的方法属性实现:

添加:
with ADOQuery1 do
append;
......
post;
删除:
with ADOQuery1 do
delete(选择删除的记录); //默认删除记录指针指向的记录
修改:
with ADOQuery1 do
edit;
......
post;

adotable1.Append; //添加
ADotable1.Fields.FieldByName('gxid1').Value:=gx;
adotable1.Post;

adotable1.delete; //删除

adotable1.edit; //修改
ADotable1.Fields.FieldByName('gxid1').Value:=gx;
adotable1.post;

WITHI adoquery do
begin//添加
adoquery.open;//motice set adoquery.sql
adoquery.append;//OR adoquery.insert;
fieldbyname(fieldname).asstring:=trim(edit1.text);
......
adoquery.post;
end;

删除:
adoquery.delete

修改:
adoquery.edit;
fieldbyname(fieldname).asstring:=trim(edit1.text);
有关细节可以参看帮助OR DEMO

三、

ADOQuery的几个事件:

procedure ADOQuery1_BeforePost ( DataSet : TDataSet);

begin

end;

是在ADOQuery1或者相关联的DataSource的数据集改动后,在将改动保存到内存之前激发的事件,上次使用这个事件是用来判断修改之后的数据是否规范,如果不规范,就给出提示

示例如下: 要修改的列关联的Column 是Score

procedure ADOQuery1_BeforePost ( DataSet : TDataSet);】

var

score:string;

begin

score:=DataSet.FieldByName(‘score’).AsString; // 提取修改之后的数据

if (‘score不符合规则’) then

self.msgWarning(‘’输入的数据有错);

end;

procedure ADOQuery1_AfterScroll (DataSet: TDataSet);

begin

end;

是在点击与ADOQuery1相关联的DBGridEh1中的记录后激发的事件,可以用来做两个DBGridEh控件的关联事件。

如:点击DBGridEh1 中的记录1,在DBGridEh2中就显示记录1的详细信息(DBGridEh2与ADOQuery2相关联),(示例如下:

procedure ADOQuery1_AfterScroll (DataSet: TDataSet);

var

sql : string;

begin

sql:=’select * from tableneme where key=’”+ADOQuery1.fieldbyname(‘key’).AsString+”’’

ADOQuery2.SQL.Close;

ADOQuery2.SQL.Clear;

ADOQuery2.SQL.Add(sql);

ADOQuery2.SQL.Open;

end;

PS:现在用过这两个事件,以后还会补上其他相应事件。
参考技术A 假设你的表中扣分为int型、宿舍号为int型:
静态写法:select sum(扣分)as kf from 表 where 宿舍号=101
动态写法:select sum(扣分)as kf from 表 where 宿舍号=''%d''
假设你的表中扣分为int型、宿舍号为string型:
静态写法:select sum(扣分) as kf from 表 where 宿舍号='101'
动态写法:select sum(扣分)as kf from 表 where 宿舍号=''%s''

为啥我sql语句用group by老查出两条连续相同的记录?比如本来3条结果,会出现6条。

你显示的数据重复,但是你多表关联的其他字段肯定有不重复的,
如果你想看看就输出的时候打*,自己看一下,肯定有不重复的
如果重复部分是你要的结果,你可以用distinct去重你要的几个字段
参考技术A 几张表关联查询数据的?如果是,看关联字段的准确性。。
是不是缺少关联字段。
参考技术B 语句没有贴出来,别人怎么帮你回答。 参考技术C 多表查询的!你distinct之后看看

以上是关于delphi关联两条记录设置的主要内容,如果未能解决你的问题,请参考以下文章

delphi cxgrid 控件如可实现展开一行记录看其明细

delphi中,怎样设置新窗体打开时,就运行指定的SQL语句

delphi 键盘值

邮件的DNS设置

DELPHI DBgrid显示??

git安装并与远程仓库关联相关配置