项目中需要实现一个数据行的复制功能,也就是有些数据信息,大部分内容都是一样的,只有少数几个参数不同,实现这个功能以简化用户的输入。
按理说,这种功能实现起来非常简单,但是这里有个问题,表的字段非常多,超过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 以来尚未更改。
******