Delphi FireDAC 出現Variable length column[*] overflow. Value length - [80], column maximum length

遇到這個問題很奇怪,FireDAC的 TFDQuery組件訪問SQLlite數據庫,使用insert into語句插入一條數據長度爲80的字符串,但是用 select * from 查詢的時候卻出現異常:[FireDac][DatS]-32. Variable length column[Namee] overflow. Value length - [80], column maximum length - [40].,出現錯誤的原因我很清楚,數據庫中字段長度是40,無法讀取80個字節的數據,但是爲什麼插入的不提示錯誤,查詢的時候纔出現異常,這要是萬一插入超長的數據,以後就沒辦法讀取了,而且也不知道是那條數據超長了,因爲只要表中有一條超長的數據,select * from 語句就會返回這個異常,根本無法讀取整個表中的內容。

經過查詢資料,多次測試,找到了下面兩種解決方法

方法1:

修改TFDConnection下面的兩個屬性

  • FormatOptions.OwnMapRules 設置爲 True
  • FormatOptions.MapRules 添加兩個子項,第一個子項的兩個屬性 SourceDataType = dtWideString,TargetDataType = dtWideMemo;第二個子項的兩個屬性dtAnsiString, TargetDataType = dtWideMemo

上述方法是將字符串類型字段映射爲Memo類型的字段,Memo類型的字段是不判斷長度的,就不會出現這種異常了,使用TFDQuery.FieldByname('name').AsString可以獲取完整的80個字符。

這種方法存在一個問題,在使用DBGrid顯示這些數據的時候,會顯示爲TMemo也就是DBGrid不能直接將Memo類型顯示出來。


方法2:

修改TFDConnection下面的1個屬性

  • FormatOptions.StrsTrim2Len 設置爲True
這個方法是將超長的數據截斷,也就是隻取得前面40個字符。

發佈了94 篇原創文章 · 獲贊 10 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章