📌Oracle ORA-00904: "FALSE": 無效的 ID 解析與 C# EF Core LINQ to Entities 錯誤排查教學
【教學】Oracle ORA-00904: "FALSE": 無效的 ID ─ C# EF Core LINQ 錯誤排查完全解析
快速導讀:這篇將說明你在 C# .NET 專案,使用 Entity Framework Core 操作 Oracle 資料庫時,遇到 ORA-00904: "FALSE": 無效的 ID 這個經典錯誤的主因,並用實例教你怎麼改,從原理、症狀、最佳解決方案到防呆技巧一次整理給你!
什麼是 ORA-00904: "FALSE": 無效的 ID?
這是 Oracle Database 的一個經典 SQL 錯誤,意思是你的 SQL 查詢裡面用了資料庫「不認識」的欄位或語法。
例如直接在 SQL 裡寫 SELECT ... WHERE ... AND FALSE
或 ORDER BY TRUE
,Oracle 會直接噴錯:
ORA-00904: "FALSE": invalid identifier(無效的識別字)
實務開發情境 ─ C#、EF Core、LINQ to Entities 怎麼踩雷?
當你在 .NET 專案裡用 LINQ 查詢時,如果你直接在查詢條件用 C# 的 true
或 false
,這些語法會被翻成 SQL 執行。
但 Oracle SQL 並不認得 TRUE
或 FALSE
這種布林值 literal,只接受 1/0 或 'Y'/'N' 這種設計。
// 錯誤寫法:會產生 ORA-00904 var query = from x in db.MyTable where x.Status == "Active" && false select x;
這樣會在 Oracle SQL 被翻譯成 ... AND FALSE
,直接觸發錯誤。
常見踩雷點
- LINQ Where、OrderBy、Select 等查詢條件中直接用 true 或 false
- 三元運算
someCondition ? "Y" : false
(NG!) - 預設值直接設
false
或true
怎麼修?正確寫法一次看
-
所有查詢條件都必須用「可轉成資料庫可辨識的型別」:
- 字串:
""
- 數字:
0
- 資料庫設計欄位(如 'Y'/'N', 1/0)
- 字串:
-
千萬別在 LINQ 查詢裡用
false
或true
-
三元運算請回傳字串或數字,不要回傳 C# 布林值:
// 錯誤 select new { Flag = isOK ? "Y" : false // NG! } // 正確 select new { Flag = isOK ? "Y" : "N" }
-
條件過濾建議這樣寫:
// 假設 IS_VALID 是 'Y' / 'N' .Where(x => x.IS_VALID == "Y") // 如果要所有資料 //.Where(x => true) // 這樣沒意義且在 Oracle 也不保證一定過
實務除錯步驟(新手照做也不會錯)
- 全專案搜尋
false
、true
,檢查有無出現在 LINQ 查詢裡 - 任何查詢的 Select、Where、OrderBy、GroupBy 裡出現布林值,**改成字串或數字**
- 三元運算回傳請寫
""
、"Y"
、"N"
或0
,不要寫 C# 的false
真實案例:同事問我為何 Oracle Entity Framework 會噴 "FALSE" 無效的 ID?
某天專案在 GenerateAPSZRESULTC
方法加新欄位後,後端呼叫就爆 ORA-00904: "FALSE": 無效的 ID
。
原始寫法(踩雷範例):
select new APSZRESULTC { ..., ORI_PLAN_WEEK = z.ORI_PLAN_WEEK ?? false, // NG! }
改成這樣就沒問題:
select new APSZRESULTC { ..., ORI_PLAN_WEEK = z.ORI_PLAN_WEEK ?? "" }
結論:Oracle Entity Framework 查詢禁止用 C# 布林值
只要看到 ORA-00904: "FALSE": 無效的 ID,就代表你查詢裡有用到 false 或 true。請將所有欄位、條件轉換為資料庫可理解的資料型別,這樣你的查詢就會正常執行!
延伸閱讀
如果你喜歡這篇,歡迎 訂閱 或 分享 給同事,更多 .NET 與資料庫排錯技巧,持續更新中!
留言
張貼留言