数据表句柄 DB NULL

Datatable handle DB NULL

我使用 Azure 函数连接到 SQL 服务器数据库,我正在尝试制作数据表

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 服务器中的 FixedPriceExtraCostsAmount 列可以包含 Null 值,当我尝试 运行 这个。我尝试了 try/catch 和 if 语句。但是变量在语句之外不可用。任何人都可以帮助我吗?提前致谢

要处理 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);
}

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

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

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

基本上你可以做的是

 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 }