という 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
。しかし、@UserId
はSELECT
クエリで機能するのに、なぜ ではそうUPDATE
ではなかったのですか???