使用 SqlDataSource 进行 GridView 更新



>我有以下内容,但来自网格视图的更新似乎不起作用并抛出此错误:

"nvarchar"附近的语法不正确。
必须声明标量变量"@id"。

我已经将数据键名称添加到网格视图中,并将更新参数添加到SqlDataSource但仍然看不到问题所在......

执行删除工作正常。

我尝试一一减少更新参数,但仍然没有找到原因

<asp:SqlDataSource ID="sqldsEvents" runat="server" 
     ConnectionString='<%$ ConnectionStrings:dbIPRadioConnectionString %>'
     SelectCommand="SELECT id, eventid, [start time], duration, active, [event desc] FROM tblEvents"
     UpdateCommand="UPDATE tblEvents SET [start time] = @starttime WHERE (id = @id)"
     InsertCommand="INSERT INTO tblEvents(eventid, [start time], duration, active, [event desc]) VALUES (@eventid, @starttime, @duration, @active, @eventdesc)"
     DeleteCommand="DELETE FROM tblEvents WHERE (id = @id)">
     <DeleteParameters>
         <asp:Parameter Name="id"></asp:Parameter>
     </DeleteParameters>
     <InsertParameters>
         <asp:Parameter Name="eventid"></asp:Parameter>
         <asp:Parameter Name="starttime"></asp:Parameter>
         <asp:Parameter Name="duration"></asp:Parameter>
         <asp:Parameter Name="active"></asp:Parameter>
         <asp:Parameter Name="eventdesc"></asp:Parameter>
     </InsertParameters>
     <UpdateParameters>
         <asp:Parameter Name="starttime"></asp:Parameter>
         <asp:Parameter Name="id"></asp:Parameter>
     </UpdateParameters>
 </asp:SqlDataSource>
<div class="col-sm-12 text-center">
    <asp:GridView ID="gvEvents" runat="server" DataKeyNames="id" 
         CssClass="table table-bordered" DataSourceID="sqldsEvents" 
         BackColor="White" BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" 
         CellPadding="4" AutoGenerateColumns="False" 
         EmptyDataText="No Events Configured">
       <Columns>
           <asp:TemplateField ShowHeader="False">
               <EditItemTemplate>
                   <asp:LinkButton runat="server" Text="Update" CommandName="Update" CausesValidation="True" ID="LinkButton1"></asp:LinkButton>&nbsp;<asp:LinkButton runat="server" Text="Cancel" CommandName="Cancel" CausesValidation="False" ID="LinkButton2"></asp:LinkButton>
               </EditItemTemplate>
               <ItemTemplate>
                   <asp:LinkButton runat="server" Text="Edit" CommandName="Edit" CausesValidation="False" ID="LinkButton1"></asp:LinkButton>&nbsp;<asp:LinkButton runat="server" Text="Select" CommandName="Select" CausesValidation="False" ID="LinkButton2"></asp:LinkButton>&nbsp;<asp:LinkButton runat="server" Text="Delete" CommandName="Delete" CausesValidation="False" ID="LinkButton3"></asp:LinkButton>
               </ItemTemplate>
           </asp:TemplateField>
           <asp:BoundField DataField="id" HeaderText="id" ReadOnly="True" SortExpression="id"></asp:BoundField>
           <asp:BoundField DataField="eventid" HeaderText="eventid" SortExpression="eventid"></asp:BoundField>
           <asp:BoundField DataField="start time" HeaderText="start time" SortExpression="start time"></asp:BoundField>
           <asp:BoundField DataField="duration" HeaderText="duration" SortExpression="duration"></asp:BoundField>
           <asp:BoundField DataField="event desc" HeaderText="event desc" SortExpression="event desc"></asp:BoundField>
           <asp:TemplateField HeaderText="active" SortExpression="active">
               <EditItemTemplate>
                   <asp:DropDownList ID="DropDownList1" runat="server">
                       <asp:ListItem Text="0" Value="0"></asp:ListItem>
                       <asp:ListItem Text="1" Value="1"></asp:ListItem>
                   </asp:DropDownList>
               </EditItemTemplate>
               <ItemTemplate>
                   <asp:Label runat="server" Text='<%# Bind("active") %>' ID="Label1"></asp:Label>
               </ItemTemplate>
           </asp:TemplateField>
       </Columns>
</asp:GridView>

出现此问题的原因是 GridView BoundField 中的DataField属性不接受使用空格的列名。

最好对DataFieldSortExpression字段/列名称使用下划线,也可以对SqlDataSource中包含空格的每一列使用基于下划线的别名:

网格视图控件

<asp:GridView ID="gvEvents" ... >
     <%-- other fields --%>
     <asp:BoundField DataField="start_time" HeaderText="start time" SortExpression="start_time"></asp:BoundField>
     <asp:BoundField DataField="event_desc" HeaderText="event desc" SortExpression="event_desc"></asp:BoundField>
     <%-- other fields --%>
</asp:GridView>

SqlDataSource 控件

<asp:SqlDataSource ID="sqldsEvents" runat="server" ConnectionString='<%$ 
    ConnectionStrings:dbIPRadioConnectionString %>'
    SelectCommand="SELECT id, eventid, [start time] AS start_time, duration, active, [event desc] AS event_desc FROM tblEvents"
    <%-- other items --%>
</asp:SqlDataSource>

此外,如果你有权在 SSMS 中修改列名称,则像以下更新命令一样将所有带有空格的列名称更改为下划线应该可以轻松工作:

UpdateCommand="UPDATE tblEvents SET start_time = @starttime WHERE (id = @id)"

注意:

每个表中的列/字段名称应遵循数据库标识符约定,以确保成功执行 CRUD 命令。

类似问题:网格视图中 nvarchar 附近的语法不正确

最新更新