1、目前我从sql server 获取了一个数据集合: myDataSet2、我希望从sql server 获取的数据集,来填充我的Oracle 数据库中的表。表结构和这个 myDataSet 一致。3、相关朋友的解答如下:   有一个高手的回答,我修改如下,执行没有问题。但没更新数据到Oracle中。不知道什么原因。 public void CreateCmdsAndUpdate1(string connectionString,
        string queryString, string tableName)
{
        using (OracleConnection connection = new OracleConnection(connectionString))
                {
                    OracleDataAdapter adapter = new OracleDataAdapter();
                    adapter.SelectCommand = new OracleCommand(queryString, connection);
                    OracleCommandBuilder builder = new OracleCommandBuilder(adapter);                    connection.Open();                    DataSet customers = new DataSet();
                    adapter.Fill(customers, tableName);                    //code to modify data in dataset here                    adapter.Update(customers, tableName);
   
                    //return customers;
                }
}
4、相关贴子一如下:
http://topic.csdn.net/u/20090904/09/cc5f3bc4-dd0d-4d0d-a40c-b016bdc66ff5.html
5、解决后,另开100分贴感谢。

解决方案 »

  1.   

    首先这个DataSet是你Update之前你要查询出来一模一样的结构相同的数据
    B如: select a.firstname, a.lastname, a.email from usertable a
    那么这个时候(update method)更新的时候也是顺序更新firstname,lastname,email
      

  2.   

    先查询出来一个空数据也行,
    select a.firstname, a.lastname, a.email from usertable a where 1=2
      

  3.   


    由于我是在测试,所以结构完全一样,Copy过来的. 
      

  4.   


    foreach (DataRow dr in dt.Rows)
                {
                    dr.SetAdded();
                }
    dt为从SqlServer取出来的,
    将每一行的RowState设置为新增加的.在保存oracle中,试试看
      

  5.   

    先试试更新一行//......adapter.Fill(customers, tableName); DataTable dt=customers.Tables["tableName"];
    dt.PrimaryKey=new DataColumn[]{dt.Columns["id"]};//假设主键是id
    DataRow dr=dt.Rows.Find(0);
    dr["name"]="test";//字段name设为test
    adapter.Update(customers,tableName);
    //......
      

  6.   

    至少要写上OracleDataAdaptor的selectCommand;
    adapter.SelectCommand = new OracleCommand(
                queryString, connection);
      

  7.   

    这个UPDATECOMMAND属性你没写:
    EX:
    da.updatecommand = new Oraclecommand("update linhai set contract = @contract " + "where order_id = @order_id" , conn); da.updatecommand.parameters.add("@contract", sqldbtype.nvarchar, 15, "contract"); da.updatecommand.parameters.add("@order_id", sqldbtype.nvarchar, 15, "order_id"); 
      

  8.   

    哦,不好意思,这条语句自动生成了.
    OracleCommandBuilder builder = new OracleCommandBuilder(adapter); 
    同一连接中通过DATAADAPTER桥梁这样写没错.
    但由于这是两个不同的连接.
    selectcommand是连接SQL SERVER,而UPDATECOMMAND是准备连接ORACLE,这样写法肯定不行.
      

  9.   

    如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。有关更多信息,请参阅自动生成的命令。所以估计还是要用单独写selectcommand和updatecommand的方式来写,第二个参数指向不同的连接.
      

  10.   

    从MSSQL获取DataSet的动作和更新Oracle的动作分开执行//customers 为有数据的DataSet
    public void CreateCmdsAndUpdate1(DataSet customers ,string connectionString, 
            string queryString, string tableName) 

            using (OracleConnection connection = new OracleConnection(connectionString)) 
                    { 
                        OracleDataAdapter adapter = new OracleDataAdapter(); 
                        adapter.SelectCommand = new OracleCommand(queryString, connection); 
                        OracleCommandBuilder builder = new OracleCommandBuilder(adapter);                     connection.Open();                                        //code to modify data in dataset here                     adapter.Update(customers, tableName); 
      
                        //return customers; 
                    } 
    } 没测试,估计差不多
      

  11.   

    由于连接不同,所以不能使用自动生成命令:
    http://www.g168.net/txt/asp.net/4-2-f.htm
      

  12.   

    楼主先要搞明白,微软怎么知道DataTable中的那些是修改的,那些是删除,那些是新增的,那些是没有变动的,都是根据row的RowState属性来的,你从SqlServer中取出来的数据,RowState就是没有变动的,你直接像oracle库中保存,因为RowState为没有变动过,所以不会保存数据,
    你得把row的RowState修改为新增,那么在保存到oracle就行了。
    代码参见我在4楼写的,
    在看看自己连接的数据库信息等等。
      

  13.   

    如果用row来循环,效率能跟上吗?