GridView控件更新时找不到id

Posted

技术标签:

【中文标题】GridView控件更新时找不到id【英文标题】:GridView control fail to find the id when update 【发布时间】:2018-06-24 03:13:57 【问题描述】:

我正在编写以下代码来更新 SQL Server。我收到以下错误消息:

“-”附近的语法不正确。必须声明标量变量“@id”。 说明:执行过程中发生未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.Data.SqlClient.SqlException:不正确 '-' 附近的语法。必须声明标量变量“@id”。

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[SqlException (0x80131904): '-' 附近的语法不正确。必须申报 标量变量“@id”。]

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" DataKeyNames="id" DataSourceID="SqlDataSource2" ForeColor="#333333" GridLines="None" AllowSorting="True">
        <AlternatingRowStyle BackColor="White" />
        <Columns>
            <asp:CommandField ShowEditButton="True" />
            <asp:TemplateField HeaderText="id" InsertVisible="False" SortExpression="id">
                <EditItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("id") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:BoundField DataField="E-mail" HeaderText="E-mail" SortExpression="E-mail" />
        </Columns>
        <EditRowStyle BackColor="#2461BF" />
        <FooterStyle BackColor="#507CD1" ForeColor="White" Font-Bold="True" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <PagerStyle ForeColor="White" HorizontalAlign="Center" BackColor="#2461BF" />
        <RowStyle BackColor="#EFF3FB" />
        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
        <SortedAscendingCellStyle BackColor="#F5F7FB" />
        <SortedAscendingHeaderStyle BackColor="#6D95E1" />
        <SortedDescendingCellStyle BackColor="#E9EBEF" />
        <SortedDescendingHeaderStyle BackColor="#4870BE" />
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:demoConnectionString4 %>" 
        SelectCommand="SELECT * FROM [de]" 
        UpdateCommand="UPDATE [de] SET [Name]=@Name, [E-mail]=@column1 WHERE [id]=@id">
        <UpdateParameters>
            <asp:Parameter Name="id" Type="Int32" />
            <asp:Parameter Name="Name" Type="String"/>
            <asp:Parameter Name="column1" Type="String"/>
        </UpdateParameters>
    </asp:SqlDataSource>

【问题讨论】:

对 id 也使用 datafeild,而不是执行硬编码的命令,尝试在更新按钮事件的 onclick 上处理它 可能是字段名“E-mail”。在您的 SQL 版本中,字段名称中是否允许使用连字符“-”? 【参考方案1】:

错误出现在 ID TemplateField 上,您在 EditItemTemplate 上使用 Label 来显示 ID,并且此标签 未回发 sql 更新所需的 IDasp:label 未呈现此处需要的输入字段。

要么删除 TemplateField,然后将 asp:BoundField 用作其余字段,它会在您更新每一行时自动创建输入字段,要么将其设置为 read only text box(在 EditImteTemplate 上),因此可以发布 ID。

这几行是你需要关注和改变的:

<asp:TemplateField HeaderText="id" InsertVisible="False" SortExpression="id">
    <EditItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("id") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

【讨论】:

以上是关于GridView控件更新时找不到id的主要内容,如果未能解决你的问题,请参考以下文章

向导控件中的 Gridview 自定义分页在 asp.net 中无法正常工作

asp.net的GridView控件的onrowdeleting属性怎么出错显示为找不到可接受类型。。。呢

.net中,如何获取到gridview控件中的checkbox控件的值?

分页控件在 Gridview 中不可见

高分求助:WPF datagird控件数据的增删改查。急

C#中“类似GridView等控件”的前台显示与后台数据变化之间的关系