【问题标题】:how to convert database null field value to decimal in C#?如何在 C# 中将数据库空字段值转换为十进制?
【发布时间】:2019-10-23 14:45:28
【问题描述】:

我有一些数据类型为十进制的数据库字段,但它是 db 空字段。 所以,我想对这些字段做一些条件,但在与任何其他十进制值(例如 0.00)进行比较之前,我必须将这些字段转换为十进制,但我不知道如何将数据库空字段转换为十进制。

例如: 我有这两个字段。

string ltl_net_rate = Data.Fields["ufc_oe_pick_ticket_ud_wt_freight_out_net_plus"].FieldValue;
string total_shipment_weight = Data.Fields["ufc_oe_pick_ticket_ud_wt_pick_ticket_weight"].FieldValue;

然后我想做

if (ltl_netplus_rate_new < ltl_net_rate_new) then do something
if (ltl_net_rate_new < 0 || ltl_netplus_rate_new < 0) then do something

我使用了Convert.Todecimal,但它给了我输入字符串格式不正确的错误消息。

然后我知道这是 db 空字段,因此 Convert.Todecimal 无济于事。

谁能帮我解决这个问题?

【问题讨论】:

  • 添加检查以查看其是否为空。我会添加您如何做到这一点,但我不知道 Data 或 Fields 或 FieldValue 是什么类型以及您如何填充它。如果您需要更多帮助,我建议您添加 minimal reproducible example 或搜索 DBNull 检查 + 您在此处使用的任何类型。
  • decimal something = decimal.TryParse(Data.Fields["ufc_oe_pick_ticket_ud_wt_freight_out_net_plus"].FieldValue?.ToString(), out decimal myValue) ? myValue : 0; 类似的东西(不知道你的类型)。没有可重现的例子,仍然很难给你一个更简洁的例子。
  • Nullable&lt;T&gt; 类型会让你前进吗? decimal? ltl_net_rate = ...
  • 这对我有用。非常感谢
  • 您尝试过下面的解决方案可能会有所帮助吗?

标签: c# sql


【解决方案1】:

您可以通过以下方法使用通用扩展方法来解决您的问题

    public static T DBValue<T>(this object dbValue)
    {
        try
        {
            if (dbValue == DBNull.Value)
                return default;
            return (T)dbValue;
        }
        catch (InvalidCastException)
        {
            return (T) Convert.ChangeType(dbValue, typeof(T));
        }
    }

【讨论】:

    【解决方案2】:

    在从 DB 获取数据时检查 DbNull,如果它们为空,则分配一个默认值,例如 0.00。

    例如,当您获得以下数据时,请按如下方式检查 null。

    if (!DBNull.Value.Equals(Data.Fields["ufc_oe_pick_ticket_ud_wt_freight_out_net_plus"].FieldValue))
                {
                    string ltl_net_rate = Data.Fields["ufc_oe_pick_ticket_ud_wt_freight_out_net_plus"].FieldValue;
                }
                else
                {
                    string ltl_net_rate = 0.00;
    
                }
    
    
    
                if (!DBNull.Value.Equals(Data.Fields["ufc_oe_pick_ticket_ud_wt_pick_ticket_weight"].FieldValue))
                {
                    string total_shipment_weight = Data.Fields["ufc_oe_pick_ticket_ud_wt_pick_ticket_weight"].FieldValue;
                }
                else
                {
                    string total_shipment_weight = 0.00;
                }
    

    否则在 if 语句中一次性将字符串值转换为十进制(或稍后再做)

    decimal ltl_netplus_rate_new  = Convert.ToDecimal(ltl_net_rate);
    

    【讨论】:

    • @RaviPatel 欢迎您。如果这有帮助,请投票给答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2010-10-03
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多