ASP.NET GridView未显示数据库更新的OrderStatus数据问题
问题:GridView无法同步显示数据库更新后的OrderStatus字段值
我有一个PO编号搜索页面,通过SQL数据源拉取订单数据。数据库中OrderStatus字段已更新,但页面上的OrderGridView控件始终显示旧值,无法同步新状态。
相关代码
ASPX页面(OrderGridView部分)
<asp:gridview id="OrderGridView" CssClass="orderSearchOrderHeaderGridView" autogeneratecolumns="False" DataKeyNames="OrderID" emptydatatext="No data available." allowpaging="True" runat="server" OnRowCommand="OrderGridView_RowCommand"> <RowStyle CssClass="gridViewRow" /> <AlternatingRowStyle CssClass="gridViewAltRow" /> <Columns> <asp:TemplateField> <ItemTemplate> <asp:HiddenField ID="OrderID" runat="server" Value='<%# Eval("OrderID").ToString().Trim()%>' /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="PONumber" HeaderText="PO Number" /> <asp:BoundField DataField="OrderHeader.OrderChannel" HeaderText="Order Channel" /> <asp:BoundField DataField="OrderHeader.OrderType" HeaderText="Order Type" /> <asp:BoundField DataField="OrderHeader.OrderDate" HeaderText="Order Date" DataFormatString="{0:d}" /> <asp:BoundField DataField="OrderHeader.FulfillmentLines" HeaderText="Fulfillment Lines" /> <asp:BoundField DataField="OrderHeader.PrintLines" HeaderText="Print Lines" /> <asp:BoundField DataField="OrderHeader.FoundationOrderID" HeaderText="Monarch Order ID" /> <asp:BoundField DataField="OrderHeader.FoundationJobID" HeaderText="Monarch Job ID" /> <asp:BoundField DataField="OrderHeader.OrderStatus" HeaderText="Order Status" /> <asp:ButtonField HeaderText="View Order Details" Text="View Details" CommandName="viewDetails" ButtonType="Button" /> </Columns> </asp:gridview>
搜索按钮后台代码(BtnOrderSearch_Click)
protected void BtnOrderSearch_Click(Object sender, EventArgs e) { try { OrderGridView.DataSource = null; OrderGridView.DataBind(); OrderShipToGridView.DataSource = null; OrderShipToGridView.DataBind(); OrderShipToGridView.Visible = false; OrderLinesGridView.DataSource = null; OrderLinesGridView.DataBind(); OrderLinesGridView.Visible = false; if (!string.IsNullOrEmpty(OrderSearchTextbox.Text.Trim())) { string orderPoNumber = OrderSearchTextbox.Text; Dictionary<int, Order> orderSearch = Functions.RetrieveOrdersByPO(orderPoNumber); OrderGridView.DataSource = orderSearch.Values; OrderGridView.DataBind(); } else { Response.Write("<script>alert('No PO number entered. Please enter a valid PO number and try again.'); location.href='ordersearch.aspx'</script>"); } } catch (Exception ex) { if (ex is ArgumentException) { Response.Write("<script>alert('Unable to find an order or job with that order / PO Number. Please verify the order number being entered is correct. If so, please send an email to HelpDesk@visionsfirst.com with the order number and state that it is not available in the Insight Portal.'); location.href='ordersearch.aspx'</script>"); } else { throw; } } }
已知信息
- 数据库运行正常,新订单可正常入库
- 点击搜索按钮时,预期会重新从数据库拉取数据,但
OrderStatus始终显示旧值 - 已排查常规数据绑定问题,了解
!IsPostBack的用法,但本次操作是按钮触发的PostBack,应该会重新查询
可能的原因及解决方法
数据缓存问题
- 检查
Functions.RetrieveOrdersByPO方法是否使用了缓存(比如MemoryCache、静态变量缓存查询结果)。如果方法内部对查询结果做了缓存,会导致更新后的数据无法及时获取。 - 解决:修改
RetrieveOrdersByPO方法,移除不必要的缓存逻辑,或者在更新数据库后清除对应缓存项。
- 检查
实体类属性映射错误
- 确认
Order类中的OrderHeader.OrderStatus属性是否正确映射到数据库字段。如果属性名称或映射关系有误,会导致查询时无法获取最新的OrderStatus值。 - 解决:检查
Order及OrderHeader类的属性定义,确保与数据库字段的映射一致(比如ORM框架的注解、存储过程返回的字段名是否匹配)。
- 确认
存储过程逻辑问题
- 验证
RetrieveOrdersByPO调用的存储过程是否确实返回了更新后的OrderStatus值。可以直接在数据库中执行存储过程,传入相同的PO编号,查看返回结果是否包含新的状态。 - 解决:如果存储过程存在逻辑问题(比如错误的WHERE条件、未正确关联表),修改存储过程确保返回最新的订单数据。
- 验证
GridView视图状态干扰
- 虽然你在绑定前设置了
DataSource = null并调用DataBind(),但极端情况下视图状态可能仍保留旧值。可以尝试禁用OrderGridView的视图状态,或者在绑定前强制清除视图状态。 - 解决:在
BtnOrderSearch_Click开头添加OrderGridView.EnableViewState = false;,或者调用OrderGridView.ClearState();(注意:禁用视图状态可能影响分页等功能,需测试)。
- 虽然你在绑定前设置了
数据库事务未提交
- 确认更新
OrderStatus的操作是否已提交事务。如果更新操作处于未提交的事务中,查询时无法读取到未提交的数据。 - 解决:检查更新
OrderStatus的代码,确保事务已正确提交。
- 确认更新
内容的提问来源于stack exchange,提问作者kDubya
相关产品推荐
相关产品推荐

