有连个文章
1.在用ADO.NET处理数据库的时候,虽然处理的直接对象是数据库,但此时"DataSet"对象中的内容并没有随之改变,而绑定的数据组件显示的数据又来源于"DataSet"对象,这样就会产生一个错觉,就是修改了的记录并没有修改掉,删除的记录并没有删除掉。所以对数据记录进行操作的时候,在修改数据库后,还要对"DataSet"对象进行必要的修改,这样才能保证"DataSet"对象和数据库内容一致、同步。
2.将 DataSet 中的更改解析回数据源。DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本”进行更新,然后在将“原本”更新。 到底哪个是对的??

解决方案 »

  1.   

    要是像第一个说的那样,那我更新数据库的时候岂不是还要手动的更新dataset才能达到和数据库的同步??
    哪位能帮我讲清楚,谢谢了~
      

  2.   

    两个说的都对,只不过说的事一件事的不同步骤。
    1说的事,你对ds修改后,由于ds是数据副本,那是还没有像数据库提交,所以出现暂时的不同步。
    2说的是提交修改后返回的ds,这是ds把修改后的内容返回给数据库,验证通过后重新获得结果集。
      

  3.   

    这样说我如果更改一条记录,那先更改的是谁?它直接更改数据库还是更改dataset里面的纪录再更改到数据库??
      

  4.   

    正常讲应该先改ds中的内容,然后让ds自己去和数据库验证,验证后返回新的结果集。
      

  5.   

    那返回来的结果会自动更新到dataset上来吗?我是不是就不用手动更新它了?
      

  6.   

    在.net 2.0以前,更新了DataSet后,原始数据库没有更新
    在.net 2.0中,更新了DataSet后,自动更新原始数据库
      

  7.   

    yishanhai(一山海)那您说的意思就是先更新dataset再更新数据库了
    那AcceptChanges ( )这个函数就对不2.0来说就没有什么作用了
    可能是我看得书太老了吧
    悲剧~
      

  8.   

    你改动的东西,其实是改的dataset,数据库并没改动
    然后2,数据库改动。
      

  9.   

    peng_0_0_1983(这头猪很瘦) 
    你这个回答太让人发晕了,本来我就不懂,您这样一说,我...............
      

  10.   

    1.在用ADO.NET处理数据库的时候,虽然处理的直接对象是数据库,但此时"DataSet"对象中的内容并没有随之改变,而绑定的数据组件显示的数据又来源于"DataSet"对象,这样就会产生一个错觉,就是修改了的记录并没有修改掉,删除的记录并没有删除掉。所以对数据记录进行操作的时候,在修改数据库后,还要对"DataSet"对象进行必要的修改,这样才能保证"DataSet"对象和数据库内容一致、同步。
    2.将 DataSet 中的更改解析回数据源。DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本”进行更新,然后在将“原本”更新。 到底哪个是对的??--------------------------------
    两个都对。
    1。DataSet中的数据时从数据库中读出来的,如果你根据DataSet里的数据将数据库内容改变之后,如果DataSet没有重新读取数据的话,它里面的数据不是最新的,如果希望得到最新的数据,可以通过程序重新装填fillDataSet。
    2。它所说的第二种情况是你的DataSet是通过你的服务器空间DataAdapter生成的,此时它是一个控件,在生成的过程中,DataAdapter中已经自动生成了选择,插入,更新等Sql语句,所以在你更新的时候,是这些控件DataAdapter,DataSet它们自己完成的,他们的完成过程就是2种将的那样,2所说的更新过程是控件自动更新的过程,而非人为的更新过程。一般的做法是不使用空间生成数据集,而是在程序中自己创建对象,然后自己灵活使用,更新,插入,删除等操作也由自己的程序控制,包括数据集内容的Fill。这样比较灵活。用控件的方法则全部自动完成,但灵活性不高,所以比较少用,我初学时是使用控件,现在是自己程序控制。
      

  11.   

    dataset从数据库装载数据后,就和数据库段开
    在缓存中保存数据的状态(具体几种状态忘了)
    当修改数据时数据数据状态改变,但在dataset没有接受
    更改时还可以还原原来的数据,
    如果dataset接受更改完
    在更新数据库的话
    这时数据就不能更新到数据库
      

  12.   

    gsk99(ZJUT) ( )您说的我不是太理解
    我理解您的意思是在实用DataAdapter控件的时候就会自动更新dataset,不需认为改变,而不用DataAdapter的时候那么dataset就不会自动更新了,只有重新fill才能获得最新值。
      

  13.   

    以上是我自己的理解,看来楼长各位的说法,似乎自己对DataSet的使用还不是很灵活。楼上的各位所说的就是:
    页面上的数据是我用DataSet绑定的,当我对页面上的数据进行修改时,在2.0里,我可以把修改的结果回写到DataSet,然后就有个方法可以把DataSet里的数据更新到数据?当然这个回写过程也只是对修改项的回写,回写后,DataSet里的内容就应该是和数据库里的内容是一致的了,因为数据库的回写是根据DataSet来回写的,所以此时只要再重新绑定数据显示控件就应该可以了。这个应该是2.0的特性吧。不知道是不是和理解的一样。总之听楼上各位一说,我也有些糊涂了
      

  14.   

    请看看这个例子,不知道是否针对2.0的在对数据记录进行操作的时候,有二点必须十分清晰:
      其一:在对数据记录进行操作的时候,我想有一些程序员一定有这样一个疑惑,当对数据库服务器请求数据集的时候,就会产生"DataSet"对象,用以管理数据集,这样如果这些对数据库服务器的请求非常多,同样也就会产生很多的"DataSet"对象,达到一定时候必然会使得数据库服务器崩溃。这种想法是自然的,但和实际并不相符,因为"DataSet"对象并不是在服务器端产生的,而是在客户端产生的。所以面对众多的数据请求的时候对数据库服务器的影响并不十分太大。
      其二:记得在用Delphi编写三层数据模型的时候的,每一次对数据库的修改其实只是对第二层产生的数据集的修改,要真正修改数据库,还必须调用一个另外的方法。在用ADO.NET处理数据库的时候,虽然处理的直接对象是数据库,但此时"DataSet"对象中的内容并没有随之改变,而绑定的数据组件显示的数据又来源于"DataSet"对象,这样就会产生一个错觉,就是修改了的记录并没有修改掉,删除的记录并没有删除掉。所以对数据记录进行操作的时候,在修改数据库后,还要对"DataSet"对象进行必要的修改,这样才能保证"DataSet"对象和数据库内容一致、同步。下面代码是删除当前绑定组件显示的记录的程序代码,此代码是以Access 2000数据库为模板的:
    protected void Delete_record ( object sender , System.EventArgs e )

    DialogResult r = MessageBox.Show ( "是否删除当前记录!" , "删除当前记录!" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;
    int ss = ( int ) r ;
      if ( ss == 6 ) // 按动"确定"按钮

    try{
    file://连接到一个数据库
    string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ;
    OleDbConnection myConn = new OleDbConnection ( strCon ) ;
    myConn.Open ( ) ;
    string strDele = "DELETE FROM person WHERE id= " + t_id.Text ;
    OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ;
    file://从数据库中删除指定记录
    myCommand.ExecuteNonQuery ( ) ;
    file://从DataSet中删除指定记录
    myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . Delete ( ) ;
    myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;
    myConn.Close ( ) ;
    }
    catch ( Exception ed )
    {
    MessageBox.Show ( "删除记录错误信息: " + ed.ToString ( ) , "错误!" ) ;

    }
    }
      

  15.   

    gsk99(ZJUT) ( )您说的我不是太理解
    我理解您的意思是在实用DataAdapter控件的时候就会自动更新dataset,不需认为改变,而不用DataAdapter的时候那么dataset就不会自动更新了,只有重新fill才能获得最新值。
    -------------------------------
    是的,不用数据控件的时候自己来建立ADO.NET对象,自己对DataSet来管理。此时的的DataSet的主要功能就是用来绑定数据显示控件的,如DataGrid等,至于更新,可以从数据显示控件上获取相关主键信息,然后自己获取更新信息,然后执行数据库操作,更新数据库,之后自己再重新利用自己定义的DataAdapter来重新装填DataSet,然后数据显示空间再Bind以后,就会显示最新的数据了。(我用的2003,有程序自己控制的)
      

  16.   

    我看大家的意思都是比较赞同先更新dataset再更新数据库了
      

  17.   

    这个是说Delphi:其二:记得在用Delphi编写三层数据模型的时候的,每一次对数据库的修改其实只是对第二层产生的数据集的修改,要真正修改数据库,还必须调用一个另外的方法。这个是说ADO.net,这个意思和我上面回帖的意思是类似的:
    在用ADO.NET处理数据库的时候,虽然处理的直接对象是数据库,但此时"DataSet"对象中的内容并没有随之改变,而绑定的数据组件显示的数据又来源于"DataSet"对象,这样就会产生一个错觉,就是修改了的记录并没有修改掉,删除的记录并没有删除掉。所以对数据记录进行操作的时候,在修改数据库后,还要对"DataSet"对象进行必要的修改,这样才能保证"DataSet"对象和数据库内容一致、同步。
      

  18.   

    nekiy(我只是个做美工的!) 
       因为"DataSet"对象并不是在服务器端产生的,而是在客户端产生的。
    -------------------------
    不是这样的,客户端只认得html和javascript。
    如果dataset何以存在于客户端的话,那多数操作都可以不刷新进行了。但实际上不是这样的。
    dataset是在服务器端的。现在为止,想要在客户端存储结构清晰的表数据的,就只有javascript的DOM对象了。
      

  19.   

    那您看看那段程序也是手动在进行着dataset的更新操作呀
      

  20.   

    nekiy(我只是个做美工的!) ( ) 信誉:100  2006-05-25 17:28:00  得分: 0  
     
     
       我看大家的意思都是比较赞同先更新dataset再更新数据库了  
     
    ----------------DataSet是不用更新的。即使更新也不是先更新DataSet在更新数据库,而是应该先更新数据库,之后再更新DataSet。至于2005可能就是直接更新DataSet,然后DataSet会更新数据库的,2005没研究过,不太清楚,2003肯定是先更新数据库,然后再读取数据库更新数据集
      

  21.   

    kolosi(小丑巴其)
    我认为dataset是存在在客户端的,它首先是通过查询语句把需要的数据集放到客户端的dataset中,否则真的就像上边说的一样,服务器怎么能有那么大的容量才存储那么多的dataset呢
      

  22.   

    gsk99(ZJUT)那2003就是先更新数据库,更新完了之后自动的返回给dataset更新的内容(在使用DataAdapter控件的情况下)
      

  23.   

    ado.net有连接式数据访问方式和断开式访问方式,更新方式同样有通过command对象提交sql查询或者通过离线dataset对象一次性提交更新。
    1中说的修改了数据库内容后(他说的应该是用sql语句修改)还要对DataSet进行修改,这是很无聊的做法,如果用sql语句进行更新数据库的话,再重新Fill一次DataSet就可以了。或者就直接Select()相应的DataRow进行修改然后用DataAdapter的Update()提交回数据库进行更新。
    2程序是运行在服务端的当然是服务端,通常这样的做法在winform中比较多,如果是webform的话不能保存DataSet的状态,下次还需重新加载,不是很科学。不过在批量更新的时候还是有优势的。
      

  24.   

    2003也可以像你例子里压仰,更新数据库的时候,同时更新DataSet,一样的,只如果你不希望这样手动更新DataSet,那么你可以自己再到数据库读取数据再FillDataset。
      

  25.   

    LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^) 请老大回答一下dataset是产生在客户端还是服务器呢
      

  26.   

    那像上面所说的
    “在对数据记录进行操作的时候,我想有一些程序员一定有这样一个疑惑,当对数据库服务器请求数据集的时候,就会产生"DataSet"对象,用以管理数据集,这样如果这些对数据库服务器的请求非常多,同样也就会产生很多的"DataSet"对象,达到一定时候必然会使得数据库服务器崩溃。这种想法是自然的,但和实际并不相符,因为"DataSet"对象并不是在服务器端产生的,而是在客户端产生的。所以面对众多的数据请求的时候对数据库服务器的影响并不十分太大。”
    这又是怎么回事呢??