2

テーブルによって入力されたデータリストがあり、データリストからテーブルを更新しようとすると、例外が発生します:「パラメーター値を文字列からダブルに変換できませんでした」

更新ボタンのクリックは次のとおりです。

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

すべてのテストで「SalesPrice」の値が入力されていないと言っているので、削除またはコメントアウトしてみてください

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

次に、これまでと同じように実行して、同じ結果になるかどうかを確認します。それはその空の文字列を保持している可能性があります。

そして、それが原因であることが判明した場合は、そこにチェックを追加してから、そのパラメータを除外します

于 2012-08-21T15:13:21.537 に答える
1

varchar datatpe を使用していて、文字列が基本的に varchar に変換されるため、他のコードは機能します。ただし、この状況では、これらのデータ型を double にキャストまたは変換する必要があります。string は暗黙的に double に変換できないためです。これが解決策です。

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

他のすべての double パラメータに対してこれを行う必要があります。

于 2012-08-21T15:04:48.017 に答える