簡體   English   中英

Dapper 和大於 decimal.MaxValue 的值

[英]Dapper and values greater than decimal.MaxValue

我的團隊有一個只讀的 REST API,我們公司生產的其他產品可以使用它從我們的產品中檢索信息。 API 在 C# 中使用 Dapper 從 Oracle 數據庫中讀取。 由於 1) 精度在此上下文中很重要,並且 2) 它是最適合 Oracle 數字列類型的類型,因此我們將數據庫中的值讀取到 C# decimal變量中。

我們遇到過這樣的情況,客戶從 API 中收到錯誤,因為他們的系統中有一些錯誤的數據。 通常 API 可以很好地處理壞數據,但是在這種情況下,數據是一個 30 位數字,它大於decimal.MaxValue 當 API 嘗試檢索此值時,我們從 Dapper 中收到“列名稱為 <null>”錯誤,這 1) 對跟蹤問題不是很有幫助,因為它可以很好地處理空值,並且 2) 導致整個數據庫讀取失敗。

我們強烈希望保留進入系統的不良數據,以便客戶可以看到它並找出它的來源(因為它可能表明上游系統中存在問題),因此我們不想修復數據庫中的數據來解決這個問題。 而且,如前所述,我們希望堅持使用decimal以保持精度。 但是,其他下游產品不一定需要提供這些不良數據(匯總數據並修復其中的錯誤是我們產品的主要重點)。 有什么方法可以讓 Dapper 在這個查詢上取得成功,並簡單地發出 null 代替不適合decimal

從 Oracle 12 開始,您可以向表中添加一個虛擬列:

ALTER TABLE table_name ADD (
  your_column_safe GENERATED ALWAYS AS (
    CASE
    WHEN your_column
         BETWEEN -79228162514264337593543950335 -- .Net decimal.MinValue
         AND     +79228162514264337593543950335 -- .Net decimal.MaxValue
    THEN your_column
    ELSE NULL
    END
  )
);

然后,對於樣本數據:

CREATE TABLE table_name ( your_column NUMBER );

INSERT INTO table_name (your_column)
SELECT 0 FROM DUAL UNION ALL
SELECT -POWER(2,96) + 1 FROM DUAL UNION ALL
SELECT +POWER(2,96) - 1 FROM DUAL UNION ALL
SELECT -POWER(2,96) FROM DUAL UNION ALL
SELECT +POWER(2,96) FROM DUAL UNION ALL
SELECT -1e31 FROM DUAL UNION ALL
SELECT +1e31 FROM DUAL;

然后:

SELECT * FROM table_name;

輸出:

Your_COLUMN 你的_COLUMN_SAFE
0 0
-79228162514264337593543950335 -79228162514264337593543950335
79228162514264337593543950335 79228162514264337593543950335
-79228162514264337593543950336 <空>
79228162514264337593543950336 <空>
-10000000000000000000000000000000 <空>
10000000000000000000000000000000 <空>

然后將 dapper 更改為從虛擬列而不是實際列讀取。

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM