ClientDataSetT1.close;
ClientDataSetT1.Append;
ClientDataSetT1.CommandText := 'update T_message set num=10 where carid='''+LabeledEdit10.Text+'''';
ClientDataSetT1.post;
ClientDataSetT1.open;
ClientDataSetT1.ApplyUpdates(-1);
請問如何,到底如何用Cilentdataset 進行資料庫更新! ·這種方法報錯,說clientdateset close! ~
uj5u.com熱心網友回復:
我是直接用executeClientDataSetT1.close;
//ClientDataSetT1.Append;
ClientDataSetT1.CommandText := 'update T_message set num=10 where carid='''+LabeledEdit10.Text+'''';
{ClientDataSetT1.post;
ClientDataSetT1.open;
ClientDataSetT1.ApplyUpdates(-1);}
ClientDataSetT1.execute;
uj5u.com熱心網友回復:
這個是百年前的問題了,現在還會有人在問cds.CommandText := '';
對應的是
cds.Execute;
這時沒必要執行什么 open, close 操作,只要你設有 datasetprovider 就可以執行,當然 datasetprovider 中是有 options (poAllowCommandText) 要允許執行 command text 的
.commandtext 是不好的,不安全的方式,三層中應盡量避免使用 sql 在客戶端
.正確的方式是
cds.append();
cds.FieldByName('').Asxxx := xxx;
...
cds.Post();
cds.ApplyUpdates(-1);
就可以更新到資料庫,其中對應更新的方式在 DataSetProvider中 UpdateMode 屬性,也是百年前的問題,對應有3種方式, 簡單說就是產生的 update sql 陳述句中 WHERE 的內容
.upWhereKeyOnly
只使用指明的 key 被放在 WHERE 中
這個要在 Provider.DataSet 這邊的欄位上加 ProviderFlags 中 pfInKey
.upWhereChanged
指明的 key 被放在 WHERE 中, 并且有改動的欄位也會被放在 WHERE 中
.upWhereAll
所有的欄位都會被放在 WHERE 中
UpdateMode 是一個非常重要的屬性,確常常被介紹的,教學的,提升的之類的書忽略,它保證了資料的可靠性
.比方表 a 中有 k, f1, f2..., 其中 k 為主鍵,兩個用戶在一個非常接近的時間內更新了表a
發生的情況為
upWhereKeyOnly 后一個用戶改的內容為準, 后一個人會覆寫前一個人的操作
upWhereChanged 兩個人改的內容都可以被應用,只要他們改的欄位不一樣
upWhereAll 前一個用戶改的內容為準,后一個人改動會失敗, 產生 'record not found' 例外
.這類情況在所有的資料庫設計中都是存在的, 包括 c/s 方式的資料庫, 因為,你看到資料時,它已經不是實時的了.
uj5u.com熱心網友回復:
頂一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137889.html
標籤:數據庫相關
上一篇:UniDac 4.6.12 Xe2 多表更新出現錯誤
下一篇:PerlRegEx bug 嗎?
