全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2098
推到 Plurk!
推到 Facebook!

資料庫的關聯問題

尚未結案
poorbaby
一般會員


發表:4
回覆:7
積分:2
註冊:2002-08-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-09-30 09:50:50 IP:202.145.xxx.xxx 未訂閱
我在寫資料庫關聯的時候發現假如兩個關聯性資料表 要儲存上會有問題…我想請問有沒有人有類似的問題 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-09-30 10:30:27 IP:61.220.xxx.xxx 未訂閱
你要把資料寫回這兩個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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-09-30 10:40:11 IP:61.219.xxx.xxx 未訂閱
由錯誤訊息看, 很明顯是parent Table未寫入而先寫child(例如寫入訂單時,內含之客戶編號不存在) 由你的描述若table1為parent則先存table1應為正確,但由於未看到欄位及Relation定義無法確定, 是否Relation定義有問題? save: table1.edit; //無用處? table1.post; table2.edit; table2.post;
poorbaby
一般會員


發表:4
回覆:7
積分:2
註冊:2002-08-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-09-30 11:48:40 IP:202.145.xxx.xxx 未訂閱
我不了解你所說的Relation定義可能有問題 我想請問我是連到mssql(microsoft sql 7.0) 裡面我只是簡單地讓兩個資料表有一關聯欄位 假設我不做關聯的話…兩個資料表的儲存、修改 所有操作完全是一樣的 我有試過拉delphi內建的資料庫功能出來操作 結果是一樣的(錯誤訊息) 所以我也是在懷疑是不是關聯的部分有問題 請問我該怎麼查呢?
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-09-30 11:58:04 IP:61.220.xxx.xxx 未訂閱
你誤會ccchen兄的意思了 是說你的table1 跟 table2的關係 哪一個是master 哪一個是detail 也就一對多的關係(或主從關係) 是跟insert誰先誰後有關的 回首來時路 也無風雨也無晴~~@.@ 發表人 - T.J.B 於 2002/09/30 11:59:33
------
天行健
君子當自強不息~~@.@
poorbaby
一般會員


發表:4
回覆:7
積分:2
註冊:2002-08-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-09-30 13:18:38 IP:202.145.xxx.xxx 未訂閱
table1-->master table2-->slave 是一對多的關係
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-09-30 13:36:56 IP:211.20.xxx.xxx 未訂閱
你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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-09-30 14:22:55 IP:202.145.xxx.xxx 未訂閱
你說的方式 就是把table1與table2的關聯先斷掉 我應該怎麼做呢? 另外你提到table2.datasource是指向table1得確是這樣沒錯 (有一個共同的欄位) 另外的確如果我把主資料表的資料先打入並且先儲存 之後再用編輯的方式打入次資料表中 這樣資料也就不會發生錯誤… 希望你可以告訴我我該如何解決這樣的問題
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-09-30 14:33:34 IP:211.20.xxx.xxx 未訂閱
將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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-09-30 16:58:49 IP:202.145.xxx.xxx 未訂閱
你所指的Table2.DataSource:=NIL 是指Table2.MasterSource:=NIL????? 假設我改成Table2.DataSource:=NIL compiler並不會過 不過我按照這個方式改了卻仍然還是不行 另外我想請問: 之前有人告訴我有關聯的資料表 基本只要對主資料表做 new: Table1.insert; save: Table1.post; 及可…當然我試過也是不行
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-09-30 20:13:35 IP:211.23.xxx.xxx 未訂閱
不好意思確實是MASTERSOURCE才對,由你程式碼是只有片斷,很難判斷是那出問題,可否將整段程式POST上來 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-10-01 00:43:36 IP:61.59.xxx.xxx 未訂閱
因之前未注意到這個主題,造成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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-10-01 19:16:48 IP:211.22.xxx.xxx 未訂閱
依上述程式, 我有下列建議 一.先存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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-10-01 23:40:11 IP:61.59.xxx.xxx 未訂閱
引言: 依上述程式, 我有下列建議 一.先存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
系統時間:2024-04-28 8:18:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!