数据表句柄 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 服务器中的 FixedPrice
和 ExtraCostsAmount
列可以包含 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 }
我使用 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 服务器中的 FixedPrice
和 ExtraCostsAmount
列可以包含 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 }