1

写出这个 if/else 语句是否有可能更简洁/有效的方式?我必须在这个数据库中的每个字段(接近 200 个字段)上检查 null 并且到最后代码看起来会很混乱。:\

if (dr["OLD_NUMBER"] != DBNull.Value)
{
    lblOldNumber.Text = dr["OLD_NUMBER"].ToString();
}
else
{
    lblOldNumber.Text = string.Empty;
}
// A bunch more with different lbls and columns
4

10 回答 10

12

你可以完全摆脱if

DBNull.Value.ToString()返回一个空字符串。

于 2013-01-10T15:54:03.647 回答
4

你可以做

lblOldNumber.Text = dr["OLD_NUMBER"] != DBNull.Value ? dr["OLD_NUMBER"].ToString() : string.Empty;

上面的语句需要更少的行并且对我来说看起来更具可读性。

于 2013-01-10T15:55:46.530 回答
1

根据经验,当您看到这种重复时,请编写一个函数来进行处理。

string FormatIt(object value) 
{
   return value.ToString(); // or whatever the logic is like
}

然后:

lblOldNumber.Text = FormatIt(dr["OLD_NUMBER"]);

所以,如果你不得不修改你的代码来格式化金钱或类似的东西,你有一个地方可以改变。

于 2013-01-10T15:58:31.483 回答
1

像这样的东西:

var labels = new Dictionary<string, YourLabelClass>
                         {
                             {"OLD_NUMBER", lblOldNumber},
                             //Add your 200 fields here 
                             {"ANOTHER_NUMBER", lblAnotherNumber},
                         };

        foreach (var label in labels)
        {
            label.Value.Text = dr[label.Key].ToString();
        }
于 2013-01-10T16:01:59.030 回答
1
lblOldNumber.Text = string.Empty;
if (dr["OLD_NUMBER"] != DBNull.Value)
{
    lblOldNumber.Text = dr["OLD_NUMBER"].ToString();
}

或者你可以制作像

void ApplyValue(Label label,object value, string defaultValue){
     label.Text =defaultValue;
     if (value != DBNull.Value)
     {
         label.Text = value.ToString();
     }
}

并使用下一个代码

ApllyValue(lblOldNumber,dr["OLD_NUMBER"],string.Empty);
于 2013-01-10T15:54:10.413 回答
1

您可以使用以下内容:

lblOldNumber.Text = dr["OLD_NUMBER"] != DBNull.Value ? dr["OLD_NUMBER"].ToString() : string.Empty;

有关 ?: 运算符而不是 if 的更多信息,可以在此处找到:(C# 参考)

于 2013-01-10T15:55:10.443 回答
0

我可能会写一个方法:

void TextOrNull(object item, Label lbl)
{
  lbl.Text = item != DBNull.Value ? item.ToString() : String.Empty;
}

并称它为:

TextOrNull(dr["OLD_NUMBER"], lblOldNumber);
于 2013-01-10T15:59:30.517 回答
0

我会制作一个包含此内容的方法,例如:

private void setLabelText( IDataRecord dr, string columnName, Label label )
{
    label.Text = string.Empty
    if (dr[columnName] != DBNull.Value)
    {
        label.Text = dr[columnName].ToString();
    }
}

然后用适当的标签和记录名称等简单地调用它。

setText( dr, "OLD_NUMBER", lblOldNumber );
于 2013-01-10T15:59:42.170 回答
0

我没有尝试过这么多,但是类ItemArray上有一个DataRow将返回DataRow. 可能能够以这种方式设置循环并测试值,而不是硬编码键的名称。

再次不确定这是否可行,因为我的 PC 上没有设置测试场景,但是像这样?

foreach (var col in dataRow.ItemArray)
{
    if(DBNull.Value != col)
        lbl.Text = col.ToString()
}
于 2013-01-10T16:05:54.233 回答
0

查询数据库时,您可以从数据集中删除空值。

var result = (context.MyTable.Where(c => c.OLD_NUMBER != null));
于 2013-01-10T15:56:26.733 回答