错误:Linq中的用户代码未解析FormatException如何解决?

时间:2010-04-07 14:28:19

标签: asp.net visual-studio-2008 linq entity-framework c#-3.0

alt text http://i43.tinypic.com/5l8op0.jpg

请看下面这些代码告诉我:FormatException未被用户代码

处理

代码:

 satis.KDV = Decimal.Parse((from o in genSatisctx.Urun where o.ID == UrunID select o.Kdv).ToString());

如何重写linq查询?

3 个答案:

答案 0 :(得分:2)

您在查询上调用ToString而不是单个结果。即使您只希望一个值与您的查询匹配,它也不会只返回一个值。您必须使用SingleFirstLast或其中的变体来指示它执行此操作,这些变体也会返回默认值(SingleOrDefaultFirstOrDefaultLastOrDefault)。

为了避免异常,您可以将其更改为使用Decimal.TryParse,或者如果LINQ查询返回无法正确解析的内容,您可以将代码更改为使用默认值。我推荐前者或组合。

请注意,在以下示例中,我已将调用添加到SingleOrDefault。这确保只解析一个值,即使没有找到值,并且如果有多个结果,我们会得到一个异常(即它强制我们得到的结果恰好为零或一个)。

decimal parsedValue;
if (Decimal.TryParse(
     genSatisctx
     .Urun
     .Where(o => o.ID == UrunID)
     .Select(o=>o.Kdv)
     .SingleOrDefault()
     .ToString(), out parsedValue))
{
   satis.KDV = parsedValue;
}

答案 1 :(得分:1)

您在ToString()上呼叫IQueryable<T> - 您对字符串的期望是什么?它不太可能是任何可以解析为十进制数的东西!

我的猜测是你要拨打First()Single(),但如果没有更多信息我们就无法说出来。什么是o.Kdv的类型?

我怀疑你要么:

satis.KDV = (from o in genSatisctx.Urun 
             where o.ID == UrunID 
             select o.Kdv).First();

string kdvString = (from o in genSatisctx.Urun 
                    where o.ID == UrunID 
                    select o.Kdv).First();
decimal kdv;
if (decimal.TryParse(kdvString, out kdv))
{
    satis.KDV = kdv;
}
else
{
    // What do you want to do if it's not valid?
}

答案 2 :(得分:0)

当我使用调试模式时,我看到数据在超过鼠标时更新,在此方法结束后(它显示此消息[输入字符串的格式不正确]

 /*   protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
           try
          {

            TextBox name = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtEditName");
            SqlDataSource2.UpdateParameters["Name"].DefaultValue = name.ToString();

            TextBox age = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtEditAge");
            SqlDataSource2.UpdateParameters["Age"].DefaultValue = age.ToString();

            TextBox birthday = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtEditBirthday");
            SqlDataSource2.UpdateParameters["Birthday"].DefaultValue = birthday.ToString();

            DropDownList country = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("DropEditCountry");
            SqlDataSource2.UpdateParameters["CountryID"].DefaultValue = country.SelectedValue;


            TextBox mobile = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtEditMobile");
            SqlDataSource2.UpdateParameters["Mobile_No"].DefaultValue = mobile.ToString();
            SqlDataSource2.Update();
        }
        catch (Exception j)
       {
       j.Message.ToString();
       }
    }

/* }