我有一个由表填充的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。如果有任何人有任何有用的见解来帮助解决这个问题,将不胜感激。如果有任何其他代码可能有用,请问我可以发布它。
谢谢。
答案 0 :(得分:1)
您的其他代码有效,因为它们使用的是varchar datatpe,而string基本上已转换为varchar。但是,在这种情况下,您需要将这些数据类型转换或转换为double。因为字符串不能隐式转换为double。这是解决方案;
param.ParamName = "@LowQty";
param.ParamValue = Convert.ToDouble(low);
param.ParamDBType = SqlDbType.Float;
parameters.Add(param);
您需要为所有其他双参数执行此操作。
答案 1 :(得分:1)
由于您说所有测试都没有为“SalesPrice”填充的值,请尝试删除或注释掉
param.ParamName = "@SalePrice";
param.ParamValue = sPrice;
param.ParamDBType = SqlDbType.Float;
parameters.Add(param);
然后像过去一样运行它,看看是否会产生相同的结果。它可能会阻止那个空字符串。
如果它确实是什么导致它只是在那里添加一个检查然后排除该参数
答案 2 :(得分:0)
这看起来像是一个快速可解决的错误 - 尝试这些事情并评论你喜欢的内容。
评论我的回答您找到的具体帮助
答案 3 :(得分: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);
}