2012-12-18 168 views
2

我想使用SqlDataSource来更新gridview中的记录,下面是我正在做的事情。下面
是我的GridView标记在asp.net中使用SqlDataSource更新gridview

<asp:GridView ID="grdManageFaculties" runat="server" AllowPaging="True" AutoGenerateColumns="False" 
     DataSourceID="LocalServerDataSource" AutoGenerateDeleteButton="true" AutoGenerateEditButton="true" 
     Width="100%" OnRowUpdating="grdManageFaculties_RowUpdating"> 
     <Columns> 
      <asp:TemplateField HeaderText="MANAGE"> 
       <ItemTemplate> 
        <asp:LinkButton ID="lnkEdit" runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton> 
        <asp:LinkButton ID="lnkDelete" runat="server" Text="Delete"></asp:LinkButton> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:LinkButton ID="lnkUpdate" runat="server" Text="Update"></asp:LinkButton> 
        <asp:LinkButton ID="lnkCancel" runat="server" Text="Cancel"></asp:LinkButton> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="NAME"> 
       <ItemTemplate> 
        <asp:Label ID="lblUserName" runat="server" Text='<%# Eval("UserName") %>'></asp:Label> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:Label ID="lblEditUserName" runat="server" Text='<%# Eval("UserName") %>'></asp:Label> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="EMAIL"> 
       <ItemTemplate> 
        <asp:Label ID="lblEmail" runat="server" Text='<%# Eval("Email") %>'></asp:Label> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:TextBox ID="txtEditEmail" runat="server" Text='<%# Bind("Email") %>'></asp:TextBox> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="MOBILE"> 
       <ItemTemplate> 
        <asp:Label ID="lblMobileNumber" runat="server" Text='<%# Eval("Mobile") %>'></asp:Label> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:TextBox ID="txtEditMobileNumber" runat="server" Text='<%# Bind("Mobile") %>'></asp:TextBox> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="LOCKED"> 
       <ItemTemplate> 
        <asp:CheckBox ID="chkIsLocked" runat="server" Enabled="false" Checked='<%# Eval("Locked") %>' /> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:CheckBox ID="chkEditIsLocked" runat="server" Checked='<%# Bind("Locked") %>' /> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="CREATED"> 
       <ItemTemplate> 
        <asp:Label ID="lblCreated" runat="server" Text='<%# Eval("Created") %>'></asp:Label> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:Label ID="lblEditCreated" runat="server" Text='<%# Eval("Created") %>'></asp:Label> 
       </EditItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

下面是我在SqlDataSource

<asp:SqlDataSource ID="LocalServerDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SiteSqlServer %>" 
     SelectCommand="users_GetAllUsers" SelectCommandType="StoredProcedure" UpdateCommand="users_UpdateFaculty" UpdateCommandType="StoredProcedure"> 
     <UpdateParameters> 
      <asp:Parameter Name="EMAIL" Type="String" /> 
      <asp:Parameter Name="ISLOCKEDOUT" Type="Boolean" /> 
      <asp:Parameter Name="MOBILENUMBER" Type="Int64" /> 
      <asp:Parameter Name="USERNAME" Type="String" /> 
     </UpdateParameters> 
    </asp:SqlDataSource> 
下面

标记是我的代码隐藏的Row_Updating功能

protected void grdManageFaculties_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     try 
     { 
      TextBox email = grdManageFaculties.Rows[e.RowIndex].FindControl("txtEditEmail") as TextBox; 
      Label username = grdManageFaculties.Rows[e.RowIndex].FindControl("lblEditUserName") as Label; 
      CheckBox locked = grdManageFaculties.Rows[e.RowIndex].FindControl("chkEditIsLocked") as CheckBox; 
      TextBox mobilenumber = grdManageFaculties.Rows[e.RowIndex].FindControl("txtEditMobileNumber") as TextBox; 

      LocalServerDataSource.UpdateParameters["EMAIL"].DefaultValue = email.Text; 
      LocalServerDataSource.UpdateParameters["ISLOCKEDOUT"].DefaultValue = locked.Checked.ToString(); 
      LocalServerDataSource.UpdateParameters["MOBILENUMBER"].DefaultValue = mobilenumber.Text; 
      LocalServerDataSource.UpdateParameters["USERNAME"].DefaultValue = username.Text; 
      LocalServerDataSource.Update(); 
     } 
     catch { } 
    } 
下面

是我的存储过程更新

ALTER PROCEDURE users_UpdateFaculty 
    @EMAIL NVARCHAR(100), 
    @ISLOCKEDOUT BIT, 
    @MOBILENUMBER BIGINT, 
    @USERNAME nvarchar(100) 
AS 
BEGIN 
    UPDATE aspnet_Users SET [email protected] where [email protected] 
    UPDATE ASPNET_MEMBERSHIP SET EMAIL = @EMAIL, LOWEREDEMAIL = LOWER(@EMAIL), [email protected] WHERE USERID = (SELECT USERID FROM ASPNET_USERS WHERE [email protected]) 
END 

我在数据库记录中得到更新,但是当我在更新按钮点击,我得到以下错误:

Procedure or function users_UpdateFaculty has too many arguments specified. 

谁能帮助我什么可能,我适当地使用所有的参数会造成这个问题。

回答

3

找到解决方案: 选择列和更新参数应该匹配以便使用SqlDataSource进行更新,这意味着如果您选择(查询或过程)在gridview中返回3个字段,那么它们都应该是参数对于更新,你可以错过在数据库中的实际updations如果不是必需的,但<UpdateParameters>应该具有的所有字段:比方说,如果下面是我的选择查询

SELECT USERNAME, MOBILENUMBER, EMAIL FROM USERS 

则更新参数应

<UpdateParameters> 
    <asp:Parameter Name="UserName" Type="String" /> 
    <asp:Parameter Name="MobileNumber" Type="Int64" /> 
    <asp:Parameter Name="Email" Type="String" /> 
<UpdateParameters> 

即使您不打算更新该字段,也不能跳过任何参数 希望这可以帮助其他人,因为我浪费了大量时间在这方面进行研究。

1

我不认为你的解决方案是好的,因为我必须使用属性OldValuesParameterFormatString =“original_ {0}”,这意味着我会有doble参数,那些与原始值和编辑值的。所以无法匹配订单。

我有4个参数,我为他们中的2个获得正确的值,在其他人中为null。

我试过你的解决方案,并没有工作。不管怎么说,还是要谢谢你。

阅读方式: UpdateParameters集合中参数的顺序可能很重要,具体取决于ADO.NET提供程序。 System.Data.OleDb和System.Data.Odbc提供程序根据参数在参数化的SQL查询中出现的顺序关联集合中的参数。 System.Data.SqlClient提供程序(它是SqlDataSource控件的默认ADO.NET提供程序)通过将参数的名称与SQL查询中的占位符别名进行匹配,将集合中的参数关联起来。有关参数化SQL查询和命令的更多信息,请参阅将参数与SqlDataSource控件一起使用。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasource.updateparameters(v=vs.110).aspx

相关问题