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

fire dac 執行錯誤

答題得分者是:GrandRURU
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-10-01 18:36:38 IP:118.169.xxx.xxx 未訂閱
請問各位:

我換了 berlin 10.1 u1 的系統後, 原來在10.1 的版本編譯出來的 win32 fmx project 都很ok, 但在這版本, 其中我有創建一個 FireDac Table 的資料庫, 其中有一個欄位是 ftblob(或 ftGraphic), 只要我open 這個Table 就引發
[FireDAC][Stan][Eval]-104 Type mismatch in expression 的錯誤, 但只要移除這個欄位就沒事,
重點是在 berlin 10.1 之前的版本不會這樣, 是不是 embd 又改了什麼,
不知各位有沒有這方面的遭遇?
編輯記錄
P.D. 重新編輯於 2016-10-01 22:17:25, 註解 無‧
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-10-02 00:32:21 IP:118.169.xxx.xxx 未訂閱
今天花了一整天的時間在追這個問題, 結果我發現一件事

berlin 版本的 firedac, 使用 TFDTable 時, 如果啟用了 Filterd 的選項, 就會引發這個問題, 現在我還不知道要如何解, 查網路好像有一個人有發討論, 但也沒有結果, 但這問題在 xe8 是 ok!
如果真的是這個的問題, 那我一堆程式就頭大了, 要全部重改....
P.D.
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-10-02 13:16:30 IP:118.169.xxx.xxx 未訂閱
補充, 
特別用另一套 TkbmMemTable 的元件, 也支援 fmx 介面, 發現更駭人的事情, 因為只要設定 filter=True , 一樣發生相同情況, 所以問題似乎不是出在 fireDAC上, 而是 xe 本身的問題....
不僅 filter, 使用 index, fileindex 或者 setrange , 都在 xxxx.open 時就出現這個問題.....
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-10-02 19:14:28 IP:118.169.xxx.xxx 未訂閱
今天特別再浪費一天的時間測試, 我已得到證實, 以下均同一個專案

xe8, xe10 seattle, xe10 seattle update1 , FireDAC 都正常的運作
xe10.1 Berlin, xe10.1 Berlin Update 1 圴告失敗, 有 Filtered=True 一定出問題, 有一些沒有 Filtered 的, 會出現 DataLink... Error 的問題, 所以狀況不只是 Filtered 而己, 但問題不在 FireDAC, 使用 TkbmMemTable 元件一樣發生, 所以是 XE 本身的狀況, 至於什麼問題, 不知道...
如果解不開, 基本上 XE 是沒辦法再用下去了!
P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-10-05 12:56:05 IP:59.120.xxx.xxx 未訂閱
再補充一個

實測不管在 FMX 或 VCL 專案下都會
而且不用寫 CODE, 拉一個 FDCONNECTION, FDTABLE, FDWAITCURSTOR, 把一個 SQLITE 資料庫指向 CONNECTION 上, 並啟動它, 然後 FDTABLE 指向 SQLITE TABLE NAME, 設定 FILTER='XXXXX', FILTERED=TRUE, 最後啟動 FDTABLE 就引發錯誤, 不知是我的 BERLIN 有問題, 還是本身 BERLIN 的問題
以上問題在 10.1, 10.1U1 都會, 但在 SEATTLE 10, SEATTLE 10 U1 不會
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-10-05 15:08:07 IP:59.120.xxx.xxx 未訂閱
我這邊測試使用上一切正常

不知您手邊有沒有測試用的資料庫可以放上來讓我試試?
===================引 用 P.D. 文 章===================
再補充一個

實測不管在 FMX 或 VCL 專案下都會
而且不用寫 CODE, 拉一個 FDCONNECTION, FDTABLE, FDWAITCURSTOR, 把一個 SQLITE 資料庫指向 CONNECTION 上, 並啟動它, 然後 FDTABLE 指向 SQLITE TABLE NAME, 設定 FILTER='XXXXX', FILTERED=TRUE, 最後啟動 FDTABLE 就引發錯誤, 不知是我的 BERLIN 有問題, 還是本身 BERLIN 的問題
以上問題在 10.1, 10.1U1 都會, 但在 SEATTLE 10, SEATTLE 10 U1 不會
P.D.
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-10-05 15:30:06 IP:59.120.xxx.xxx 未訂閱
RuRu兄, 讓您跳出來測, 真不好意思, 
先前我也有給 Q-COM 測試專案, 剛剛收到他的回覆也和你的答案一樣,
因為專案都一樣, 我猜是不是安裝上的環境不同而影響的

因為我這邊確實引發, 而且很簡單測, 就我上回所說的三個元件, 只要啟動了FILTERED=TRUE 就當了, 所以專案或不專案都沒差
而且在 SEATTLE 真的也沒問題, 如果您有時間, 不妨我帶筆電過去找你, 實際RUN就知道了
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2016-10-06 08:59:37 IP:59.120.xxx.xxx 未訂閱
您的問題分成兩個部份
1.拉一個 FDCONNECTION, FDTABLE, FDWAITCURSTOR, 把一個 SQLITE 資料庫指向 CONNECTION 上, 並啟動它, 然後 FDTABLE 指向 SQLITE TABLE NAME, 設定 FILTER='XXXXX', FILTERED=TRUE, 最後啟動 FDTABLE 就引發錯誤
2.創建一個 FireDac Table 的資料庫, 其中有一個欄位是 ftblob(或 ftGraphic), 只要我open 這個Table 就引發
[FireDAC][Stan][Eval]-104 Type mismatch in expression 的錯誤


問題1我實測是沒有問題,使用的是Delphi隨附的範例資料庫

問題2因我不會SQLite的資料庫建立,所以才需要您提供手邊的資料庫進行測試

以上

===================引 用 P.D. 文 章===================
RuRu兄, 讓您跳出來測, 真不好意思,
先前我也有給 Q-COM 測試專案, 剛剛收到他的回覆也和你的答案一樣,
因為專案都一樣, 我猜是不是安裝上的環境不同而影響的

因為我這邊確實引發, 而且很簡單測, 就我上回所說的三個元件, 只要啟動了FILTERED=TRUE 就當了, 所以專案或不專案都沒差
而且在 SEATTLE 真的也沒問題, 如果您有時間, 不妨我帶筆電過去找你, 實際RUN就知道了
P.D.
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2016-10-06 20:07:47 IP:118.169.xxx.xxx 未訂閱
感恩, 我再弄一個較完整的測試資料mail給你, 不過因為各方回覆回來的訊息都沒有我的遭遇, 所以可能要從我的安裝查起了, 搞不好得花掉我半年的時間, 要不然就是不能使用 TTable 的寫法(那會很慘), 我測使用 TQuery 沒有問題
P.D.
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2016-10-07 10:46:24 IP:118.169.xxx.xxx 未訂閱
RuRu兄

範例花了幾個小時寫好了, 同時我還錄下了在我的 Berlin 10.1 U1 的系統操作的過程影片檔也在裡面, 有點大

範例使用 FireDac FDTable 及 FDQuery 分別做案例, 另外也用了 KbmMmemTable 另做一個案例,
所以如果你沒有安裝 Kbm , 開啟專案可能會引發錯誤, 不管它就好了
想要看結果, 直接run project.exe 即可, 要看影片, runsample.mp4
大概看了影片就知道我在說什麼了, 不管寫法是否合理或 "不建議用filter 這樣做法"的考量,, 我實測在 seattle 是沒有問題, , 然而Q-COM回覆測試沒有問題, 我實在不知該如何除錯了, 要如何修正! 如果您有時間可以測測看, 或許你的也不會有問題, 但在我這, 同樣的環境(seattle, berlin), 安裝的東西都一樣, 一個行, 一個不行, 我只想原因出在那裡?

感恩~~~

ps. 如果要開專案或測試, 解壓後請放在\test\ 目錄下, 因為我路徑寫死了

Berlin 10.1 U1 版本的程式
http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=109569

Seattle 10 U1 編譯的程式
http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=109570
===================引 用 GrandRURU 文 章===================
您的問題分成兩個部份
1.拉一個 FDCONNECTION, FDTABLE, FDWAITCURSTOR, 把一個 SQLITE 資料庫指向 CONNECTION 上, 並啟動它, 然後 FDTABLE 指向 SQLITE TABLE NAME, 設定 FILTER='XXXXX', FILTERED=TRUE, 最後啟動 FDTABLE 就引發錯誤
2.創建一個 FireDac Table 的資料庫, 其中有一個欄位是 ftblob(或 ftGraphic), 只要我open 這個Table 就引發
[FireDAC][Stan][Eval]-104 Type mismatch in expression 的錯誤


問題1我實測是沒有問題,使用的是Delphi隨附的範例資料庫

問題2因我不會SQLite的資料庫建立,所以才需要您提供手邊的資料庫進行測試

以上

===================引 用 P.D. 文 章===================
RuRu兄, 讓您跳出來測, 真不好意思,
先前我也有給 Q-COM 測試專案, 剛剛收到他的回覆也和你的答案一樣,
因為專案都一樣, 我猜是不是安裝上的環境不同而影響的

因為我這邊確實引發, 而且很簡單測, 就我上回所說的三個元件, 只要啟動了FILTERED=TRUE 就當了, 所以專案或不專案都沒差
而且在 SEATTLE 真的也沒問題, 如果您有時間, 不妨我帶筆電過去找你, 實際RUN就知道了
編輯記錄
P.D. 重新編輯於 2016-10-07 10:47:33, 註解 無‧
P.D. 重新編輯於 2016-10-07 10:48:20, 註解 無‧
P.D. 重新編輯於 2016-10-07 10:56:03, 註解 無‧
P.D. 重新編輯於 2016-10-07 11:03:06, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2016-10-11 11:02:40 IP:59.120.xxx.xxx 未訂閱
您的專案的確有測出您說的問題

一勞永逸的作法可使用:TDataSet.OnFilterRecord 事件,把您要篩選的方式寫在這個事件裡
這個方法從 Delphi 5 - 10.1都適用,也不用等 EMBT 去修正 Filter 的 BUG

僅供您參考

以上
P.D.
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2016-10-11 12:20:18 IP:118.160.xxx.xxx 未訂閱
onfilterrecord 我自己的實際經驗, 其效能比用 filter 更慢, 所以我幾乎都不用這樣的寫法(自dephi5以來)
目前我只好改寫用法, 全部捨棄 filter 用法, 改用 FDQuery 或 kbm 模組
但使用 kbm 也有問題
例如, KbmMemTable1 中有4個欄位(在 Field Editor 新增 dtype, dno, phrase, pict)
通常我們在程式中就會這樣寫
kbmMemTable1DTYPE.AsString (或 .Value) , 但在 berlin 10 後的版本, 實際run時會引發 Accerr Reading Errr $00000000... 的錯誤, 我也是查了很久, 發現如果改用 kbmMemTable1.FieldByName('DTYPE').AsString 就可以過了, 令人百思不得其解? 這用了好幾百年的寫法竟然過不去...
另外, 我發現自 idera接手後, 我個人實測的結果(以下純屬個人看法), idera 是資料庫為主的公司, 應該是有動了 xe 的內部設計, 因為不只這個問題, 事實上已有好幾個案例, 這些問題在 xe8 都不曾出現的
1. 在 debug mode 我的專案(不是本帖這個, 是我實際開發的), 在main form 開完後會引發 dbxerror (remote ....)
2. 用 listview Livebinging firedac table, 開啟 onitemdelete (即設定右滑可顯示 [Delete]按鈕), 當 record 在最後一筆時,
在 onitemdeleteEvent 上會造成 Argument out of range 問題(只要不是最後一筆就沒有問題), 如果是另外寫一個 button 來執行也不會引發錯誤
Event 的程式很簡單, 只有 FDTable1.Delete 而已
如果 Livebinging 不指定 * -> synch (同步), 也不會有問題, 但只要串起來, 就會錯誤

這些都是我們現有客戶反應過來的, 害得用戶覺得我們 app 換了新版很不穩定, 閃退機率很高,
諸如此類, 還有其他問題都是相關資料庫中莫名其妙的引發, 真不知道該如何繼續下去?????
===================引 用 GrandRURU 文 章===================
您的專案的確有測出您說的問題

一勞永逸的作法可使用:TDataSet.OnFilterRecord 事件,把您要篩選的方式寫在這個事件裡
這個方法從 Delphi 5 - 10.1都適用,也不用等 EMBT 去修正 Filter 的 BUG

僅供您參考

以上
編輯記錄
P.D. 重新編輯於 2016-10-11 12:22:27, 註解 無‧
P.D.
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2016-10-12 10:22:10 IP:118.160.xxx.xxx 未訂閱
獲李維老師的說明

建議 FireDac 的資料庫建立 不要用 [TEXT] 而必須使用 VARCHAR() 來定義, 我改了程式後, 的確問題就不存在了,
但這仍難以解釋在 Seattle 10 之前不管用 [TEXT] 或 [VARCHAR] 都不會有這個問題(我指的是在我的電腦環境)
而 Berline 10.1 (include Update 1) 卻會的問題, 但不管如何,
這個困擾一個月的事件, 總算可以告一段落
也提供各位之前 embd 教我們建立的做法
CREATE TABLE IF NOT EXISTS [PHRASE]
(
[DTYPE] TEXT,
[DNO] TEXT,
[PHRASE] TEXT,
[NUM] FLOAT,
[PICT1] BLOB
)

最好改成這樣
CREATE TABLE IF NOT EXISTS [PHRASE]
(
[DTYPE] VARCHAR(1),
[DNO] VARCHAR(6),
[PHRASE] VARCHAR(50),
[NUM] FLOAT,
[PICT1] BLOB
)
P.D.
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2016-10-12 18:43:31 IP:118.160.xxx.xxx 未訂閱
李維老師再回覆, 或許在 Berlin 10.1 之後, 原廠對資料庫的定義更嚴謹了, 
"這可能是因為以前版本的驅動程式和compiler比較寬鬆, 所以不會出錯,
但愈新的驅動程式和compiler愈來愈嚴格, 10.1 Berlin版的驅動程式和compiler已經不允許這樣混用所以出錯了"

所以, 之前版本所釋出的 [text] 用法就不要再用了唄!
也感謝 RuRu兄的協助測試, 本案就先告一段落實!
這個問題讓我足足用了十四天的時間反覆在捉及改寫, 唉~~~該怎麼說呢?
編輯記錄
P.D. 重新編輯於 2016-10-12 18:46:24, 註解 無‧
P.D. 重新編輯於 2016-10-12 18:48:11, 註解 無‧
系統時間:2024-03-28 19:07:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!