有连个文章
1.在用ADO.NET处理数据库的时候,虽然处理的直接对象是数据库,但此时"DataSet"对象中的内容并没有随之改变,而绑定的数据组件显示的数据又来源于"DataSet"对象,这样就会产生一个错觉,就是修改了的记录并没有修改掉,删除的记录并没有删除掉。所以对数据记录进行操作的时候,在修改数据库后,还要对"DataSet"对象进行必要的修改,这样才能保证"DataSet"对象和数据库内容一致、同步。
2.将 DataSet 中的更改解析回数据源。DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本”进行更新,然后在将“原本”更新。 到底哪个是对的??
1.在用ADO.NET处理数据库的时候,虽然处理的直接对象是数据库,但此时"DataSet"对象中的内容并没有随之改变,而绑定的数据组件显示的数据又来源于"DataSet"对象,这样就会产生一个错觉,就是修改了的记录并没有修改掉,删除的记录并没有删除掉。所以对数据记录进行操作的时候,在修改数据库后,还要对"DataSet"对象进行必要的修改,这样才能保证"DataSet"对象和数据库内容一致、同步。
2.将 DataSet 中的更改解析回数据源。DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本”进行更新,然后在将“原本”更新。 到底哪个是对的??
哪位能帮我讲清楚,谢谢了~
1说的事,你对ds修改后,由于ds是数据副本,那是还没有像数据库提交,所以出现暂时的不同步。
2说的是提交修改后返回的ds,这是ds把修改后的内容返回给数据库,验证通过后重新获得结果集。
在.net 2.0中,更新了DataSet后,自动更新原始数据库
那AcceptChanges ( )这个函数就对不2.0来说就没有什么作用了
可能是我看得书太老了吧
悲剧~
然后2,数据库改动。
你这个回答太让人发晕了,本来我就不懂,您这样一说,我...............
2.将 DataSet 中的更改解析回数据源。DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本”进行更新,然后在将“原本”更新。 到底哪个是对的??--------------------------------
两个都对。
1。DataSet中的数据时从数据库中读出来的,如果你根据DataSet里的数据将数据库内容改变之后,如果DataSet没有重新读取数据的话,它里面的数据不是最新的,如果希望得到最新的数据,可以通过程序重新装填fillDataSet。
2。它所说的第二种情况是你的DataSet是通过你的服务器空间DataAdapter生成的,此时它是一个控件,在生成的过程中,DataAdapter中已经自动生成了选择,插入,更新等Sql语句,所以在你更新的时候,是这些控件DataAdapter,DataSet它们自己完成的,他们的完成过程就是2种将的那样,2所说的更新过程是控件自动更新的过程,而非人为的更新过程。一般的做法是不使用空间生成数据集,而是在程序中自己创建对象,然后自己灵活使用,更新,插入,删除等操作也由自己的程序控制,包括数据集内容的Fill。这样比较灵活。用控件的方法则全部自动完成,但灵活性不高,所以比较少用,我初学时是使用控件,现在是自己程序控制。
在缓存中保存数据的状态(具体几种状态忘了)
当修改数据时数据数据状态改变,但在dataset没有接受
更改时还可以还原原来的数据,
如果dataset接受更改完
在更新数据库的话
这时数据就不能更新到数据库
我理解您的意思是在实用DataAdapter控件的时候就会自动更新dataset,不需认为改变,而不用DataAdapter的时候那么dataset就不会自动更新了,只有重新fill才能获得最新值。
页面上的数据是我用DataSet绑定的,当我对页面上的数据进行修改时,在2.0里,我可以把修改的结果回写到DataSet,然后就有个方法可以把DataSet里的数据更新到数据?当然这个回写过程也只是对修改项的回写,回写后,DataSet里的内容就应该是和数据库里的内容是一致的了,因为数据库的回写是根据DataSet来回写的,所以此时只要再重新绑定数据显示控件就应该可以了。这个应该是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 ( ) , "错误!" ) ;
}
}
}
我理解您的意思是在实用DataAdapter控件的时候就会自动更新dataset,不需认为改变,而不用DataAdapter的时候那么dataset就不会自动更新了,只有重新fill才能获得最新值。
-------------------------------
是的,不用数据控件的时候自己来建立ADO.NET对象,自己对DataSet来管理。此时的的DataSet的主要功能就是用来绑定数据显示控件的,如DataGrid等,至于更新,可以从数据显示控件上获取相关主键信息,然后自己获取更新信息,然后执行数据库操作,更新数据库,之后自己再重新利用自己定义的DataAdapter来重新装填DataSet,然后数据显示空间再Bind以后,就会显示最新的数据了。(我用的2003,有程序自己控制的)
在用ADO.NET处理数据库的时候,虽然处理的直接对象是数据库,但此时"DataSet"对象中的内容并没有随之改变,而绑定的数据组件显示的数据又来源于"DataSet"对象,这样就会产生一个错觉,就是修改了的记录并没有修改掉,删除的记录并没有删除掉。所以对数据记录进行操作的时候,在修改数据库后,还要对"DataSet"对象进行必要的修改,这样才能保证"DataSet"对象和数据库内容一致、同步。
因为"DataSet"对象并不是在服务器端产生的,而是在客户端产生的。
-------------------------
不是这样的,客户端只认得html和javascript。
如果dataset何以存在于客户端的话,那多数操作都可以不刷新进行了。但实际上不是这样的。
dataset是在服务器端的。现在为止,想要在客户端存储结构清晰的表数据的,就只有javascript的DOM对象了。
我看大家的意思都是比较赞同先更新dataset再更新数据库了
----------------DataSet是不用更新的。即使更新也不是先更新DataSet在更新数据库,而是应该先更新数据库,之后再更新DataSet。至于2005可能就是直接更新DataSet,然后DataSet会更新数据库的,2005没研究过,不太清楚,2003肯定是先更新数据库,然后再读取数据库更新数据集
我认为dataset是存在在客户端的,它首先是通过查询语句把需要的数据集放到客户端的dataset中,否则真的就像上边说的一样,服务器怎么能有那么大的容量才存储那么多的dataset呢
1中说的修改了数据库内容后(他说的应该是用sql语句修改)还要对DataSet进行修改,这是很无聊的做法,如果用sql语句进行更新数据库的话,再重新Fill一次DataSet就可以了。或者就直接Select()相应的DataRow进行修改然后用DataAdapter的Update()提交回数据库进行更新。
2程序是运行在服务端的当然是服务端,通常这样的做法在winform中比较多,如果是webform的话不能保存DataSet的状态,下次还需重新加载,不是很科学。不过在批量更新的时候还是有优势的。
“在对数据记录进行操作的时候,我想有一些程序员一定有这样一个疑惑,当对数据库服务器请求数据集的时候,就会产生"DataSet"对象,用以管理数据集,这样如果这些对数据库服务器的请求非常多,同样也就会产生很多的"DataSet"对象,达到一定时候必然会使得数据库服务器崩溃。这种想法是自然的,但和实际并不相符,因为"DataSet"对象并不是在服务器端产生的,而是在客户端产生的。所以面对众多的数据请求的时候对数据库服务器的影响并不十分太大。”
这又是怎么回事呢??