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

請教眾高手大大們一個資料庫重整的程式寫法

答題得分者是:領航天使
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-02 00:33:35 IP:211.76.xxx.xxx 未訂閱
小弟手頭有一個DBaseIV的資料庫,主檔副檔名為DBF,因為應用程式不是用ODBC方式連接,所以檔案結構必須一定要照日期跟時間順序依序遞增排列,有時會有增/減資料的需求,而我只是DELPHI入門初學者,並不熟程式要怎麼寫,小弟有一想法,想煩請大大們指導:假設原始檔為A.DBF,臨時檔為B.DBF 一、將A複製一份成B(類似檔案總管複製一份的動作) 二、分別用ODBC連接A跟B 三、將B所有RECORD清空,成為空DBASE資料庫 四、將要新增或刪除RECORD的動作在此時處理 五、將A資料庫的RECORD依日期時間依序遞增的順序寫入B 六、將A刪除,然後將B更名成A 這樣的步驟才能確保A檔能真的照時間順序遞增(因為ODBC所連接的資料庫在程式中可能是依時間順序,但實際檔案結構,新增的RECORD一定都會放在檔案尾部)。或者,大大們有比小弟更好的寫法,祈求能教小弟,感激不盡
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-02 02:48:06 IP:61.71.xxx.xxx 未訂閱
引言: 小弟手頭有一個DBaseIV的資料庫,主檔副檔名為DBF,因為應用程式不是用ODBC方式連接,所以檔案結構必須一定要照日期跟時間順序依序遞增排列,有時會有增/減資料的需求,而我只是DELPHI入門初學者,並不熟程式要怎麼寫,小弟有一想法,想煩請大大們指導:假設原始檔為A.DBF,臨時檔為B.DBF 一、將A複製一份成B(類似檔案總管複製一份的動作) 二、分別用ODBC連接A跟B 三、將B所有RECORD清空,成為空DBASE資料庫 四、將要新增或刪除RECORD的動作在此時處理 五、將A資料庫的RECORD依日期時間依序遞增的順序寫入B 六、將A刪除,然後將B更名成A 這樣的步驟才能確保A檔能真的照時間順序遞增(因為ODBC所連接的資料庫在程式中可能是依時間順序,但實際檔案結構,新增的RECORD一定都會放在檔案尾部)。或者,大大們有比小弟更好的寫法,祈求能教小弟,感激不盡 < face="Verdana, Arial, Helvetica"> 建立一個以時間為KEY值的索引就解決了!
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-02 09:23:27 IP:61.66.xxx.xxx 未訂閱
抱歉,我不是很懂大大您的意思耶,可不可以舉例說明呢,我那個應用程式是國外套裝軟,我是不知它以何種方式存取dbase4的檔案,但可以確定的是,只要檔案的末筆資料(用ultraedit去看)不是這資料庫最新的一筆資料,它抓資料出來時就會整個錯亂,會從末筆那個資料時間點以後的資料全部消失,舉例來說,檔案末筆是2004/08/22,倒數第二筆是2004/11/01好了,被那支套裝程式讀出來會從2004/08/22~2004/11/01間的資料全部看不見喔,所以一定要將整個"檔案"重新排序過(用任何可以編輯16進制檔案的編輯程式去開,不是用資料庫程式去開喔),那支套裝程式讀出資料才不會出問題喔,煩請大大再指導一下吧,感恩
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-02 09:39:18 IP:220.134.xxx.xxx 未訂閱
讓我猜看看 .DBF檔案應該是沒有Primary Key的,只有Uni-Key的Index 不過如果原來的程式並未採用這個Index來搜尋 自行加上的Index是沒用的 該程式可能直接將資料讀入並未排序然後在記憶體中用二元搜尋資料 才會造成資料未排序好就會有找不到的情況 用一個BDE的Alias Name型態為DBASE的 指向到A.DBF的資料夾 用Table讀出,並且設定Sort欄位 將B.DBF清空後A.DBF的資料一筆一筆寫入就可以了 不過您要注意的是您原來A.DBF是否有索引檔(比如A.NDX) 這些索引檔也要加入A.DBF的資料表設定中 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-02 09:49:56 IP:61.66.xxx.xxx 未訂閱
請問領航天使大大有沒有範例呀,小弟第一次使用delphi,所以您說的我還不會耶,拜託給小弟一個範例好不好,另外,真的被大大您說中了,它有.ndx檔耶,而且沒primary key,至於有沒有unikey我就不知了,請大大再指導一下囉
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-02 10:30:36 IP:220.134.xxx.xxx 未訂閱
引言: 請問領航天使大大有沒有範例呀,小弟第一次使用delphi,所以您說的我還不會耶,拜託給小弟一個範例好不好,另外,真的被大大您說中了,它有.ndx檔耶,而且沒primary key,至於有沒有unikey我就不知了,請大大再指導一下囉 < face="Verdana, Arial, Helvetica"> 直接要範例這樣不太好喔, 如果是新手發問最好讓人覺得您有努力過了, 真的寫出不來然後在程式頻頸的地方發問, 這樣高手們會比較喜歡回復您的問題的! 您自己先試看看, 先把您的.DBF還有.NDX壓縮後上傳上來, 放在會員求助程式檔案上傳區 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=97 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-02 17:13:04 IP:61.66.xxx.xxx 未訂閱
領航大大,我已經將資料庫上傳至會員求助程式檔案上傳區了。 小弟是試過用ADO或BDE ALIAS方式存取資料庫,就是在VCL元件內屬性欄位填入,但下場都只有一個→連接失敗,不是抓不到資料庫內容,就是把資料庫的檔案結構變了,導致套裝程式再也無法存取資料了(是一筆都叫不出來喔),所以我也不知要傳啥程式碼給您看,因為內容就只有元件的宣告,沒有任何額外的程式寫作,我用到的有DBGRID、DATASOURCE、ADOCONNECTION、ADOTABLE、DBNIGATOR然後DBGRID->DATASOURCE->ADOTABLE->ADOCONNECTION,這樣的說明不知大大您能接受嗎,我的專案就這些元件及屬性連接,啥程式都沒寫就會有以上ADO連接的下場(資料庫檔案結構改變),至於BDE,我根本連不上
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-02 19:16:53 IP:220.134.xxx.xxx 未訂閱
這表示您有試過了 我幫您試了一下 可能因為您未設定好ODBC內的參數 還有這個.DBF不是DBase4的格式而是Dbase3的格式喔    您先看我的設定再試看看 選DBase的Driver 設定目錄/選取索引 選取對應的索引檔名/選擇單一索引檔案(就是.NDX) 之後會產生一個.DBF與.NDX關聯的定義檔案.INF .....之後就看您的了 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
mflyy
初階會員


發表:3
回覆:44
積分:44
註冊:2002-08-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-02 23:02:55 IP:210.68.xxx.xxx 未訂閱
抱歉,我不是很懂大大您的意思耶,可不可以舉例說明呢,我那個應用程式是國外套裝軟,我是不知它以何種方式存取dbase4的檔案,但可以確定的是,只要檔案的末筆資料(用ultraedit去看)不是這資料庫最新的一筆資料,它抓資料出來時就會整個錯亂,會從末筆那個資料時間點以後的資料全部消失,舉例來說,檔案末筆是2004/08/22,倒數第二筆是2004/11/01好了,被那支套裝程式讀出來會從2004/08/22~2004/11/01間的資料全部看不見喔,所以一定要將整個"檔案"重新排序過(用任何可以編輯16進制檔案的編輯程式去開,不是用資料庫程式去開喔),那支套裝程式讀出資料才不會出問題喔,煩請大大再指導一下吧,感恩 對不起插個花,我不是要解決你所說的DBF複製的過程, 這個部分,相信論壇上的很多版主或站長很容易解決 我想要討論的是,你說你的DBF只耍不是這資料庫最新的一筆資料, 它抓資料出來時就會整個錯亂 ? 想請問你,你是在什麼環境Append New Record 的? 你在Open DBF 時是否沒有同時把它的索引檔同時打開?,所以當你改變或新增Record時,索引檔根本沒同步更新 在DBF時代,最常遇見的事就是索引亂了,常常需要Reindex 給你一個建議,找到DBASE III 的環境,在它的操作環境下 開啟DBF及它的索引 新增一筆RECORD後, 再回到那個套裝軟體 試一下,是否有你所說的限制排列? Try 一下吧
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-02 23:42:13 IP:211.76.xxx.xxx 未訂閱
非常感謝兩位大大的解答,只是小弟一直弄錯一個步驟,因為原廠資料寫的資料格式為DBASE4,所以一直用這格式去連線,但兩位大大的回答卻是DBASE3的格式,想請教兩位大大是如何確定小弟的資料庫是DBASE3而非DBASE4呢,剩下的程式小弟會解決,只是擔心DBASE版本弄錯了會不會造成套裝程式無法開啟資料庫呢 >
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-03 08:31:17 IP:220.134.xxx.xxx 未訂閱
用Database Desktop工具就可以看出 證明如下 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-11-03 15:14:22 IP:220.134.xxx.xxx 未訂閱
wychen57 看到您結案了 請問您的問題解決了嗎? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-11-03 15:42:23 IP:61.66.xxx.xxx 未訂閱
問題是尚未解決,不過論壇問題不能閒置超過三天,小弟需要再測試一下,時間一定會超過三天,所以先結案,不然會被發警告信記點,小弟一直被原廠技術資料誤導,所以才會一直無法正常開啟資料庫,至於小弟最後發問的問題,如果領航大大願意繼續指導,小弟會非常感激的,感謝您的指導
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-11-03 16:04:45 IP:61.66.xxx.xxx 未訂閱
PS:小弟已經重新上傳資料庫檔案→http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59054,第一層是TRENDITM.DBF,下兩層才是8224.DBF,此資料庫更新後,必須一起更新上一層目錄中的TRENDITM.DBF,TRENDITM.NDX,這個資料庫內容記錄8224.DBF的末筆資料、DBF檔加NDX檔的總FILE SIZE、8224.DBF所在的檔案路徑,這也就是為何小弟強調DBF檔尾的RECORD一定要是最新的,若是TRENDITM.DBF所記錄的末筆資料是檔案日期最新的,但8224.DBF檔尾卻不是這一筆資料,系統就會錯亂,而且新增資料的動作是套裝程式自己做的,而非人為手動增加,所以當我自己寫程式新增資料就會破壞檔案結構。 兩位大大能看出小弟是在那個環節出錯,亦或觀念根本就徹底錯誤嗎,
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-11-03 18:54:57 IP:220.134.xxx.xxx 未訂閱
引言: 問題是尚未解決,不過論壇問題不能閒置超過三天,小弟需要再測試一下,時間一定會超過三天,所以先結案,不然會被發警告信記點,小弟一直被原廠技術資料誤導,所以才會一直無法正常開啟資料庫,至於小弟最後發問的問題,如果領航大大願意繼續指導,小弟會非常感激的,感謝您的指導 < face="Verdana, Arial, Helvetica"> 那是通知信件不是警告信件 警告計點扣分是30天以上 而且計算的時間點是最後一位回覆者非發問者 且回覆的時間超過30天以上才會正式警告扣分 這段時間的通知信都只是提醒性質的通知 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-11-03 20:45:52 IP:220.134.xxx.xxx 未訂閱
引言: PS:小弟已經重新上傳資料庫檔案→http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59054,第一層是TRENDITM.DBF,下兩層才是8224.DBF,此資料庫更新後,必須一起更新上一層目錄中的TRENDITM.DBF,TRENDITM.NDX,這個資料庫內容記錄8224.DBF的末筆資料、DBF檔加NDX檔的總FILE SIZE、8224.DBF所在的檔案路徑,這也就是為何小弟強調DBF檔尾的RECORD一定要是最新的,若是TRENDITM.DBF所記錄的末筆資料是檔案日期最新的,但8224.DBF檔尾卻不是這一筆資料,系統就會錯亂,而且新增資料的動作是套裝程式自己做的,而非人為手動增加,所以當我自己寫程式新增資料就會破壞檔案結構。 兩位大大能看出小弟是在那個環節出錯,亦或觀念根本就徹底錯誤嗎, < face="Verdana, Arial, Helvetica"> 是不是原廠程式有問題因為手中無這個軟體無法論斷 您說寫程式會破壞 請問請有用Dbase-III的ODBC格式並且產生.INF的情況下去寫程式新增資料嗎? 如果有 請將您寫入前的.DBF .NDX以前寫入之後的.DBF .NDX都傳上來給我看看 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
系統時間:2024-07-01 9:46:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!