第一次使用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 以及该行中的其他值。