以前总是喜欢手工生成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;
}

解决方案 »

  1.   

    判断下
    if ds.HasChanged()
    ...
      

  2.   

    请尽量避免使用
    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 以及该行中的其他值。
      

  3.   

    谢谢zhzuo(秋枫) ( ) 只要在import之后将rowstate设置为added就可以实现我要得了