C#中的DataTable怎么获取已删除行的信息

C#中的DataTable怎么获取已删除行的信息,第1张

C#的DataTable的行有几种状态:

Added:表示行已添加到DataRowCollection,尚未调用DataTable.AcceptChange()

Modified:表示行已被修改,尚未调用DataTable.AcceptChange()

Deleted:表示行已被删除,

Unchanged:自上次调用AcceptChange()之后没有更改的行.

Detached:行虽然创建,但没有放到DataRowCollection中.

有时候,要获取到客户端表格的删除行,然后再提交到数据库更新.但是如果直接这样访问:

DataTable dtDeleted = dt.GetChanges(DataRowState.Deleted)

string id=dtDeleted.Rows[0]["id"].ToString()

会出现DeletedRowInaccessibleException异常:不能通过已删除的行访问该行的信息.

怎么办呢?其实可以Rows的另一个重载索引器来访问:

string id=dtDeleted.Rows[0]["id",DataRowVersion.Original].ToString()

DataRowVersion.Original表示的是该行的原始值

/*把更改写回数据库DataAdapter.Update*/

/*Important: 这种在DataTable中进行的插入、更新和删除并不会自动写回数据库

*/

SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn)

SqlCommandBuilder builder = new SqlCommandBuilder(adapter)

DataSet ds = new DataSet()

adapter.Fill(ds, "Titles")

//插入记录

DataTable table = ds.Tables["Titles"]

DataRow row = table.NewRow()

row["Title_id"] = "JP1001"

row["title"] = "programming Microsoft .NET"

row["price"] = 59.99m

row["ytd_sales"] = 100000

row["type"] = "business"

row["pubdate"] = new DateTime(2002, 5, 1)

table.Rows.Add(row)

//更新数据库

adapter.Update(table)

/*DataAdapter的Update方法检查传递给表的每一条记录,把自从上次更新

* (或自从上次调用table的AcceptChanges方法后)被插入、更新或删除的行

* 写回数据库。如果DataSet中包含了多个被修改的DataTable,就把整个DataSet

* 传给Update方法: adapter.Update(ds),所有改变会被一次性写回。

*/

/*

* 哦,还有许多演示DataAdapter.Update的用法的示例,演示了通过调用名为GetChanges

* 的方法创建一个只含有被插入、更新或删除行的新的临时DataSet或者DataTable

* ,然后把delta传递给DataAdapter.Update,如下:

* //更新数据库

* DataTable delta = table.GetChanges()

* adapter.Update(delta)

* 这种方法的确好用,但不是必需的。Update会忽略包含已修改和未修改的行的DataTable中

* 未被修改的行。

* 当要控制写回数据库中的更改的内容的顺序时,GetChanges方法发挥作用,

* 如果想在Insert前面执行Delete,以避免主键重复错误,应该这样做:

*/

//DataRowState ---->enum System.Data.DataRowState

//DataRowState.Deleted---->the row was deleted

//using the row.Delete()

DataTable deletes = table.GetChanges(DataRowState.Deleted)

adapter.Update(deletes)

DataTable inserts = table.GetChanges(DataRowState.Added)

adapter.Update(inserts)

/*GetChanges的另一个用处是,

* 当更新不是在本地执行时,把机器间的数据传输量减到最小,

* 只传递被改变的DataSet或DataTable比传递整个DataSet或DataTable更高效

*/


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6671551.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-26
下一篇2023-03-26

发表评论

登录后才能评论

评论列表(0条)

    保存