【问题标题】:Datatable handle DB NULL数据表句柄 DB NULL
【发布时间】:2021-05-03 12:56:52
【问题描述】:

我使用 Azure 函数连接到 SQL Server 数据库,并尝试创建数据表

string GetAllItems = String.Format("SELECT * FROM dbo.vw_SO_Leg WHERE Customer=" + Customer);

using (var adp = new SqlDataAdapter(GetAllItems, str))
using (DataTable datatable = new DataTable())
{
    adp.Fill(datatable);
    var temp = datatable;

    DataSet ds = new DataSet();
    DataTable dt = new DataTable();

    dt.Columns.Add("Customer");
    dt.Columns.Add("Amount");

    foreach (DataRow item in datatable.Rows)
    {
        double FixedPrice = Convert.ToDouble(item["FixedPrice"]);
        double ExtraCostsAmount = Convert.ToDouble(item["ExtraCostsAmount"]);
        double Amount = FixedPrice + ExtraCostsAmount

        dt.Rows.Add(Customer, Amount);
    }

    ds.Tables.Add(dt);
}

问题是 SQL Server 中的 FixedPriceExtraCostsAmount 列可以包含 Null 值,当我尝试运行它时出现错误。我尝试了 try/catch 和 if 语句。但是该变量在语句之外不可用。任何人都可以帮助我吗?提前致谢

【问题讨论】:

  • 一种解决方案是使用 Dapper(而不是 DataTables),并使用 double? 作为类型。 DBNull 很痛苦。

标签: c# sql-server datatable dataset dbnull


【解决方案1】:

您的代码的问题是双精度是原始数据类型,不能为空。 一种解决方案是通过使用可空运算符“?”来声明可空双精度数。在类型定义处。 这样,您的代码就不会崩溃,因为它会容忍该变量的空值。

基本上你能做的是

 foreach (DataRow item in datatable.Rows)
                {
                    double? FixedPrice = Convert.ToDouble(item["FixedPrice"]);
                    double? ExtraCostsAmount = Convert.ToDouble(item["ExtraCostsAmount"]);
                    double? Amount = FixedPrice + ExtraCostsAmount

                    dt.Rows.Add(Customer, Amount);
                }
                ds.Tables.Add(dt);

但是,为了您的业务需求,您可能希望以某种方式处理这些空值,并通过首先检查它们来避免空值。

if(FixedPrice is null || ExtraCostsAmount is null  || Amount is null) { //skip }
else { //do stuff } 

【讨论】:

  • 不幸的是,DBNull 和 null 不是一回事。
  • 您是否检查过 sql db 表上的列是否可以为空?如果这不会给您任何异常,您可以尝试将整个块包围在 try catch 块中,然后将 try-catch 放在 using 语句中。
【解决方案2】:

您可以尝试使用 Double.TryParse 方法。

这是文档https://docs.microsoft.com/en-us/dotnet/api/system.double.tryparse?view=net-5.0

【讨论】:

    【解决方案3】:

    要处理 DB null 你可以试试这个:

    foreach (DataRow item in dt.Rows)
    {
        double FixedPrice = Convert.ToDouble(item["FixedPrice"] == DBNull.Value ? 0 : item["FixedPrice"]);
        double ExtraCostsAmount = Convert.ToDouble(item["ExtraCostsAmount"] == DBNull.Value ? 0 : item["ExtraCostsAmount"]);
        double Amount = FixedPrice + ExtraCostsAmount;
        dt.Rows.Add(Customer, Amount);
    }
    

    【讨论】:

    • @OlivierRogier 你能解释一下吗?我做错什么了吗?
    • @.Linker 解释什么?是什么让你觉得有问题?
    • 哦!我以为我犯了一个错误。谢谢@OlivierRogier。 :)
    猜你喜欢
    • 2015-08-04
    • 2018-04-05
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2021-11-28
    相关资源
    最近更新 更多