数据库死活没有反应
目的是把objdataset1的数据插到tempdata中,这两个都是dataset
并且和Gridview2绑定显示,数据成功插入tempdata
但是最后一步Updata却无反应,
表设置了主键 String DatabaseConnectString = "Data Source=orcl;Persist Security Info=True;User ID=scott;Password=cat;";
        OracleConnection OracleConn = new OracleConnection(DatabaseConnectString);
        OracleConn.Open();
        OracleDataAdapter adapter=new OracleDataAdapter();
        OracleCommand slc = new OracleCommand("SELECT * FROM DUMMY_DOMAIN", OracleConn);        adapter.SelectCommand = slc;
        OracleCommandBuilder ocb = new OracleCommandBuilder(adapter);        DataSet tempData = new DataSet();
        adapter.FillSchema(tempData, SchemaType.Source, "DUMMY_DOMAIN");
        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        adapter.Fill(tempData,"DUMMY_DOMAIN");
        
        foreach (DataRow dr in objDataset1.Tables[0].Rows)
        {
            tempData.Tables[0].ImportRow(dr);
        }        GridView2.DataSource = tempData;
        GridView2.DataBind();        adapter.Update(tempData, "DUMMY_DOMAIN");        OracleConn.Close();

解决方案 »

  1.   

    跟踪一下,看看tempData的行状态
      

  2.   

    我在这里
            GridView2.DataSource = tempData; 
            GridView2.DataBind(); 
    把插入之后tempdata显示在页面上
    显示出插入后的数据
    update后用sqlplus查数据库发现没有东西插入...
    但是写sqlcommand然后执行是可以的
      

  3.   

    你把ocb的更新方法的sql打出来看一下有没有问题
    ocb.GetUpdateCommand().CommandText
    update之后,加上AcceptChanges()方法
      

  4.   


    "DELETE FROM DUMMY_DOMAIN WHERE ((DQ_NUM = :p1) AND ((:p2 = 1 AND DQ_NAME IS NULL) OR (DQ_NAME = :p3)) AND ((:p4 = 1 AND DQ_TEXT IS NULL) OR (DQ_TEXT = :p5)))""UPDATE DUMMY_DOMAIN SET DQ_NUM = :p1, DQ_NAME = :p2, DQ_TEXT = :p3 WHERE ((DQ_NUM = :p4) AND ((:p5 = 1 AND DQ_NAME IS NULL) OR (DQ_NAME = :p6)) AND ((:p7 = 1 AND DQ_TEXT IS NULL) OR (DQ_TEXT = :p8)))""INSERT INTO DUMMY_DOMAIN (DQ_NUM, DQ_NAME, DQ_TEXT) VALUES (:p1, :p2, :p3)"ocb生成代码是这样的
    update之后再给数据集tempdata加上acceptChanges()方法么?
    我刚才试了 没有什么作用
      

  5.   

    foreach (DataRow dr in objDataset1.Tables[0].Rows) 
            { 
                tempData.Tables[0].ImportRow(dr); 
            } 这个循环执行的时候,objDataset1.Tables[0] 中的行修改了吗,做过什么操作。
    ImportRow 会复制dr的DataRowState 。
    也就是说ImportRow 不等于新增行。
      

  6.   

    喔,原来如此,果然是这个原因 多谢兄台
    经兄台提示 我搜到一篇帖子
    http://topic.csdn.net/t/20050520/15/4022937.html首先要知道DataAdapter.Update方法的运行原理,   
        
      原始的DataTable,所有行的状待(DataRowState)都是没有改变的   
      当操作其中的数据时,相应的行状态会被更改,例如删除一行,DataRowState状态就被改为Delete   
      最后,调用UPdate()的时候就检索一下行状态,凡是有更改的行都自动生成一下sql语句反映到数据库   
        
      有不少人有这个误会:DataAdapter.Update方法是跟数据库的数据进行比较有更改的就更新==绝对是个误解!   
        
      ds2.Merge(ds1),那么ds2就成了ds1了,里面的数据行的状态没有记录任何更改,所以能成功运行,但是数据没有更改;   
        
      遗憾的是DataRowState是个只读属性,没办法手动更改之,因此只能一行一行地进行处理,而不能使用merge方法   
    那么问题似乎明白了,但是怎么解决呢?DataRowState又改不成。还是要用SQL么?
      

  7.   

    是啊,直接用sql不就行了么?
      

  8.   

    不想用sql啊,这样封装总觉得不彻底
    决定在循环里新建DataRow 然后对DataRow各项幅值,最后插进去。
      

  9.   


            foreach (DataRow dr in objDataset1.Tables[0].Rows)
            {
                DataRow nwdr=tempData.Tables[0].NewRow();
                nwdr["DQ_NUM"]=dr["DQ_NUM"];
                nwdr["DQ_NAME"] = dr["DQ_NAME"];
                nwdr["DQ_TEXT"] = dr["DQ_TEXT"];
                tempData.Tables[0].Rows.Add(nwdr);
              
            }把循环改成这样就可以了
    其实第一位兄弟就说对了 只是我没明白过来
    多谢楼上几位的帮忙
      

  10.   

    我以前也做过这样的操作!要用适配器读取数据库的表数据放入DATASET结果集中的Table,
    然后再这Table中添加数据,删除数据,更新数据,然后将Updata(修改后的表) using (GetSqlConn()) //GetSqlConn()自定义连接方法!!
                {
                    //创建适配器
                    SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from tables", conn);
                    
                    DataSet a = new DataSet();                dataAdapter.Fill(a);
                                 
                     // .....对a的TABLE插入N行数据!!!                 //执行更新                 SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);                dataAdapter.Update(a);              }
    //这里操作SQL数据库