【Delphi學習】ADOQuery 用法


一、

ADOQuery的LockType

今天終於把糾纏了幾天的問題改完了,說到底只是一個很小的問題,就是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:現在用過這兩個事件,以后還會補上其他相應事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM