格式异常未处理c#

时间:2016-06-28 03:13:40

标签: c#

我正在尝试在我的桌面c#应用程序中保存一组记录,并且它似乎停止,因为其中一个值的格式不正确。

在保存之前,系统会完成以下计算:

private void ComputeTotalWeight()
    {
        double TotalWeight;
        TotalWeight = ((Convert.ToInt32(txtSmall.Text)) + (Convert.ToInt32(txtMedium.Text)) + (Convert.ToInt32(txtLarge.Text)) + 
            (Convert.ToInt32(txtExtralarge.Text))) * .285;
        txtTotalweight.Text = String.Format("{0:#,##0}", TotalWeight);

    }

    private void ComputeTagsCollars()
    {
        int TagsCollars;
        TagsCollars = Convert.ToInt32(txtSmall.Text) + Convert.ToInt32(txtMedium.Text) 
            + Convert.ToInt32(txtLarge.Text) + Convert.ToInt32(txtExtralarge.Text);
        txtTags.Text = String.Format("{0:#,##0}", TagsCollars);
        txtCollars.Text = String.Format("{0:#,##0}", TagsCollars);

    }

但是一旦我保存,似乎有一个GrandTotal计算的问题:

enter image description here

我怀疑错误来自这个计算:

private void ComputeGrandTotal()
    {
        double GrandTotal;
        GrandTotal = (((Convert.ToInt32(txtSmall.Text) + Convert.ToInt32(txtMedium.Text) + Convert.ToInt32(txtLarge.Text) + 
            Convert.ToInt32(txtExtralarge.Text)) * .285) * 315);

        double TagsCollars;
        TagsCollars = Convert.ToInt32(txtSmall.Text) + Convert.ToInt32(txtMedium.Text) + Convert.ToInt32(txtLarge.Text) + Convert.ToInt32(txtExtralarge.Text);
        txtTags.Text = String.Format("{0:#,##0}", TagsCollars);
        txtCollars.Text = String.Format("{0:#,##0}", TagsCollars);

        lblGrandtotal.Text = String.Format("{0:#,###,##0}", (GrandTotal + TagsCollars + TagsCollars));

    }

我已尝试评论所有与GrandTotal相关的值和功能,并且记录开始保存没有问题。这是我的保存功能的副本:

private void InsertNewRecord()
    {
        SqlCommand cmdInsert = new SqlCommand();
        cmdInsert.Connection = cn;
        cmdInsert.CommandType = CommandType.Text;
        //cmdInsert.CommandType = CommandType.StoredProcedure;

        cmdInsert.Parameters.AddWithValue("@QtySmall", Convert.ToInt32(txtSmall.Text));
        cmdInsert.Parameters.AddWithValue("@QtyMedium", Convert.ToInt32(txtMedium.Text));
        cmdInsert.Parameters.AddWithValue("@QtyLarge", Convert.ToInt32(txtLarge.Text));
        cmdInsert.Parameters.AddWithValue("@QtyExtralarge", Convert.ToInt32(txtExtralarge.Text));
        cmdInsert.Parameters.AddWithValue("@QtyTags", Convert.ToInt32(txtTags.Text));
        cmdInsert.Parameters.AddWithValue("@QtyCollars", Convert.ToInt32(txtCollars.Text));
        cmdInsert.Parameters.AddWithValue("@TotalWeight", Convert.ToInt32(txtTotalweight.Text));
        cmdInsert.Parameters.AddWithValue("@NoWorkers", Convert.ToInt32(txtWorkersno.Text));
        cmdInsert.Parameters.AddWithValue("@NoMachines", Convert.ToInt32(txtMachinesno.Text));
        cmdInsert.Parameters.AddWithValue("@BomStatus", SqlDbType.VarChar).Value = txtStatus.SelectedItem.ToString();
        cmdInsert.Parameters.AddWithValue("@StartDate", SqlDbType.DateTime).Value = dtpStart.Value;
        cmdInsert.Parameters.AddWithValue("@EndDate", SqlDbType.DateTime).Value = dtpEnd.Value;
        cmdInsert.Parameters.AddWithValue("@GrandTotal", Convert.ToInt32(lblGrandtotal.Text));
        cmdInsert.CommandText = " INSERT INTO BillOfMaterials2 " + " (QtySmall, QtyMedium, QtyLarge, QtyExtralarge, QtyTags, QtyCollars, TotalWeight, NoWorkers, NoMachines, BomStatus, StartDate, EndDate, GrandTotal) VALUES (" + "@QtySmall, @QtyMedium, @QtyLarge, @QtyExtralarge, @QtyTags, @QtyCollars, @TotalWeight, @NoWorkers, @NoMachines, @BomStatus, @StartDate, @EndDate, @GrandTotal)";
        //cmdInsert.CommandText = "spInsertBom";



        cmdInsert.ExecuteNonQuery();
    }

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

第一,我不会尝试使用convert将textbox.text值转换为Int32;更好用

tableView

这确保文本可以转换为整数,如果不是,则返回0作为返回值。

然后在你的save方法中 - 你的@GrandTotal参数试图保存到什么数据类型? - 你的数据库中的类型是什么?它们是否匹配 - 如果不匹配,您将获得格式异常,您的数据(类型)与列类型的格式(类型)不同。

op在文本框中没有有效的数字:

switch selectedSegmentIndex {
    case 0: //Segment 1
          self.dataSource = /*update your dataSource here for Segment 1*/

    case 1: //Segment 2
          self.dataSource = /*update your dataSource here for Segment 2*/

    case 2: //Segment 3
          self.dataSource = /*update your dataSource here for Segment 3*/

    default: break

   /*IMPORTANT*/
   self.tableView.reloadData()
}

这就是为什么他设置参数值的代码= lblGrandtotal.Text它不是一个数字,它有格式化逗号等等。他需要删除那些才能使它工作,使用Int.TryParse会很容易地揭示这个。< / p>

答案 1 :(得分:1)

它从这里开始 - 首先你用逗号在你的格式字符串中加上十进制。

lblGrandtotal.Text = String.Format("**{0:#,###,##0}**", (GrandTotal + TagsCollars + TagsCollars));

另外,稍后在您的代码中存储INT int数据库,当它实际为十进制时。 并且如ken所述,使用tryparse将值从string转换为....

答案 2 :(得分:1)

这里有一些问题涉及其他一些帖子,但是,真正突出的(在我看来)是你没有验证输入数据,这有很多原因的风险,要求未来的头痛和造成这些问题。此外,您还可以使用标准的数字输入控件。如果有某种原因你不能使用它们,你应该验证输入,如果数据无效,则处理它。以下是验证然后处理无效输入的快速方法。

private void ComputeGrandTotal()
{
    //Since there are values that need to be validated and converted to integers for use in two calculations...
    int smll, mdm, lg, xl;
    //Validate the inputs can be converted and set the appropriate variable values at the same time
    if (Int32.TryParse(txtSmall.Text, out smll) //using TryParse sets the integer variable values only if they can successfully be converted
        && Int32.TryParse(txtMedium.Text, out mdm)
        && Int32.TryParse(txtLarge.Text, out lg)
        && Int32.TryParse(txtExtralarge.Text, out xl)
        )
    {
        int ttl = smll + mdm + lg + xl;
        double GrandTotal, TagsCollars;
        TagsCollars = ttl;
        GrandTotal = TagsCollars * .285 * 315;

        txtTags.Text = $"{TagsCollars:#,##0}"; //Resharper suggested simplification of String.Format("{0:#,##0}", TagsCollars)....I believe ReSharper
        txtCollars.Text = $"{TagsCollars:#,##0}";
        lblGrandtotal.Text = $"{(GrandTotal + TagsCollars + TagsCollars):#,###,##0}";

    }

}

这将完成工作,但它非常不灵活。每个输入必须成功转换为整数,否则将失败。更好,更耗时的方法是这样的:

    int smll;//, mdm, lg, xl;
    try
    {
        smll = Convert.ToInt32(txtSmall.Text);

    }
    catch (FormatException)
    {
        smll = 0;
        //txtSmall.Text value can't be converted to an integer
    }
    catch (Exception)
    {
        //some other issue occurred and you're probably better off just exiting entirely
        return;
    }

有更灵活的方法,例如使用数字样式等,但是,它们的灵活性是以你必须更加了解你编码的内容和方式的影响为代价的。有时,培训客户比编写您不自信的代码更安全。

答案 3 :(得分:0)

您正在尝试解析lblGrantotal.Text中的整数,但是您获得了FormatException,这意味着lblGranTotal中的文本不会被识别为数字。也许你使用逗号而不是点作为小数点分隔符,或类似的东西。