日期:2014-05-19  浏览次数:20953 次

第一次使用dataadapter.update,想偷个懒怎么那么难?
以前总是喜欢手工生成insert语句,出了错也好查找,这个想偷个懒,顺便学习下,结果,不爽,搞不定

目的:简单的将datatset.tables[ "tmp "]中的数据insert到一个oracle空表中,表结构与datatset.tables[ "tmp "]一样

环境:windows2003   sp1,vs2003,oracle9.2.0.1

实现代码:

private   int   copyTable(System.Data.OracleClient.OracleConnection   cn,System.Data.DataTable   dt,String   sql)
{
int   i=1;
System.Data.OracleClient.OracleDataAdapter   da;
System.Data.OracleClient.OracleCommand   cmd;
System.Data.DataSet   ds=new   DataSet();
String   targetTableName;
targetTableName=sql.Substring(sql.IndexOf( "   table ")+6,sql.IndexOf( "( ")-6-sql.IndexOf( "table ")).Replace( "   ", " ");
cmd=new   OracleCommand(sql,cn);
if(cn.State==ConnectionState.Closed)   cn.Open();
cmd.ExecuteNonQuery();//创建新表,结构同参数中datatable
da=new   OracleDataAdapter(@ "select   *   from   "+targetTableName,cn);
da.Fill(ds, "tmp ");
MessageBox.Show(ds.Tables[0].Rows.Count.ToString());

for       (       int       j       =       0;       j   <   dt.Rows.Count;j++       )      
{      
ds.Tables[ "tmp "].ImportRow(dt.Rows[j]);
}//根据参数datatable更新“tmp“
MessageBox.Show(ds.Tables[ "tmp "].Rows.Count.ToString());


try  
{
System.Data.OracleClient.OracleCommandBuilder   MyCb   =   new   OracleCommandBuilder(da);
da.Update(ds, "tmp ");
        ds.AcceptChanges();//按照MSDN中的例子update,结果数据库中没有插入新的数据
}
catch       (System.Exception       ex)      
{      
MessageBox.Show(ex.Message,       Text);      
i=0;
}     //无异常抛出  

da.Dispose();
cmd.Dispose();
cn.Close();
return   i;
}

------解决方案--------------------
判断下
if ds.HasChanged()
...
------解决方案--------------------
请尽量避免使用
System.Data.OracleClient.OracleCommandBuilder MyCb = new OracleCommandBuilder(da);

使用OracleCommandBuilder 偷懒,你要确定知道他会生成什么样的更新Sql语句。
-------------------------------------
不过楼主的问题不出在这里,应该出在
ds.Tables[ "tmp "].ImportRow(dt.Rows[j]);
DataTable.ImportRow()方法不会改变导入行的DataRowState的属性。
所以针对调用
da.Update(ds, "tmp ");
就没有数据行更新到数据库。因为行状态没有改变。

具体看MSDN对DataTable.ImportRow 方法 的描述。
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref4/html/M_System_Data_DataTable_ImportRow_1_9a038f4b.htm

调用 DataTable.NewRow 时,将使用现有的表架构向表中添加一行,并为该行填充默认值,同时将 DataRowState 设置为 Added。调用 DataTable.ImportRow 将保留现有的 DataRowState 以及该行中的其他值。