使用SqlDataSource进行GridView更新

时间:2018-01-21 22:50:24

标签: c# asp.net gridview

我有以下内容,但gridview的更新似乎无法正常工作并抛出此错误:

  

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

我已将datakeynames添加到gridview,并将更新参数添加到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>

1 个答案:

答案 0 :(得分:1)

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

最好为DataFieldSortExpression字段/列名称使用下划线,同时对SqlDataSource中包含空格的每个列使用基于下划线的别名:

GridView控件

<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)"

注意:

每个表中的列/字段名称应遵循database identifier convention以确保成功执行CRUD命令。

类似问题:incorrect syntax near nvarchar in gridview