2

我有一个由表填充的 Datalist,当我尝试从 Datalist 更新表时出现异常:“无法将参数值从 String 转换为 Double”

这是更新按钮的点击:

for (int x = 0; x < dlQtyBreak.Items.Count; x++)
{
    DataListItem item = dlQtyBreak.Items[x];

    string linenum = ((Label)item.FindControl("lblPBLinenum")).Text;
    string lowqty = ((TextBox)item.FindControl("txtPBLowQty")).Text;
    string highqty = ((TextBox)item.FindControl("txtPBHighQty")).Text;
    string price = ((TextBox)item.FindControl("txtPBPrice")).Text;
    string salesprice = ((TextBox)item.FindControl("txtPBSalesPrice")).Text;
    DAL.Util.updatePriceBreakRow(IQPDID(), lowqty, highqty, price, salesprice, linenum);

}

下一个代码是 sql 和参数

public static void updatePriceBreakRow(string IQPDID, string low, string high, string price, string sPrice, string linenum)
{
    string sql = "UPDATE ItemQtyPriceDiscTable SET  LowQuantity=@LowQty, HighQuantity=@HighQty, Price=@Price WHERE linenum=@lineNum";

    AdoUtil.ACESSQLParameterCollection parameters = new AdoUtil.ACESSQLParameterCollection();
    AdoUtil.ACESSQLParameter param = new AdoUtil.ACESSQLParameter();

    param.ParamName = "@IQPDID";
    param.ParamValue = IQPDID;
    param.ParamDBType = SqlDbType.Int;
    parameters.Add(param);

    param.ParamName = "@LowQty";
    param.ParamValue = low;
    param.ParamDBType = SqlDbType.Float;
    parameters.Add(param);

    param.ParamName = "@HighQty";
    param.ParamValue = high;
    param.ParamDBType = SqlDbType.Float;
    parameters.Add(param);

    param.ParamName = "@Price";
    param.ParamValue = price;
    param.ParamDBType = SqlDbType.Float;
    parameters.Add(param);

    param.ParamName = "@SalePrice";
    param.ParamValue = sPrice;
    param.ParamDBType = SqlDbType.Float;
    parameters.Add(param);

    param.ParamName = "@linenum";
    param.ParamValue = linenum;
    param.ParamDBType = SqlDbType.Int;
    parameters.Add(param);

    param.ParamName = "@update";
    param.ParamValue = lastUpdate;
    param.ParamDBType = SqlDbType.VarChar;
    parameters.Add(param);

    AdoUtil.ExecuteNonQuery(sql, parameters);
}

这可能是什么原因造成的?当我在另一个数据列表上执行相同的过程时,它可以工作,唯一的区别是该表使用所有 Int 和 varchar 值,而该表使用 Float 和 varchar。如果有人有任何有用的见解来帮助解决这个问题,我们将不胜感激。如果有任何其他可能有用的代码,请问我可以发布它。

谢谢你。

4

4 回答 4

1

您的其他代码有效,因为它们使用的是 varchar datatpe,并且字符串基本上转换为 varchar。但是,在这种情况下,您需要将这些数据类型转换或转换为 double。因为字符串不能隐式转换为双精度。这是解决方案;

param.ParamName = "@LowQty";
param.ParamValue = Convert.ToDouble(low);
param.ParamDBType = SqlDbType.Float;
parameters.Add(param);

您需要对所有其他双参数执行此操作。

于 2012-08-21T15:04:48.017 回答
1

既然您说您的所有测试都没有为“SalesPrice”填充值,请尝试删除或注释掉

param.ParamName = "@SalePrice";
param.ParamValue = sPrice;
param.ParamDBType = SqlDbType.Float;
parameters.Add(param);

然后像以前一样运行它,看看结果是否相同。它可能会挂在那个空字符串上。

如果它确实是导致它的原因,只需在其中添加一个检查,然后排除该参数

于 2012-08-21T15:13:21.537 回答
0

它看起来像是一个可以快速解决的错误 - 尝试这些事情并评论您喜欢的内容。

  • 尝试替换浮动中控件的读数,将 SQL 值与默认的 5f 相关联 - 看看它是否是演员表问题。如果是这样,请调用必要的强制转换方法。
  • 尝试注释代码的真实部分并使用默认值来测试机制本身。
  • 了解机制后,尝试注释掉部分代码,直到找到正确的位置。
  • 最后在代码中添加日志,了解错误的具体位置

评论我的回答你找到的具体帮助

于 2012-08-21T15:10:23.597 回答
0
public static void updatePriceBreakRow(string IQPDID, string low, string high, string price, string sPrice, string linenum)
{
    string sql = "UPDATE ItemQtyPriceDiscTable SET  LowQuantity=@LowQty, HighQuantity=@HighQty, Price=@Price WHERE linenum=@lineNum";

    AdoUtil.ACESSQLParameterCollection parameters = new AdoUtil.ACESSQLParameterCollection();
    AdoUtil.ACESSQLParameter param = new AdoUtil.ACESSQLParameter();

    param.ParamName = "@IQPDID";
    param.ParamValue =Convert.ToInt32(IQPDID);
    param.ParamDBType = SqlDbType.Int;
    parameters.Add(param);

    param.ParamName = "@LowQty";
    param.ParamValue =(float)Convert.ToDouble(low);
    param.ParamDBType = SqlDbType.Float;
    parameters.Add(param);

    param.ParamName = "@HighQty";
    param.ParamValue =(float)Convert.ToDouble(high);
    param.ParamDBType = SqlDbType.Float;
    parameters.Add(param);

    param.ParamName = "@Price";
    param.ParamValue = (float)Convert.ToDouble(price);
    param.ParamDBType = SqlDbType.Float;
    parameters.Add(param);

    param.ParamName = "@SalePrice";
    param.ParamValue =(float)Convert.ToDouble(sPrice);
    param.ParamDBType = SqlDbType.Float;
    parameters.Add(param);

    param.ParamName = "@linenum";
    param.ParamValue =Convert.ToInt32(linenum);
    param.ParamDBType = SqlDbType.Int;
    parameters.Add(param);

    param.ParamName = "@update";
    param.ParamValue = lastUpdate;
    param.ParamDBType = SqlDbType.VarChar;
    parameters.Add(param);

    AdoUtil.ExecuteNonQuery(sql, parameters);
}
于 2012-08-21T15:10:43.930 回答