利用SqlDataAdapter复制数据行
2009-12-15 16:21
387 查看
项目中需要实现一个数据行的复制功能,也就是有些数据信息,大部分内容都是一样的,只有少数几个参数不同,实现这个功能以简化用户的输入。
按理说,这种功能实现起来非常简单,但是这里有个问题,表的字段非常多,超过100,以前,都是习惯于手写SQL,这时麻烦就来了,SQL还真长,虽然可以利用工具生成,但参数的设置还得手工调整,总之字段太多,看着头就晕。
这时,我想到了SqlCommandBuilder。“SqlDataAdapter不会自动实现生成DataSet的更改与关联的SQL Server实例之间的协调所需的SQL语句。但是,如果设置了SqlDataAdapter的SelectCommand属性,则可以创建一个SqlCommandBuilder对象来自动生成用于单表更新的T-SQL语句。”
根据MSDN的示例,我得到下面的一段代码:
在注释“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 以来尚未更改。
******
按理说,这种功能实现起来非常简单,但是这里有个问题,表的字段非常多,超过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 以来尚未更改。
******
相关文章推荐
- 如何利用SqlDataAdapter进行数据更新(转载)
- 利用SqlDataAdapter更新数据表
- C# SqlDataAdapter.update结合事务(SqlTransaction)批量更新数据
- SqlDataAdapter和SqlCommandBuilder添加数据
- SqlDataAdapter.update结合事务(SqlTransaction)批量更新数据
- 使用断开数据--DataSet和SqlDataAdapter .
- ADO内存数据对象SqlDataAdapter类使用SqlDataAdapter在数据库和DataSet之间架起桥梁:
- 使用SqlDataAdapter对象获取数据 (转)
- C#里ADO.NET的SqlDataAdapter新增数据
- 用SqlDataAdapter对象更新数据库
- SqlDataAdapter和SqlCommandBuilder删除数据
- C#使用SqlDataAdapter.Update更新数据库
- SqlBulkCopy(批量复制)使用方法 && SqlDataAdapter Update
- 如何在 Visual C# .NET 中使用 SqlDataAdapter 对象更新 SQL Server 数据库
- 通过SqlDataAdapter 插入DataSet中的数据到数据库
- 在C#使用SqlDataAdapter的Update更新数据
- SqlDataAdapter 批量更新数据库表
- DataTable数据批量插入数据的库三种方法:SqlCommand.EcecuteNonQurery(),SqlDataAdapter.Update(DataTable) ,SqlBulkCopy.
- 使用SqlDataAdapter对象获取数据
- [学习]利用SqlDataAdapter Insertcommand 获取刚新增的自动编号ID值