利用SqlDataAdapter复制数据行

本文介绍了一种利用SqlCommandBuilder简化大量字段数据行复制的方法。通过示例代码展示了如何创建新记录并更新到数据库,避免了手动编写冗长的SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中需要实现一个数据行的复制功能,也就是有些数据信息,大部分内容都是一样的,只有少数几个参数不同,实现这个功能以简化用户的输入。

按理说,这种功能实现起来非常简单,但是这里有个问题,表的字段非常多,超过100,以前,都是习惯于手写SQL,这时麻烦就来了,SQL还真长,虽然可以利用工具生成,但参数的设置还得手工调整,总之字段太多,看着头就晕。

这时,我想到了SqlCommandBuilder。“SqlDataAdapter不会自动实现生成DataSet的更改与关联的SQL Server实例之间的协调所需的SQL语句。但是,如果设置了SqlDataAdapter的SelectCommand属性,则可以创建一个SqlCommandBuilder对象来自动生成用于单表更新的T-SQL语句。”

根据MSDN的示例,我得到下面的一段代码:

static private DataSet CreateCommandAndUpdate( string connectionString, string queryString) { DataSet dataSet = new DataSet(); using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlDataAdapter dataAdapter = new SqlDataAdapter(); //1 dataAdapter.SelectCommand = new SqlCommand(queryString, connection); SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); dataAdapter.Fill(dataSet); if (dataSet.Tables[0].Rows.Count > 0) { DataRow dr = dataSet.Tables[0].Rows[0]; //2 dataSet.Tables[0].ImportRow(dr); dataSet.Tables[0].AcceptChanges(); DataRow row = dataSet.Tables[0].Rows[dataSet.Tables[0].Rows.Count - 1]; //3 row.SetAdded(); row["txt1"] = "ttt"; } // Code to modify data in the DataSet here. //Without the OleDbCommandBuilder this line would fail. dataAdapter.Update(dataSet); } return dataSet; }

在注释“1”处,创建了一个SqlCommandBuilder对象。

在注释“2”处,利用ImportRow方法,在DataSet中导入一条新记录,然后需要做一下AcceptChanges(),接收这个变化。

在注释“3”处,对新添加的这条记录应用SetAdded()方法,改变其状态为Added,这时就可以根据需要改变某字段的值了。

最后利用SqlDataAdapter的Update方法,就能将数据更新到数据库了。

--------------------------------------------------------------

【附】DataRowState枚举成员

Added

该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。


Deleted

该行已通过 DataRow 的 Delete 方法被删除。

Detached

该行已被创建,但不属于任何 DataRowCollection。DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。


Modified

该行已被修改,AcceptChanges 尚未调用。


Unchanged该行自上次调用 AcceptChanges 以来尚未更改。

******

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值