【问题标题】:#NULL is not a valid value for Int32#NULL 不是 Int32 的有效值
【发布时间】:2013-05-02 17:19:25
【问题描述】:

在调试代码时,我收到错误#NULL is not a valid value for Int32

private void satelliteComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    Helper.SetWaitCursor();
    if (satelliteComboBox.SelectedValue != null)
    {
        var satelliteId = Convert.ToInt32(satelliteComboBox.SelectedValue);
        satelliteStatusUserControl.DataSource = 
            _satelliteStatusBusinessService.GetSingleSatellite(
                new Dictionary<string, object> { { "SatelliteID", satelliteId } }, true);
        //2012.07.07 get colors for all machine status
        satelliteStatusUserControl.DataSource.DefectColors = 
                  _satelliteStatusBusinessService.GetDefectColors().ToList();

        foreach (var defectColor in 
                      satelliteStatusUserControl.DataSource.DefectColors)
        {
            MachineStatusCtrl.AddMachineStatusColors(
                         defectColor.DefectTypeID, 
                         defectColor.DefectType, 
                         defectColor.OEEColor);
        }
        //2012.07.07
        satelliteStatusUserControl.DataBind();
    }
    Helper.SetDefaultCursor();
}

我在foreach 循环中收到此错误

更新:这是AddMachineStatusColors的实现

public static void AddMachineStatusColors(int statusColorId, string StatusName, string oeeColor)
{         
    MacStatusColors macStatusColor;

    //add dummy colors with unknow till the next defectId so that it will be easy to get color later while painting.            
    for(int Index = StatusColors.Count; Index < statusColorId ; Index++)
    {
        macStatusColor = new MacStatusColors();
        StatusColors.Add(macStatusColor);
    }

    macStatusColor = new MacStatusColors();
    macStatusColor.DefectTypeID = statusColorId;
    macStatusColor.DefectType = StatusName;
    macStatusColor.OEEColor1 = ControlPaint.Dark(getColorFromString(oeeColor));
    macStatusColor.OEEColor2 = ControlPaint.Light(getColorFromString(oeeColor));
    StatusColors.Add(macStatusColor);
}



    public static Color getColorFromString(string oeeColor)
    {            
        if (oeeColor[0] != '#') { oeeColor = '#' + oeeColor; }
        return System.Drawing.ColorTranslator.FromHtml(oeeColor);
    }

【问题讨论】:

  • 请先调试,然后告诉我们错误发生在哪一行。另外,satelliteComboBox.SelectedValue 的值是多少。
  • 你在哪一行得到错误?
  • 您在哪一行代码上遇到此错误?
  • 当我在 sql 中将颜色设置为 null 时,每个循环 defectColor.OEEColor 都会出现此错误
  • 您是从数据库查询中绑定列表吗?查询是否返回DBNull.Value,即NULL 作为结果之一?

标签: c# .net


【解决方案1】:

好吧,defectColor.OEEColor 似乎是 null,而您的数据模型不允许该值为 null。三种可能的解决方案:

  1. 更改数据模型,使字段可以是null
  2. 确保defectColor.OEEColor 不是null
  3. 将行改为:

    MachineStatusCtrl.AddMachineStatusColors(..., ..., defectColor.OEEColor ?? &lt;default value&gt;);

&lt;default value&gt; 为 0 或您想用来表示“颜色为 null”的任何其他 int 值。


您添加了AddMachineStatusColors 方法的代码。谢谢,但我仍然说您的代码假定defectColor.OEEColor 不是null。您的代码中至少有两行我认为defectColor.OEEColor 可能不是null

macStatusColor.OEEColor1 = ControlPaint.Dark(getColorFromString(oeeColor));
macStatusColor.OEEColor2 = ControlPaint.Light(getColorFromString(oeeColor));

请显示getColorFromString 的代码,或者告诉我们您的AddMachineStatusColors 方法的哪一行发生了错误!


好的,现在我们到了某个地方。 defectColor.OEEColor 包含字符串值“null”!!这意味着,defectColor.OEEColor 本身不是null,但它包含单词“null”

因此,以下行将单词“null”转换为“#null”(因此您关于“#null is not a valid value...”的奇怪问题标题):

if (oeeColor[0] != '#') { oeeColor = '#' + oeeColor; }

在那之后oeeColor 的值为“#null”,然后以下行(我想,因为您没有向我们提供有关异常真正发生的行的任何详细信息...)引发错误:

return System.Drawing.ColorTranslator.FromHtml(oeeColor);

您必须确保 defectColor.OEEColor 既不是 null(即“没有值”)并且它的值是有效的 HTML 颜色字符串!

【讨论】:

  • 在选项 3 中我无法添加?? (此代码)它正在抛出异常
  • 选项 2 我做不到,因为我的数据库中需要空颜色和有效颜色
  • 你读过你应该为&lt;default value&gt;写的东西吗?请展示AddMachineStatusColors 方法的实现,以便我们进一步帮助您。
  • public void AddMachineStatus(DateTime startDateTime, DateTime endDateTime, int defectTypeId, bool status);
  • 代码,而不是声明。此外,这是与您在代码中使用的声明不同的另一种声明。我在你的代码中看不到和DateTimes。请尽量在您发布的内容中保持一致。
【解决方案2】:

如果您收到的整数可能为 null,则它可能是 Nullable&lt;Integer&gt;,这意味着它将具有 .HasValue 属性...

foreach (var defectColor in satelliteStatusUserControl.DataSource.DefectColors)
{
    if(defectColor.OEEColor.HasValue) {
        MachineStatusCtrl.AddMachineStatusColors(defectColor.DefectTypeID, defectColor.DefectType, defectColor.OEEColor);
    } else {
        //Use a default
        MachineStatusCtrl.AddMachineStatusColors(defectColor.DefectTypeID, defectColor.DefectType, 0);
    }
}

【讨论】:

    【解决方案3】:
    int? satelliteId;
    int i;
    if (satelliteComboBox.SelectedValue != null && int.tryParse(satelliteComboBox.SelectedValue, out i))
    {
        satellideId = i;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 2016-08-26
      • 1970-01-01
      • 2019-09-05
      • 2016-12-17
      • 2013-07-30
      • 2020-12-06
      • 2021-01-13
      • 2013-08-03
      相关资源
      最近更新 更多