请教datatable.Rows.RemoveAt()和datatable.Rows(0).Delete()以及CellValueChanged事件的问题

zjnuan 2016-03-24 04:11:49
如题。
为什么用datatable.Rows.RemoveAt不能更新到数据库,而用datatable.Rows(0).Delete()可以?我的代码如下:
初始化代码一样(dgv是datagridview):
OleDbDataAdapter da = new OleDbDataAdapter("select * from a", conn);
da.Fill(ds, "a");
ds.Tables("a").PrimaryKey = new DataColumn[] { ds.Tables("a").Columns("序号") };
dgv.DataSource = ds.Tables("a")
OleDbCommandBuilder builder = new OleDbCommandBuilder(da);

datatable.Rows.RemoveAt()代码(虽然在dgv上显示了删除,但是删除操作并没有更新到数据库):
ds.Tables("a").Rows.RemoveAt(0)
da.Update(ds.Tables("a"));

同样,用datatable.Rows.Remove(dr)的方法也是不能更新到数据库。这和网上教的方法效果不一样,这是为什么?
datatable.Rows(0).Delete()代码(在dgv上显示了删除,也成功更新到数据库):
ds.Tables("a").Rows(0).Delete();
da.Update(ds.Tables("a"));
ds.Tables("a").AcceptChanges();


第二个问题,在datagridview的CellValueChanged事件中使用da.Update(datatable)方法也是不能将操作更新到数据库,请问有没有解决方法?只能用OleDbCommand.ExecuteNonQuery()之类的方法吗?
...全文
190 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjnuan 2016-03-25
  • 打赏
  • 举报
回复
人气这么少?
zjnuan 2016-03-24
  • 打赏
  • 举报
回复
我发现将
ds.Tables("a").Rows.RemoveAt(0)
da.Update(ds.Tables("a"));
修改成:
dgv.Rows.RemoveAt(0)
da.Update(ds.Tables("a"));
这样可以更新到数据库。这样真奇怪,修改datagridview可以更新到数据库,反而修改datatable不能更新到数据库。 还有我发现一个奇怪的现象:
builder = new OleDbCommandBuilder(da);
ds.Tables("a").Rows.Find(dgv(dgv.DataSource.PrimaryKey(0).ToString, dgv.CurrentRow.Index).Value)(dgv.CurrentCell.ColumnIndex) = dgv.CurrentCell.Value;
da.Update(ds.Tables("a"));
如果读取数据库的语句是"select * from a",上面的代码通过修改datagridview单元格内容,能够更新到数据库;但是如果读取数据库的语句是"select top 500 * from a",则并不能更新到数据库。说明一下:builder = new OleDbCommandBuilder(da)中的da中的选择语句我也是同步更改为对应读取数据库的语句的。所以这很奇怪。 最后还有一个奇怪的问题: 我发现当使用SQL数据库时(用到SqlDataAdapter, SqlCommandBuilder之类的),datatable.Rows.Remove(datarow)的方法反而能够更新到数据库,这个是不是微软在鄙视access吗?
zjnuan 2016-03-24
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
你想么,总要有方法,能够进行本地修改,而不会影响数据库的
就是想要影响到数据库
Poopaye 2016-03-24
  • 打赏
  • 举报
回复
你想么,总要有方法,能够进行本地修改,而不会影响数据库的
zjnuan 2016-03-24
  • 打赏
  • 举报
回复
引用 1 楼 dannylee245 的回复:
remove是在本地物理删除,更新不到数据库的,delete是打个删除标记
是这样的吗?remove和removeat都不能更新到数据库。
dannylee245 2016-03-24
  • 打赏
  • 举报
回复
remove是在本地物理删除,更新不到数据库的,delete是打个删除标记

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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