2012-07-05 4 views
-2

UserProfile.aspx이라는 웹 폼이 있습니다. 사용자가 로그인 한 후에는 UserProfile에서 세부 정보를보고 편집 할 수 있습니다. SqlDataSource을 사용하고 데이터를 DetailsView에 바인딩했습니다. 상세 뷰에서 3 개의 테이블에서 데이터를 검색하고 선택 쿼리가 올바르게 작동하고 데이터를 성공적으로 표시 할 수 있습니다. 내가 정보를 업데이트하고 DetailsViewUpdate 버튼을 쳤을 때업데이트 문에 스칼라 변수 "@UserId"를 선언해야합니다.

그러나이 오류가 나타납니다

예외 정보 : System.Data.SqlClient.SqlException :
는 스칼라 변수 "를 선언해야합니다 @ 사용자 ID ".

<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 파일 :

는 다음 나는 (UserProfile.aspx 내부) 현재 로그인 한 사용자를 얻을 코드입니다

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을 감지하지 못한다고 생각했습니다. 그러나 이 SELECT 쿼리에서 작동하기 때문에 UPDATE에서 그 이유는 무엇입니까 ???

답변

0

업데이트 매개 변수에서 매개 변수로 UserId를 지정해야하며 선택 및 업데이트는 두 개의 독립적 인 명령입니다. UserId는 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> 
+0

업데이트 문이 작동하지 않는 .. 데이터는 업데이트되지 않았습니다 '업데이트'버튼이 눌 렸을 때 – user1501969

+0

아직도 오류가 있습니까? 또는 사용자 세부 정보를 변경하지 않고 단추를 누른 후 페이지가 다시 게시됩니까? – Fellmeister

+0

예, 설명하는 것과 같습니다. DataKeyNames = "UserName"을 추가하더라도 detailsview는 여전히 업데이트 할 수 없습니다. – user1501969

0

당신은에서와 같이, UpdateParameters뿐만 아니라 SelectParameters에 사용자 아이디를 선언해야합니다 :이 사용자 아이디 매개 변수를 추가 한 후

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

안녕하세요, 내가 준 코드에 추가했습니다. 오류는 해결되었지만 detailsview는 더 이상 업데이트 할 수 없습니다. – user1501969

+0

UserId가 문자열입니까? 그렇지 않은 경우 유형을 업데이트해야합니다 (예 : int와 일치). – Michael

+0

[DataKeyNames] (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols)를 확인하십시오. .gridview.datakeynames.aspx). 아마도 그리드에 정의 할 필요가있을 것입니다. – Michael

관련 문제