-2

という Web フォームがありUserProfile.aspxます。ユーザーがログインすると、UserProfile で詳細を表示および編集できます。を使用しSqlDataSource、データを にバインドしていましたDetailsView。詳細ビューでは、3 つのテーブルからデータを取得し、選択クエリは正常に機能し、データを正常に表示できました。

ただし、情報を更新してUpdateボタンをクリックすると、DetailsView次のエラーが表示されます。

例外の詳細: System.Data.SqlClient.SqlException:
スカラー変数 "@UserId" を宣言する必要があります。

以下は、現在ログインしているユーザー(内部UserProfile.aspx)を取得するコードです。

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
      ConnectionString="<%$ ConnectionStrings:ASPNETDBConnectionString1 %>" 

  SelectCommand="SELECT aspnet_Membership.Email, Details.CustName, Details.CustNum, Details.CustRole, Details.CustStatus, Details.PName, Details.PEmail, Details.PRole, Details.WedDate, aspnet_Users.UserName FROM Details INNER JOIN aspnet_Membership ON Details.UserId = aspnet_Membership.UserId INNER JOIN aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId WHERE Details.UserId = @UserId" 
        onselecting="SqlDataSource1_Selecting" 

  UpdateCommand="UPDATE Details SET CustName = @CustName, CustNum = @CustNum, CustRole = @CustRole, CustStatus = @CustStatus, PName = @PName, PEmail = @PEmail, PRole = @PRole, WedDate = @WedDate WHERE [UserId] = @UserId">

        <SelectParameters>
            <asp:Parameter Name="UserId" type="String" />
        </SelectParameters>

編集

        <UpdateParameters>
            <asp:Parameter Name="UserId" type="String" />
            <asp:Parameter Name="CustName" type="String"  />
            <asp:Parameter Name="CustNum" type="String" />
            <asp:Parameter Name="CustRole" type="String" />
            <asp:Parameter Name="CustStatus" type="String" />
            <asp:Parameter Name="PName" type="String" />
            <asp:Parameter Name="PEmail" type="String"  />
            <asp:Parameter Name="PRole" type="String"  />
            <asp:Parameter Name="WedDate" type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>

    <br />
    <asp:DetailsView ID="DetailsView1" runat="server" 
        AutoGenerateRows="False" 
        DataSourceID="SqlDataSource1" 
        Height="29px" 
        Width="476px">

        <Fields>
            <asp:BoundField DataField="UserName" HeaderText="UserName" 
                SortExpression="UserName" ReadOnly="True" />

            <asp:BoundField DataField="Email" HeaderText="Email" 
                SortExpression="Email" />

            <asp:BoundField DataField="CustName" HeaderText="CustName" 
                SortExpression="CustName" />

            <asp:BoundField DataField="CustNum" HeaderText="CustNum" 
                SortExpression="CustNum" />    

            <asp:BoundField DataField="CustRole" HeaderText="CustRole" 
                SortExpression="CustRole" />
            <asp:BoundField DataField="CustStatus" HeaderText="CustStatus" 
                SortExpression="CustStatus" />
            <asp:BoundField DataField="PName" HeaderText="PName" 
                SortExpression="PName" />
            <asp:BoundField DataField="PEmail" HeaderText="PEmail" 
                SortExpression="PEmail" />
            <asp:BoundField DataField="PRole" HeaderText="PRole" 
                SortExpression="PRole" />
            <asp:BoundField DataField="WedDate" HeaderText="WedDate" 
                SortExpression="WedDate" />
            <asp:CommandField ShowEditButton="True" />

        </Fields>
        <PagerTemplate>
            <br />
        </PagerTemplate>
    </asp:DetailsView>

これはUserProfile.aspx.csファイルです:

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    // Get a reference to the currently logged on user
    MembershipUser currentUser = Membership.GetUser();

    // Determine the currently logged on user's UserId value
    // Assign the currently logged on user's UserId to the @UserId parameter
    //access the parameter value using e.Command.Parameters 
    //programmatically set the @UserId:

    e.Command.Parameters["@UserId"].Value = currentUser.ProviderUserKey.ToString();

    Response.Write(currentUser.ProviderUserKey.ToString()); 
    //When I run the webform, the UserId of the current logged-in user had displayed, 
    // the @UserId was not empty. 
}

おそらく更新クエリが検出できなかったのではないかと考えていました@UserId。しかし、@UserIdSELECTクエリで機能するのに、なぜ ではそうUPDATEではなかったのですか???

4

2 に答える 2

0

次のように、UpdateParametersとSelectParametersでUserIdを宣言する必要があります。

<asp:Parameter Name="UserId" type="String" />
于 2012-07-05T03:54:12.623 に答える
0

Update パラメーターのパラメーターとして UserId を指定する必要があり、Select と Update は 2 つの独立したコマンドです。UserId は Update WHERE 句で使用されるため、指定する必要があります。

    <UpdateParameters>
        <asp:Parameter Name="UserId" type="String" />
        <asp:Parameter Name="CustName" type="String"  />
        <asp:Parameter Name="CustNum" type="String" />
        <asp:Parameter Name="CustRole" type="String" />
        <asp:Parameter Name="CustStatus" type="String" />
        <asp:Parameter Name="PName" type="String" />
        <asp:Parameter Name="PEmail" type="String"  />
        <asp:Parameter Name="PRole" type="String"  />
        <asp:Parameter Name="WedDate" type="String" />
    </UpdateParameters>
于 2012-07-05T03:51:50.830 に答える