線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3248
推到 Plurk!
推到 Facebook!

請教一張訂單如何確保無誤的存入資料庫....

答題得分者是:P.D.
mitchellhu
一般會員


發表:23
回覆:53
積分:15
註冊:2007-06-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-13 22:08:21 IP:123.204.xxx.xxx 訂閱
請教一張訂單如何確保無誤的存入資料庫...
使用在grid上key完所有訂單品項按 save button。
應該如何設計確保所有次資料完整進資料,若存入的過程中,db異常中斷的話,如何確保已寫入的資料可以全部回寫呢?
會請教這個問題除了我是新手外,也是在想不懂的地方是,就算是用在db上寫storeprocedure 用being - tran - commit來保証全部的異動
但是如何使用dbexpress的各項元件完成批次的資料傳送給db上的sp來執行呢?
請諸位先進指點一下

感謝
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-14 00:25:06 IP:118.160.xxx.xxx 未訂閱
1.你開的題目太大了, 不是三言兩語可以說的, 是否建議你先實作看看, 有問題再上來討論
2.還要要看你是如何引導資料流程的設計, 這都關係到你訂單是否合法, 合適的回存等規劃
===================引 用 mitchellhu 文 章===================
請教一張訂單如何確保無誤的存入資料庫...
使用在grid上key完所有訂單品項按 save button。
應該如何設計確保所有次資料完整進資料,若存入的過程中,db異常中斷的話,如何確保已寫入的資料可以全部回寫呢?
會請教這個問題除了我是新手外,也是在想不懂的地方是,就算是用在db上寫storeprocedure 用being - tran - commit來保証全部的異動
但是如何使用dbexpress的各項元件完成批次的資料傳送給db上的sp來執行呢?
請諸位先進指點一下?

感謝
mitchellhu
一般會員


發表:23
回覆:53
積分:15
註冊:2007-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-01-14 09:58:59 IP:123.204.xxx.xxx 訂閱
感謝版大的指點,我仔細想看看我的問題確實範圍不明確,真是對不起!
我想我的主要問題是指確保資料正確和如何完批次的insert及update
舉例:有1張訂單5筆品項(假設5筆品
進入資料庫會造成的動作有
1.訂單檔:insert 1筆訂單
2.訂單明細:insert 5筆資料
3.存量檔:update 5筆資料

在Form 上的元件有:
StringGrid : 給user add,modify,delete 訂單資料
save Button: user 啟動 save to DB的處理
SQLConnection : 連結DB
SQLQuery : inert/update 資料
整個程序 以 stringGrind的rowcount為迴圈,一筆筆的異動資料
這是我目前的作法。雖然可以用。
但是我想若遇上中間有任何問題,造成迴圈無法完成。變成部份筆數尚未異動
而已異動的部份確無法自動回寫成未異動的狀態。
所以我想如何能以批次方式完成異動比較好,也就是要就整個完成,不就是完全不異動。
我想將所有insert和update 寫storeproce來實現。
但不知前端這些元件如何設計?
主要不明處就是如何 能將目前迴圈資料作一個Arrary類的資料 送給storeprocedure
而且不知stroeprocedure可以接收Arrary類的資料嗎?
請版主指點迷津 謝謝





kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-01-16 12:43:20 IP:24.16.xxx.xxx 未訂閱
大哉問

你是講用交易嗎?用個Try-except-finally將這些包在transaction中就可以了,你是指這些嗎?
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-01-16 14:31:09 IP:24.16.xxx.xxx 未訂閱
若遇上中間有任何問題,造成迴圈無法完成。變成部份筆數尚未異動
而已異動的部份確無法自動回寫成未異動的狀態。
所以我想如何能以批次方式完成異動比較好,也就是要就整個完成,不就是完全不異動。

==>這就是Transaction在作的事情
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-01-16 14:33:32 IP:24.16.xxx.xxx 未訂閱
如何能以批次方式完成異動比較好,也就是要就整個完成,不就是完全不異動。
我想將所有insert和update 寫storeproce來實現。
但不知前端這些元件如何設計?
主要不明處就是如何 能將目前迴圈資料作一個Arrary類的資料 送給storeprocedure

==>啟動Transaction,把這些用個Try-except-finally-end 包起來就可以了
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-01-16 14:36:39 IP:24.16.xxx.xxx 未訂閱
不知stroeprocedure可以接收Arrary類的資料嗎?

==>這該比較像應該出現在這裏的問題
==>你該先告訴我你已找到那些資料了,及試那些了,及問題卡在那了,
==>否則,我不知道該如何跟你講
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-01-16 14:52:15 IP:24.16.xxx.xxx 未訂閱
不知前端這些元件如何設計?

==>很抱歉,初看到這句時,我差點昏倒
==>因為我以為你是要問『這些元件如何設計?』,那老實講,我不知道。
==> 因為Delphi是天才的產品,它主要是為了下愚如小弟我這類人設計的
==> ,可能大部份用Delphi都沒能仔細澈底挖過Delphi的精華深處﹝這曾
==> 經是好久好久以前我年輕時不切實際的夢想與幻想﹞。你只要會用
==> 及掌握幾個Dephi-OO的原則就可以了。

==>不過,再看一下你的原文,我想你不是要跟大家討論這些東西的,
==> 那些可能可能可以寫成好幾本書了。你想的,只是如何把元件組起
==> 來,及如何用它們罷了。

==>如果是講如何把元件組起來,及如何用它們,那你應該給大家一個起點。
==> 如『我已經...,可是...,我又試過...但...』

==>有時想想,用了十幾年的Delphi,總是有些依戀,雖然日常工作是離它越
==> 來越遠,但總是很想跟同好聊聊,只是可惜現在在Ktop很少能遇到願
==> 跟你扯些有的沒的的人了。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2011-01-16 00:02:04, 註解 無‧
kevin2004 重新編輯於 2011-01-16 00:08:18, 註解 無‧
mitchellhu
一般會員


發表:23
回覆:53
積分:15
註冊:2007-06-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-01-16 16:36:44 IP:123.204.xxx.xxx 訂閱
Keven 大大:
你好!
看了您的回覆,我自已都覺得好笑。看來我真的是大哉問了?
其實我的問題還真不少呢?
主要就是因為新上手的關係。
您能回答我真的高興,這幾天都在找資料和試著搞懂這些DB的元件。
基本上我目前都是使用SQLConnection, SQLQUERY來連結資料作insert,update,delete, query等的動作
使用介面上都是使用一般的stringgrid,edit,richedit等元件作為user的key in 介面。
雖然可以使用,但程式寫起來很麻煩,所有的異動都要同時處理db和介面上資料的改變,而且是一筆筆的異動。
所以我再想,資料庫系統的開發不應該是這樣的。特別是要確保資料的正確性時,我這樣的寫法好像太笨了。
就在我寫到Delete整張訂單資料時,想到若只要傳送單號給db上寫好的storprocedure來處理,程式的code不就大大節省了。
db歸db處理,UI就單純的delete stringGrid row就好了?我也實作出來了,確實可性。
於是馬上就想到若是整張的訂單一次性的Insert 到db的話,又要如何實現呢?這就是我的大哉問的來源了。
這幾天就找了一些資料來研究如何處理這樣的問題呢?
我目前正在試著用sqldataset/sqlclientdataset, sqldatasetporvider,datasource,dbgrid來寫看看
對我而言真的有點頭暈。
例如:簡單的 ADD 一筆訂單
先QUERY目前的最大單號再加1,成為新的單號。
但是sqldataset, 我找不出來方式給訂單編號欄insert 一個值。當然手動在dbGrid上可以key in 單號。
但是單號不應由使用者來訂的。使用者 應該是按下新增訂單鈕後,程式就會在dbgrid上自動增加一列,並在單號欄入key最新的單號的。
而且馬上在訂單單頭檔上,立即insert一筆新資料。以免同時又有人新增時會用同一個新單號。
我知道sqlDataset有insetrecord, appendrecord。但是我就是想不出來為什麼不是在DBgrid上來insert,append呢?
我還在try 我想我一定是還有很多東西還不清楚。我繼續努力。 呵呵
感謝 Keven和版主大的回覆








編輯記錄
mitchellhu 重新編輯於 2011-01-16 01:38:53, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-01-17 00:35:41 IP:118.169.xxx.xxx 未訂閱
不是我不願意回, 而是不知道從何回起, 因為這要討論下來, 真的是寫一本書,
所以不妨請你實作, 遇到了錯誤或問題再發上來討論, 會比你現在的狀況好很多
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-01-20 02:12:18 IP:24.16.xxx.xxx 未訂閱
mitchellhu

小弟想與您聊聊,有空嗎?
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-01-20 07:05:26 IP:24.16.xxx.xxx 未訂閱
新手與新上手是差別很大的。新手是不可能接觸到sqlConnection、sqlQuery這些
東西的。這些是Borland繼BDE後提出的新技術,本身就蠻難蠻先進的。我當
初在BDE上停了好長一段時間,後來在Delph5時公司將好幾套系統由BDE改
寫到ADO時,好幾百萬行程式碼的改寫,至少花了一兩年時間才大略完成。
到現在很多年了,尚有些未完全消滅的BDE仍存在好幾個系統中,常常讓我
們頭痛。dbExpress是很強大很好的技術,可是我們並沒有深入研究。看到
新上手,就來玩dbExpress,實在很令人吃驚。老哥自謙新手,也太過謙。
看到老哥提到好幾次StoreProc,蠻好奇的。通常一個系統在不同客戶時會搭
配不同的DB,除了特殊狀況及為了綁客戶外,使用StorProc不是很不方便
嗎?老哥為何如此情有獨鍾?
------
Kevin
編輯記錄
kevin2004 重新編輯於 2011-01-19 16:10:07, 註解 無‧
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-01-20 07:20:38 IP:24.16.xxx.xxx 未訂閱
使用介面上都是使用一般的stringgrid,edit,richedit等元件作為user的key in 介面。
雖然可以使用,但程式寫起來很麻煩,所有的異動都要同時處理db和介面上資
料的改變,而且是一筆筆的異動。所以我再想,資料庫系統的開發不應該是這
樣的。特別是要確保資料的正確性時,我這樣的寫法好像太笨了。

==>只知道老哥您是高手,才能這麼快就可以把Delphi中這些較難的東西一下子
==> 就可以弄得如此順手,實令人佩服。不太曉得老哥原先是在那個領域,及
==> 是使用那些工具?蠻好奇的。可否透漏一下。
==>Delphi天生就是為作DB-AP設計的,省時省力體貼強大。你為何要用StringGrid
==> 、Edit、RichEdit這些元件?為何不用DBGrid、DBEdit等,不是簡易多了。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2011-01-19 16:21:12, 註解 無‧
kevin2004 重新編輯於 2011-01-19 16:38:31, 註解 無‧
mitchellhu
一般會員


發表:23
回覆:53
積分:15
註冊:2007-06-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-01-21 10:07:59 IP:123.204.xxx.xxx 訂閱
 感謝keven的回覆:

呵呵,keven你推測的很準確,我不是一般的新手。而是個2次就業的老頭新手。
年輕時推動和參與過持績開發近5年的大型專案,當時就是用delphi 3/bde。但
我主要是負責介面及資料庫的工作,但實際coding我沒有作,不過因為懂得工作程序,
而且看久了也略能看懂程式的code。
近年為了生活,只好從操舊業,接些case來作。最近朋友公司需要開發一套倉管系統,
所以我就選用delphi來開發兼練手(因為只有delphl看來有點熟悉,但實戰經驗不足,所以才會問出一些眼高手拙的問題)
,之所以沒用bde,ado,呵呵 被你料中,就是因為沒用過dbexpress ,也是想拿來練手。
畢竟這些db 元件,我都是不夠熟悉,就只能依照我自已規劃的需求,不斷的try................。結論是技術不上手,下場是進度
慢又因為常常有新的體會,部份程式碼又會重寫過...呵呵。可惡,自已沒按標準的程度序來開發....下場真是累又慘。




mitchellhu
一般會員


發表:23
回覆:53
積分:15
註冊:2007-06-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2011-01-21 10:37:34 IP:123.204.xxx.xxx 訂閱
 我本來想用dbgrid/dbnavigator作為user insert/update/modify/query的介面。
首先我遇上2個開題沒有克服。
1.有序單號:朋友要求用8碼年月日加2-5碼長的流水號。
我想不出個方法,可以用 sqlconnection/sqldataset 上的commandtext來完成新增一筆資料時,
會在單號欄自動顯示目前最新單號,而且其它欄空白給user輸入。
2.由於我table的相依高,所以異動某些table時,其它相關的table 也會跟著異動。同理,如何在
commandtext 或 apply update 時實現 batch sql statemnet 處理。我也沒試出來了。
另外我之所以會用storeprocedure就是為了簡單的處理前述的問題,目前只能實現對於已存入DB的資料,作整批
的刪除或異動。 而整批單據的insert,無特定範圍條件的update,無法適用於sp的方式來作。
另外對於table相依性的問題,我也想過用fk, trigger等方式來維持,呵呵。我發現我的db能力大退化,mysql也是第
一次用,要花時間才能上手,但是目前就是時間有限。已花太多的時間在try...try。眼見,下個月中就要交貨了。
目前進度還不到50%。所以只能用基本功來 硬幹(無腦大法)了。
等這個case收工。我再來研究,期望keven屆時多多指點啦
ps:對於第2個問題,有考慮用master detail的架構 來試,但可以多層的master detail來處理嗎?



編輯記錄
mitchellhu 重新編輯於 2011-01-20 19:40:55, 註解 無‧
mitchellhu 重新編輯於 2011-01-20 23:59:43, 註解 無‧
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#16 引用回覆 回覆 發表時間:2011-01-24 12:42:01 IP:24.16.xxx.xxx 未訂閱
mitchellhu吾兄:

抱歉,小弟的小朋友這兩天感冒了,半夜燒到39度,全家人仰馬翻。好不容易今天退燒了,現在才回。
尚請吾兄鑑諒。

因為你在下個月中就要交件,小弟也不敢亂提什麼偉大的建議。不過就像原先講的,純是聊幾句。
吾兄當作忙累之餘,有個同好給您打氣吧。

講到訂單,一定免不了是Master-Detail,或是客戶定單、或是售貨員訂單,或是...,都免不了M-D。公司
有個系統有個功能,它是五層的M-D,整個Form直接的碼就兩三萬行,這支Form光由開發到成熟,就
至少費了三到五年的時間。所以您講的『可以多層的master detail來處理嗎?』,絕對沒問題。只要抓
住幾個M-D的重要關念與技巧,必水到渠成。

蠻佩服吾兄,竟然『mysql也是第一次用』、『因為沒用過dbexpress ,也是想拿來練手』,想想當初小弟
初次接觸PostgreSQL時到處碰璧,花了好幾年的時間才寫出第一個pgDbAP,今看吾兄行雲流水,過關
斬將,檣奴弩灰飛煙滅,實佩服之至。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2011-01-23 22:17:23, 註解 無‧
kevin2004 重新編輯於 2011-01-23 22:26:17, 註解 無‧
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#17 引用回覆 回覆 發表時間:2011-01-24 13:13:54 IP:24.16.xxx.xxx 未訂閱
倉管系統

==>小弟曾被公司指派短期支援別個部門的案子,它是用PLC MC VB-UI控制生產機臺及指揮無人
==> 搬運車作倉儲管理,涉入沒多久就又去作別的案子了。

有序單號...我想不出個方法,可以用 sqlconnection/sqldataset 上的commandtext來完成新增一筆資
料時,會在單號欄自動顯示目前最新單號,而且其它欄空白給user輸入。

==>我想吾兄應該已經解決了『有序單號』這個問題了吧。

StorProc、table相依性、想過用fk, trigger等方式來維持

==>其實可能不要如此複雜。依小弟淺見,StorProc會妨礙你的AP的移殖力的,除了特殊理由外,
==> 還是少用。用trig來維持Table相依性,有時反而會綁死你的系統,如果過了段時間,您發覺
==> 您的DB-Stru設計錯了﹝這很常見﹞或您的出錢大爺換了想法或變了規格,您的系統會很難
==> 修正。反正AP是您寫的,在AP中,您就是天皇老子,自己控制好不就得了嗎?
==>Trig是好東西,不過DB與系統安全不應該只由Trig來維持。
==>通常一個由無到有的系統是最難最痛苦的,可能要花上好幾年時間才能開發出來。系統開發與
==> 維持,通常可能必需包含一、二十萬行的DLL/Package/Class。日常大部份的工作多為打字練
==> 習,拉拉元件,召喚已寫好的Func/Class,只有不到5%才可勉強可稱上有創造力的部份。

==>純是聊聊,給吾兄加油。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2011-01-23 22:19:25, 註解 無‧
系統時間:2024-03-28 22:44:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!