2

我想使用 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.

谁能帮助我可能导致此问题的原因,我正在正确使用所有参数。

4

2 回答 2

4

找到解决方案:选择列和更新参数应该匹配才能使用 SqlDataSource 进行更新,这意味着如果您选择(查询或过程)在 gridview 中返回 3 个字段,那么它们都应该是更新的参数,您如果不需要,可能会错过数据库中的实际更新,但<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>

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

于 2012-12-18T19:10:32.873 回答
1

我不认为您的解决方案可以,因为我必须使用属性 O​​ldValuesParameterFormatString="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

于 2014-08-07T07:34:02.773 回答