0

ドロップダウンリストがあります。ボタン クリック イベントで、選択した値を取得し、それを整数に変換して、データベースの既存の行に保存します。次のエラーが表示されます。

「無効なキャスト例外がキャッチされました。

SqlParameterCollection は、SqlCommand オブジェクトではなく、null 以外の SqlParameter タイプ オブジェクトのみを受け入れます。」


注: ブレークポイントを使用してデバッグを行うと、整数をパラメーターとして送信しようとしているように見えます。選択したドロップダウン値の変数の内容を表示する小さなポップアップ ウィンドウで、値を囲む引用符が表示されません。

注: SQL Server でストアド プロシージャを直接実行すると、テーブル内の行が正常に更新されます。

ページソースからのドロップダウンリストは次のとおりです。

    <select name="ctl00$ContentPlaceHolder1$CustomerDetailsEdit1$ShippingRegionDropDownList" id="ctl00_ContentPlaceHolder1_CustomerDetailsEdit1_ShippingRegionDropDownList" style="width:200px;">
<option value="1">Please Select</option>
<option value="2">U.S. / Canada</option>
<option value="3">Europe</option>
<option selected="selected" value="4">Rest of World</option>

値を取得して整数に変換するボタン クリック イベントを次に示します (これは、おそらく 3 回目か 4 回目の変換の試みです。変換プロセスに問題があると推測しています。解析と変換を試みました。)

    protected void Button2_Click(object sender, EventArgs e)
{
    // Get the current user's ID.
    string customerId = Membership.GetUser(HttpContext.Current.User.Identity.Name).ProviderUserKey.ToString();
    // Get the values from the text box controls        
    int shippingRegionId = Int32.Parse(ShippingRegionDropDownList.SelectedValue);

    try
    {
        // Execute the update command
        bool success = CustomerDetailsAccess.UpdateShippingRegionID(customerId, shippingRegionId);
        // Display status message
        statusLabel.Text = success ? "Shipping Region update successful." : "Try - Shipping Region update failed";
    }
    catch
    {
        // Display error
        statusLabel.Text = "Catch - Shipping Region update failed.";
    }
}

*注: CATCH でエラーが発生しています。

ストアド プロシージャを呼び出す他の既存のコードに送信するパラメーターを作成するコードを次に示します。(スペースを節約するためと、長い間機能しているため、他のコードは含めたくありません。しかし、誰かがそれを見たい場合は、喜んで貼り付けます。)

    // Update customer details
public static bool UpdateShippingRegionID(string customerId, int shippingRegionId)
{
    // Get a configured DbCommand object
    DbCommand comm = GenericDataAccess.CreateCommand();

    // Set the stored prodcedure name
    comm.CommandText = "UpdateShippingRegionID";

    // Create a new parameter
    DbParameter param = comm.CreateParameter();
    param.ParameterName = "@CustomerID";
    param.Value = customerId;
    param.DbType = DbType.String;
    param.Size = 50;
    comm.Parameters.Add(param);

    // Create a new parameter
    param = comm.CreateParameter();
    param.ParameterName = "@ShippingRegionID";
    param.Value = shippingRegionId;
    param.DbType = DbType.Int32;
    comm.Parameters.Add(comm);

    // Result will represent the number of changed rows
    int result = -1;
    try
    {
        // Execute the stored procedure
        result = GenericDataAccess.ExecuteNonQuery(comm);
    }
    catch
    {
        // Any errors are logged in the GenericDataAccess. It is not done here.
    }
    // Result will be 1 in case of success
    return (result != -1);

}

ストアド プロシージャは次のとおりです。

    CREATE PROCEDURE UpdateShippingRegionID
    (@CustomerID char(50),
    @ShippingRegionID int)
    AS
    UPDATE CustomerDetails
    SET 
    ShippingRegionID = @ShippingRegionID
    WHERE CustomerID = @CustomerID

注: ShippingRegionID 列は INT です。

4

1 に答える 1

6

それはあなたの問題だ

comm.Parameters.Add(comm);
于 2013-01-29T16:49:04.260 に答える