在asp.net GridView的更新用的SqlDataSource(Updating gridv

2019-07-05 17:10发布

我想更新使用从GridView中记录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 MOBILENUMBER=@MOBILENUMBER where USERNAME=@USERNAME
    UPDATE ASPNET_MEMBERSHIP SET EMAIL = @EMAIL, LOWEREDEMAIL = LOWER(@EMAIL), ISLOCKEDOUT=@ISLOCKEDOUT WHERE USERID = (SELECT USERID FROM ASPNET_USERS WHERE USERNAME=@USERNAME)
END

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

Procedure or function users_UpdateFaculty has too many arguments specified.

谁能帮我这可能是造成这个问题,我用正确的所有参数。

Answer 1:

找到了解决办法:选择列和更新参数应与为了使用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>

你不能跳过任何参数,即使你不打算更新该字段希望这将帮助其他人,因为我浪费了大量的时间来研究这一点。



Answer 2:

我不认为您的解决方案是好的,因为我必须使用属性附加伤害OldValuesParameterFormatString =“original_ {0}”,这意味着我将不得不多布尔参数,与原始值的那些与编辑的价值的人。 因此,有没有办法匹配的顺序。

我有4个参数,即时得到正确的价值观对他们的2,一个空的人。

我想你的解决方案,并没有奏效。 不管怎么说,还是要谢谢你。

阅读: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



文章来源: Updating gridview with SqlDataSource in asp.net