資料庫的關聯問題 |
尚未結案
|
poorbaby
一般會員 發表:4 回覆:7 積分:2 註冊:2002-08-31 發送簡訊給我 |
我在寫資料庫關聯的時候發現假如兩個關聯性資料表
要儲存上會有問題…我想請問有沒有人有類似的問題
table1,table2--->有一關聯性資料table2引用table1
我的寫法是
new:
table1.insert;
table2.insert; save:
table1.edit;
table1.post;
table2.edit;
table2.post; 當我按save的時候會出現以下這樣的訊息
"Master record missing.
INSERT statement conflicted with COLUMN FOREIGN KEY
constraint 'FK_TABLE2_TABLE1'.The conflict occurred in
database JP,General SQL error."
有人建議我只要做主要的資料表的變動便行了
save:
table1.post;
但是我發現table2的資料仍然沒有寫入資料庫
我試了很多方法…麻煩有人可以告訴我原因
謝謝^^
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
你要把資料寫回這兩個table 因為他們相關聯
所以你不可以分別去insert 這樣會有問題
除非你要先從detail去insert
然後再將Master 做insert
可能你的table1是 Master 另一個做法
你可以將兩個table join 到一個Query
然後搭配UpdateSQL來做
這樣就可以很簡單的把資料寫回這兩個table 回首來時路
也無風雨也無晴~~@.@ 發表人 - T.J.B 於 2002/09/30 10:34:19 發表人 - T.J.B 於 2002/09/30 10:51:48
------
天行健 君子當自強不息~~@.@ |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
poorbaby
一般會員 發表:4 回覆:7 積分:2 註冊:2002-08-31 發送簡訊給我 |
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
|
poorbaby
一般會員 發表:4 回覆:7 積分:2 註冊:2002-08-31 發送簡訊給我 |
|
andersonhsieh
版主 發表:33 回覆:531 積分:439 註冊:2002-06-10 發送簡訊給我 |
你TABLE2.DATASOURCE是不是TABLE1如果是的話在下INSERT以前先將TABLE1和TABLE2的關聯暫時斷掉,等POST後再將關聯連上去,這樣才不會產生MATER有存到資料庫而DETAIL的資料LOST掉的現象,因為一般來說DATASET在存檔後會產生CURSOR移動的事件,而如果MASTER的CURSOR移動時則如果DETAIL不是在BROWSE的狀態下則會被下CANCEL,所以會造成MATER有存到資料庫而DETAIL的資料LOST掉的現象 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@ |
poorbaby
一般會員 發表:4 回覆:7 積分:2 註冊:2002-08-31 發送簡訊給我 |
|
andersonhsieh
版主 發表:33 回覆:531 積分:439 註冊:2002-06-10 發送簡訊給我 |
將TABLE1及TABLE2的CACHEUPDATE設為TRUE
在TABLE1.BEFERINSERT將TABLE2.DATASOURCE設為NIL
在TABLE1的AFTERPOST寫入以下程式碼
Database1.StartTransaction;
try
Table1.ApplyUpdates;
Table2.ApplyUpdates;
Table1.CommitUpdates;
Table2.CommitUpdates;
Database1.Commit;
Table2.DataSource := DataSource1;
except
Database1.Rollback;
end; @@~~飛翔在天際的精靈~~@@ 發表人 - andersonhsieh 於 2002/09/30 14:36:27
------
@@~~飛翔在天際的精靈~~@@ |
poorbaby
一般會員 發表:4 回覆:7 積分:2 註冊:2002-08-31 發送簡訊給我 |
|
andersonhsieh
版主 發表:33 回覆:531 積分:439 註冊:2002-06-10 發送簡訊給我 |
|
peipei36
一般會員 發表:8 回覆:51 積分:16 註冊:2002-03-13 發送簡訊給我 |
因之前未注意到這個主題,造成Ethan兄那篇「【問題】搞不懂CachedUpdates與TUpdateSQL的運用~>_&l」與此篇詢問類似問題...造成不便,請大家見諒! 我雖然不是用Table,而是使用 TQuery+TUpdateSQL,
但仍依andersonhsieh兄您所提的解決方法...
Datasource確實如您所說..不希望它Cursor捲動時,需設Detail.DataSource為nil...
但我發現一個問題...因我的資料表Master/Detail設有關聯(在SqlServer中)..
無論我新增或修改,post(採Database交易)到資料庫時,master table會被鎖死..不知是否我的程式碼有誤?! 可否請大家幫我看看...謝謝!! ==我的資料庫(sql server)========================
定義兩個table(括號內為欄位) => M(field1, field2), D(field1,field3)
全部都是char(5).. ==程式碼========================
(為怕佔用版面..pas,dfm我上傳在這 -> http://kyc.center.kl.edu.tw/~robert/ask_tmp3.zip
程式碼則如下...)
procedure TForm1.bbtnUpdClick(Sender: TObject); begin qryM.Edit; qryD.Edit; end; procedure TForm1.bbtnSAVEClick(Sender: TObject); begin db1.StartTransaction; try qryM.ApplyUpdates; qryD.ApplyUpdates; db1.Commit; qryD.DataSource := dsM; except db1.Rollback; raise; end; qryM.CommitUpdates; qryD.CommitUpdates; end; procedure TForm1.FormActivate(Sender: TObject); begin qryM.Open; qryD.Open; end; procedure TForm1.bbtnInsClick(Sender: TObject); begin qryM.Append; qryD.Append; end; procedure TForm1.qryMUpdateRecord(DataSet: TDataSet; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); begin usqlM.SetParams(UpdateKind); usqlM.ExecSQL(UpdateKind); UpdateAction := uaApplied; end; procedure TForm1.qryDUpdateRecord(DataSet: TDataSet; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); begin usqlD.SetParams(UpdateKind); usqlD.ExecSQL(UpdateKind); UpdateAction := uaApplied; end; procedure TForm1.qryMBeforePost(DataSet: TDataSet); begin qryD.DataSource := nil; end; procedure TForm1.qryMBeforeInsert(DataSet: TDataSet); begin //qryD.DataSource := nil; end;發表人 - peipei36 於 2002/10/01 00:44:39 |
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
依上述程式, 我有下列建議
一.先存Detail, 再存Master, 否則Detail資料會有不見的問題.
二.在Master及Detail之間最好不要用DataSource做為串連介面, 特別是在 qryD.DataSource := nil;
這一句, 會觸發資料感知, 記得會將Detail的內容清空 所以在qryM的語法:Select * From A Where field1 = :field1
在qryD的語法:Select * From A Where field1 = :field1
在qryD的AfterInsert內下 qryD.FieldByName('field1').AsString:=qryM.FieldByName('field1').AsString; 在
procedure TForm1.bbtnSAVEClick(Sender: TObject);begin db1.StartTransaction;
try
qryD.ApplyUpdates;
qryM.ApplyUpdates;
db1.Commit;
except
db1.Rollback;
raise;
end;
qryM.CommitUpdates;
qryD.CommitUpdates;
end; 另外有點依你的欄位而言實在沒有必要使用TUpdateSQL, 希望對你有所幫助.
|
peipei36
一般會員 發表:8 回覆:51 積分:16 註冊:2002-03-13 發送簡訊給我 |
引言: 依上述程式, 我有下列建議 一.先存Detail, 再存Master, 否則Detail資料會有不見的問題. 二.在Master及Detail之間最好不要用DataSource做為串連介面, 特別是在 qryD.DataSource := nil; 這一句, 會觸發資料感知, 記得會將Detail的內容清空 另外有點依你的欄位而言實在沒有必要使用TUpdateSQL, 希望對你有所幫助.感謝Wesly兄幫忙... 1.我採用TUpdateSQL本來目的是為了在 Query.UpdateRecord中利用其他 UpdateSQL或Query,變更其他動到的table.. 2.採用Datasource只是為了偷懶(不然master每滾動一次..detail就得重新 開關一次table..蠻麻煩的..),採用andersonhsieh兄的做法(:= nil)... detail內容清空的問題似乎解決了(master寫入後..detail不隨著scroll)... 但程式可以跑是資料庫「不設關聯」的情況下... 我原想既然使用關聯式資料庫.. 實在沒道理連標準的master/detail都不設關聯.. 全部用程式控制似乎也蠻笨的... 全不設關聯會造成刪除一筆客戶前還得一一檢查是否使用於訂單、銷貨...等多個檔... 不知我這樣想對不對?! 我因為這樣想..資料庫master/detail間設有關聯...造成上述程式碼被鎖住.. 卻不知為啥鎖住?!或者解決方法.. 還請大家幫忙!! 謝謝!! ps.順便一提..因我資料表設有關聯..因此detail需後於master寫入.. ☆另外...我剛在access設關聯測沒問題..是不是sql server(與一般dbms)鎖定比較嚴格...實不知從何著手.. 謝謝大家幫忙...我想我的問題可能來自對TUpdateSQL的運作不大能掌握.. 我把它拿掉..似乎就可以動了..這部份文件好像很少... 我再測測!! 若解決TUpdateSQL會回來報告的...謝謝大家幫忙..受益很多!! 發表人 - peipei36 於 2002/10/02 13:07:39 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |