UniDAC使用日記
1. UniQuery默認狀態為行提交,使用前根據需要設置readonly或cachedupdates屬性
2. UniQuery.Filter默認大小寫區分,請注意設置FilterOptions屬性([foCaseInsensitive]),TVirtualtable也存在相同情況
3. UniQuery默認情況下,有些varchar類型的字段有自動加了一個空格,請注意設置Options.TrimVarChar=true
4. UniQuery在進行Insert時,若字段不能為null且前台操作未填寫時,可能會報錯,請設置RequiredFields=true
5. UniQuery在修改數據集時,默認的方式是按關鍵字生成SQL語句進行數據提交。還有另外兩種方式:一是設置updateSQL,一是設置KeyFields(具體請sql跟蹤查看)
6. UniQuery的數據排序屬性是IndexFieldNames
7. 數據提交的順序,一定要注意:
with MyQuery do
begin
Session.StartTransaction;
try
... {Modify data}
ApplyUpdates; {try to write the updates to the database}
Session.Commit; {on success, commit the changes}
except
RestoreUpdates; {restore update result for applied records}
Session.Rollback; {on failure, undo the changes}
raise; {raise the exception to prevent a call to CommitUpdates!}
end;
CommitUpdates; {on success, clear the cache}
end;
對於單數據集的提交:
MyQuery. ApplyUpdates;
MyQuery. CommitUpdates;
8. DataM中提供了一個功能Clone(Source, Dest):一、Dest是TVirtualTable,則完整的將源數據集復制;二、Dest是UniQuery,則是將Source的SQL復制到Dest,並Open
9. UniQuery.SetReadOnly屬性說明
1) 我們經常會用到多表關聯,且需要在前台修改數據。舉個例子:a表和b表,在前台兩個表字段都需要修改,則需要將SetReadOnly設置成false
2) 特別注意:若將一個UniQuery.SetReadOnly設置成true,而這個表有一個自增長ID,那么你在提交數據時會出錯,跟蹤SQL會發現,ID被前台前行傳了一個null值
10.UniQuery. RefreshRecord,可以刷新當前選擇的數據
11.我們經常會在UniQuery的SQL定義一些參數,在傳參時,需要特別注意,例如:
QExec.Close;
QExec.SQL.Text:= ‘select * from YHB where sYHBH=
_YHBH’;
在傳參時有兩種寫法
1)最穩妥的寫法
QExec. ParamByName(‘P_YHBH’).DataType:= ftString;
QExec. ParamByName(‘P_YHBH’).ParamType:= ptInPut;
QExec. ParamByName(‘P_YHBH’).AsString:= ‘張三’;(此處可將AsString換成Value)
2)下面這個寫法我做了簡單測試,也是可以的,但對復雜的SQL傳參是否正確,未知
QExec. ParamByName(‘P_YHBH’).AsString:= ‘張三’;(在不對參數的數據類型和傳入傳出類型進行指定的情況下,絕對不能使用Value)
在ADOUniDAC的過程中一定要注意,在DataM中提供了一個函數PrepareParam,請注意看一下。
12.Sybase的一個特性
update a set a.fSJ=b.fSJ
from table1 a join table2 b on a.sYPBSM=b.sYPBSM
上述SQL語句在Sybase下執行不能通過,請改寫成如下SQL(在MS和ASE中都能執行通過)
update table1 set fSJ=b.fSJ
from table1 a join table2 b on a.sYPBSM=b.sYPBSM
