Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
最近在設計資料庫程式時, 需要在執行時產生一個 temp table, 這個temp table須要一直變更結構.本來是使用 inmemory.pas, 但是後來發現功能限制很大, 所以改用 ttable, 重覆變更temp table結構執行中發生了下列問題:
![]() |
1.明明已經 delete table, 但是還是會出現 table is busy的錯誤而當機跳出 |
![]() |
2.無法產生 float格式的欄位(如 000000.0 的格式), 使用FieldDefs.Add('a3' ,ftfloat,8,False) run時發生錯誤 |
![]() |
3.一些執行中的 label.caption 都沒有隨變動而顯示訊息, 但 gauge有動作 |
![]() |
4.用 quickrep 印表後, 這個 temp table就不明原因的 lost control 無法用 dbgrid操作及變更索引, 資料也被清空了... |
資料庫類別 : dbase
關於 3. 只要在 Caption 指定敘述之後加一列 Label.Refresh; 就可以消除Caption 沒有更新的問題.
關於 2. 在產生新檔時, 我已經都不用 FieldDefs 了, 因為要注意的細節與問題很多(就像您遇到的); 其次, 對於新產生的 DBF,在資料實際長度上也不一定與想要的相同(通常都會比較大)
您可以考慮以 SQL 的 Create Table 述句, 以動態組成 TQuery.SQL 的內容,呼叫 ExecSQL 就可以產生這個檔案, 索引的部分如果不牽涉到 Express Index(就是兩個欄位相加在一起的那種), 也可以不用 IndexDefs 的方式建立索引, 直接用 Create Index 即可.
以下有一個例子(摘自 DChat 1.0 Source Code):
(*--------------------------------------------------*) (* 產生檔案/目錄邏輯/實體名稱對照檔 (* 以 SQL 述句產生檔案與索引 (* (*--------------------------------------------------*) function TfrmMain.CreatePhy_LogTable: boolean; var qryMakeNewTable: TQuery; begin Result := False; qryMakeNewTable := TQuery.Create(Self); with qryMakeNewTable do begin DatabaseName := ExtractFilePath(Application.ExeName); with SQL do begin Clear; Add('CREATE TABLE "PHY_LOG.DBF" ('); Add('PhyName CHARACTER(60), '); Add('LogName CHARACTER(60) '); (* 註: 如果是要產生 Memo 的欄位, dBASE 檔案(只有 dBASE 是這樣寫的) Add('Content BLOB(0,1) '); float 的欄位: Add('TestNum FLOAT(8, 2) '); ** 注意逗號 *) Add(')'); ExecSQL; (* 索引的部分 *) Clear; Add('CREATE INDEX PHYNAME ON "PHY_LOG.DBF" (PHYNAME)'); ExecSQL; end; Close; Free; end; Result := True; end;
這個方法在應用時另外要注意事先要刪除同名檔案.
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |