【问题标题】:GridView update with SqlDataSource使用 SqlDataSource 更新 GridView
【发布时间】:2018-01-22 13:33:30
【问题描述】:

我有以下内容,但来自 gridview 的更新似乎不起作用并引发此错误:

“nvarchar”附近的语法不正确。
必须声明标量变量“@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>

【问题讨论】:

  • 我认为您所展示的内容不会产生该错误。您可以运行 SQL Profiler 跟踪并观察实际访问数据库的命令吗?

标签: c# asp.net gridview


【解决方案1】:

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

最好为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

【讨论】:

    猜你喜欢
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多