关于GridView的删除问题

hornbills 2010-02-02 10:44:46
现象:GridView页面,在删除一条记录之前,在数据库添加一条新记录,删除某条记录的时候你会发现删除了不该删除的一条。

大家有没有遇到这种情况?都是如何解决的?
...全文
575 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
hornbills 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 lzsh0622 的回复:]
引用 48 楼 hornbills 的回复:
解决办法其实很简单,超链接 <a href='del.aspx?id= <%# DataBinder.Eval(Container.DataItem,"ID")%>' >删除 </a>,直接找到主键然后操作就OK了,这是不是意味着GridView在跟后台数据对应问题存在重大缺陷?并发环境要想安全,只有找到主键直接操作,任何依赖GridView与主键对应的方法一律是不保险的,而且存在重大隐患!


ADO.NET的连接方式是断开式的。不论本地,还是远程;不论B/S,还是C/S。 DataSet中的数据与数据库的数据不一定同步。保证二者建立一一对应关系的唯一条件就是关键字ID。update和delete语句都以关键字ID为where条件,才能保证数据操作的目标一致性。
[/Quote]

同意您的观点!!
CommandArgument和DataKey这些对象的存在意义是否值得怀疑呢?
lzsh0622 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 hornbills 的回复:]
解决办法其实很简单,超链接 <a href='del.aspx?id= <%# DataBinder.Eval(Container.DataItem,"ID")%>' >删除 </a>,直接找到主键然后操作就OK了,这是不是意味着GridView在跟后台数据对应问题存在重大缺陷?并发环境要想安全,只有找到主键直接操作,任何依赖GridView与主键对应的方法一律是不保险的,而且存在重大隐患!
[/Quote]

ADO.NET的连接方式是断开式的。不论本地,还是远程;不论B/S,还是C/S。 DataSet中的数据与数据库的数据不一定同步。保证二者建立一一对应关系的唯一条件就是关键字ID。update和delete语句都以关键字ID为where条件,才能保证数据操作的目标一致性。
随风落梦 2010-02-04
  • 打赏
  • 举报
回复
在GRIDVIEW里面的删除里面绑定主键值,而且要设为自动增长的,这样插进去一条数据后主键值肯定不会相同,然后SQL里面用IF EXSITE判断下是否有这条记录,然后删
xray2005 2010-02-04
  • 打赏
  • 举报
回复
解决办法其实很简单,超链接 <a href='del.aspx?id= <%# DataBinder.Eval(Container.DataItem,"ID")%>' >删除 </a>,直接找到主键然后操作就OK了,这是不是意味着GridView在跟后台数据对应问题存在重大缺陷?并发环境要想安全,只有找到主键直接操作,任何依赖GridView与主键对应的方法一律是不保险的,而且存在重大隐患!
---------------------------------------

的确是这样。

我都一直使用主键区删除的。如果使用INDEX经常会出些问题。
hornbills 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 kuankuanluomo 的回复:]
数据表主键设置的是自动增长列的话  删除时要判断Datagridview控件中是否选中一行,并且不是空白行(DataGridView默认有一空白行)如不判断 要删除的列是否存在真实的  ID  则会报错
[/Quote]
前台可能还有整页的数据,后台可能已经什么都没有了。
hornbills 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 yzf86211861 的回复:]
删完 在 绑定下
[/Quote]

删除并绑定后,发现删错了
  • 打赏
  • 举报
回复
数据表主键设置的是自动增长列的话 删除时要判断Datagridview控件中是否选中一行,并且不是空白行(DataGridView默认有一空白行)如不判断 要删除的列是否存在真实的 ID 则会报错
YnSky 2010-02-04
  • 打赏
  • 举报
回复
删除的时候根据Id删除.肯定能删除对的.
hornbills 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 kingboy2008 的回复:]
绑定主键字段,通过主键逻辑删除不会有问题吧?
[/Quote]

这句话没有问题,看了您的代码觉得一样有问题,<%# Eval("ID")%>

如果通过imagebutton linkbutton之类的传递都会先转化成GridView行然后再从数据库查找对应数据,所以肯定出错。
yzf86211861 2010-02-04
  • 打赏
  • 举报
回复
删完 在 绑定下
灵雨飘零 2010-02-04
  • 打赏
  • 举报
回复
参考一下代码:



<asp:TemplateField HeaderText="删除">
<ItemTemplate>
<asp:ImageButton ID="btnDelete" ImageUrl="~/Images/delete.png" runat="server" CommandName="del"
CausesValidation="false" ToolTip="删除" CommandArgument='<%# Eval("ID")%>'
OnClientClick="return confirm('删除后不可恢复,确定要删除吗?');" />
</ItemTemplate>
<HeaderStyle HorizontalAlign="Center" Width="50px" />
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>






protected void gvStatute_RowCommand(object sender, GridViewCommandEventArgs e)
{
object Id = e.CommandArgument;
SelectedId = e.CommandArgument.ToString();

if (e.CommandName == "del")
{
try
{

///执行删除操作
。。。。。。。。。。。。。。。。。。。。。。


BindData();

}
catch (Exception ex)
{
AjaxMessage(ex.Message);
}
}
}
灵雨飘零 2010-02-04
  • 打赏
  • 举报
回复
绑定主键字段,通过主键逻辑删除不会有问题吧?
lzsh0622 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 hornbills 的回复:]
CommandArgument和DataKey这些对象的存在意义是否值得怀疑呢?
[/Quote]

CommandArgument 是完善SQL语句的一种辅助手段。如设置为 Ascending,以指定按升序排序。
DataKey 用于绑定数据库的主键,设置索引,在Dsataset内起到数据校验、约束作用,如唯一性。

总之,为实现数据库更新,起到一些辅助作用。
hornbills 2010-02-04
  • 打赏
  • 举报
回复
<a href='del.aspx?id= <%# DataBinder.Eval(Container.DataItem,"ID")%>' ></a>
这种方式解决问题让人感觉很失败,也不够正统
vins4fun 2010-02-03
  • 打赏
  • 举报
回复
现在问题怎样了@@?
hornbills 2010-02-03
  • 打赏
  • 举报
回复
下面的代码也存在问题

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID,Status" >
<Columns>
<asp:BoundField DataField="ID" HeaderText="订单号" />
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
CommandName="Delete" Text="删除"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>

</asp:GridView>

Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting

'删除不是真的删除而是修改订单状态
dbo.UpdateOrderSaleStatus(Convert.ToInt32(GridView1.DataKeys(e.RowIndex).Values("ID").ToString), -1)
BindGridView()
End Sub
hornbills 2010-02-03
  • 打赏
  • 举报
回复
存在问题的代码

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID,Status" EnableViewState ="true" >
<Columns>
<asp:BoundField DataField="ID" HeaderText="订单号" />
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
CommandName="Del" Text="删除" CommandArgument='<%# DataBinder.Eval(Container.DataItem,"ID")%>'></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
If e.CommandName = "Del" Then
'修改订单状态
dbo.UpdateOrderSaleStatus(Convert.ToInt32(e.CommandArgument.ToString), -1)
BindGridView()
End If
End Sub
gsz_stylm 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 zp63534036 的回复:]
我觉得还是楼主的问题,为什么你添加数据后不重新绑定一次呢,执行过增删改查都应该重新绑定一次吧?
[/Quote]
我觉得也是这个问题,在后台添加完数据以后,你的数据源没有重新绑定,造成的数据源错误了,才引起这样的错误吧,还是重新绑定一次,看看还有没有这样的问题出现!
hornbills 2010-02-03
  • 打赏
  • 举报
回复
这个问题确实是并发问题

GridView 第一行,第二行,第三行对应的是查询语句执行以后的第一条记录,第二条记录,第三条记录...

GridView这个页面静止的时候,数据库却在发生变化,比如新增或者删除

也就是说GridView的第一行,第二行,第三行对应的数据其实也在发生变化,如果依据这个发出指令就会出现错误

怎么样避免错误?

直接通过数据的ID号来操作,而不应该把数据的主键通过GridView的CommandArgument或者GridView1.DataKeys(e.RowIndex).Values("ID")传递,因为这样仍然是按照GridView的次序来操作


举例1
GridView 有四行

第一行 ID=1 User="张一"
第二行 ID=2 User="张二"
第三行 ID=3 User="张三"

现在准备在GridView页面删除第二行,也就是想把张二这个用户删除,如果有人刚刚把ID=1 User="张一"这个记录删除,(通过其它页面删除的,你操作的这个页面没有刷新),其实目前的GridView和后台数据的对应关系如下:
第一行 ID=2 User="张二"
第二行 ID=3 User="张三"
第三行

你并不知道后台数据的变化,此时你删除第二行,想把张二删除,结果却删除了张三

之前我用插入记录,而且用Order by ID DESC,是因为插入记录在Order By ID DESC的情况下会导致GridView和后台数据对应关系的变化

解决办法其实很简单,超链接<a href='del.aspx?id=<%# DataBinder.Eval(Container.DataItem,"ID")%>' >删除</a>,直接找到主键然后操作就OK了,这是不是意味着GridView在跟后台数据对应问题存在重大缺陷?并发环境要想安全,只有找到主键直接操作,任何依赖GridView与主键对应的方法一律是不保险的,而且存在重大隐患!



凤凰涅檠 2010-02-03
  • 打赏
  • 举报
回复
up,一般不可能出现这问题
加载更多回复(44)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧