CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  VB.NET

用DataAdapter.Update(Dataset),数据源总是不变??

楼主cyczl666(蔡蔡)2005-04-03 22:15:28 在 .NET技术 / VB.NET 提问

用DataAdapter.Update(Dataset),数据源总是不变  
  代码如下:  
  'Update   dataset  
  dsGreaser.Tables(0).Rows(index).Item("CurrentValue")   =   10  
  dsGreaser.Tables(0).Rows(index).Item("SetValue")   =   10  
  dsGreaser.Tables(0).Rows(index).Item("TotalValue")   =   10  
   
  'Update   database  
  Dim   strDbFileName   As   String   =   "data\parameter.mdb"  
  Dim   strConnectionString   As   String   =   "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data   Source="   +   strDbFileName  
  Dim   strCommandString   As   String   =   "SELECT   *   FROM   GreaserParameter"  
  Dim   myConnection   As   New   OleDbConnection(strConnectionString)  
  Dim   myDataAdapter   As   New   OleDbDataAdapter(strCommandString,   myConnection)  
  Dim   myCommandBuilder   As   New   OleDbCommandBuilder(myDataAdapter)  
  myDataAdapter.UpdateCommand   =   myCommandBuilder.GetUpdateCommand  
  myDataAdapter.Update(dsGreaser)  
  dsGreaser.AcceptChanges()  
   
  但是改成这样就可以:  
  Dim   strDbFileName   As   String   =   "data\parameter.mdb"  
  Dim   strConnectionString   As   String   =   "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data   Source="   +   strDbFileName  
  Dim   strCommandString   As   String   =   "SELECT   *   FROM   GreaserParameter"  
  Dim   myConnection   As   New   OleDbConnection(strConnectionString)  
  Dim   myDataAdapter   As   New   OleDbDataAdapter(strCommandString,   myConnection)  
  Dim   myCommand   As   New   OleDbCommand("UPDATE   GreaserParameter   SET   CurrentValue=10,   SetValue=10,   TotalValue=10   WHERE   Index=1",   myConnection)  
  myCommand.Connection.Open()  
  myCommand.ExecuteNonQuery()  
  myCommand.Connection.Close()  
  但是这样我的Dataset就没用了 问题点数:200、回复次数:18Top

1 楼lzmtw(水如烟)回复于 2005-04-04 02:15:57 得分 80

OleDbDataAdapter有四条SQL语句,分别是  
  OleDbDataAdapter.SelectCommand.CommondText  
  OleDbDataAdapter.InsertCommand.CommondText  
  OleDbDataAdapter.DeleteCommand.CommondText  
  OleDbDataAdapter.UpdateCommand.CommondText  
  其中OleDbDataAdapter.SelectCommand.CommondText就是你的"SELECT   *   FROM   GreaserParameter"  
  其它三条语句,默认为空的,你有三条途径为赋值:  
  一是通过可视化向导;  
  二是能过OleDbCommandBuilder;  
  三是手工赋值。  
  其中一、二是自动生成三条SQL语句,只是两者都有个前提,就是  
  在设置数据库时,表GreaserParameter至少有一个字段需设置为主键。  
  你用了Builder只是无效,就那是说,你的表没有一个字段设为主键。  
  重新设置这个表,设一主键既可。  
   
  第二种方法是SQL语句直接更新,跟表有没有主键无关,因此倒是成功了。Top

2 楼lzmtw(水如烟)回复于 2005-04-04 02:22:29 得分 0

你可以用这种方法去检测一下各个SQL语句:  
  Dim   strCommandString   As   String   =   "SELECT   *   FROM   GreaserParameter"  
  Dim   myConnection   As   New   OleDbConnection(strConnectionString)  
  Dim   myDataAdapter   As   New   OleDbDataAdapter(strCommandString,   myConnection)  
  Dim   myCommandBuilder   As   New   OleDbCommandBuilder(myDataAdapter)  
  Console.WriteLine(myDataAdapter.InsertCommand.CommandText)  
  Console.WriteLine(myDataAdapter.UpdateCommand.CommandText)  
  Console.WriteLine(myDataAdapter.DeleteCommand.CommandText)Top

3 楼landlordh(work wonders)回复于 2005-04-04 08:12:10 得分 10

呵呵,水如烟已经讲得很清楚了Top

4 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-04-04 08:20:46 得分 10

一个dataadapter的update方法,没有被加入到try   end   try   块中是危险的。而且使用update方法时也要确保含有主键。Top

5 楼3tzjq(永不言弃)回复于 2005-04-04 08:30:42 得分 10

推荐用OleDbDataAdapter的数据适配器来生成这些Insert/Update/DeleteCommand对象!  
  也可以用   lzmtw(水如烟)的   OleDbCommandBuilder(myDataAdapter)方法来生成。Top

6 楼cyczl666(蔡蔡)回复于 2005-04-04 09:11:45 得分 0

可是我定义了主键啊  
  中断监视myOldDBDataAdapter.UpdateCommand   不是空。  
  CommandText也有相应语句  
  我也使觉得很奇怪,才发的贴的Top

7 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-04-04 09:34:07 得分 20

好象根本就没有用一个myDataAdapter来填充和更新啊!我的意思是你要把填充的和更新的dataadapter   用一个!  
  private   myDataAdapter   as   sqldataadapter  
  然后在一个过程中填充,  
  在另一个过程中updateTop

8 楼cyczl666(蔡蔡)回复于 2005-04-04 11:42:15 得分 0

用控制台检测SQL语句得道的结果:  
  INSERT   INTO   GreaserParameter(   Index   ,   Mode   ,   CommPort   ,   GasType   ,   CurrentValue   ,   SetValue   ,   TotalValue   ,   Density   ,   Price   ,   Total   )   VALUES   (   ?   ,   ?   ,   ?   ,   ?   ,   ?   ,   ?   ,   ?   ,   ?   ,   ?   ,   ?   )  
   
  UPDATE   GreaserParameter   SET   Index   =   ?   ,   Mode   =   ?   ,   CommPort   =   ?   ,   GasType   =   ?   ,   CurrentValue   =   ?   ,   SetValue   =   ?   ,   TotalValue   =   ?   ,   Density   =   ?   ,   Price   =   ?   ,   Total   =   ?   WHERE   (   (Index   =   ?)   AND   ((?   =   1   AND   Mode   IS   NULL)   OR   (Mode   =   ?))   AND   ((?   =   1   AND   CommPort   IS   NULL)   OR   (CommPort   =   ?))   AND   ((?   =   1   AND   GasType   IS   NULL)   OR   (GasType   =   ?))   AND   ((?   =   1   AND   CurrentValue   IS   NULL)   OR   (CurrentValue   =   ?))   AND   ((?   =   1   AND   SetValue   IS   NULL)   OR   (SetValue   =   ?))   AND   ((?   =   1   AND   TotalValue   IS   NULL)   OR   (TotalValue   =   ?))   AND   ((?   =   1   AND   Density   IS   NULL)   OR   (Density   =   ?))   AND   ((?   =   1   AND   Price   IS   NULL)   OR   (Price   =   ?))   AND   ((?   =   1   AND   Total   IS   NULL)   OR   (Total   =   ?))   )  
   
  DELETE   FROM     GreaserParameter   WHERE   (   (Index   =   ?)   AND   ((?   =   1   AND   Mode   IS   NULL)   OR   (Mode   =   ?))   AND   ((?   =   1   AND   CommPort   IS   NULL)   OR   (CommPort   =   ?))   AND   ((?   =   1   AND   GasType   IS   NULL)   OR   (GasType   =   ?))   AND   ((?   =   1   AND   CurrentValue   IS   NULL)   OR   (CurrentValue   =   ?))   AND   ((?   =   1   AND   SetValue   IS   NULL)   OR   (SetValue   =   ?))   AND   ((?   =   1   AND   TotalValue   IS   NULL)   OR   (TotalValue   =   ?))   AND   ((?   =   1   AND   Density   IS   NULL)   OR   (Density   =   ?))   AND   ((?   =   1   AND   Price   IS   NULL)   OR   (Price   =   ?))   AND   ((?   =   1   AND   Total   IS   NULL)   OR   (Total   =   ?))   )  
   
  但是我并不是想每条记录都更新,只是想更新给定的Row  
  我写的SQL语句是:“UPDATE   GreaesrParameter   CurrentValue   =   ?   ,   SetValue   =   ?   ,   TotalValue   =   ?   WHERE   Index   =   ”(index+1).ToString  
  我只想更新指定行的三个字段,用OleDbCommandBuilder生成的命令是全部更新。这样会花很长时间。  
  如果我用myCommand.ExecuteNonQuery()也可以实现我要的功能,只是Dataset没有很好的利用  
  Top

9 楼zhpsam109(JACKY.昊昊)回复于 2005-04-04 11:52:47 得分 20

更新前先看看!dsGreaser.GetChages.Tables[0].Rows.Count  
   
   
  另外,你好像先应该select,然后改变数据集,然后update,看你的代码????????Top

10 楼cyczl666(蔡蔡)回复于 2005-04-04 12:07:24 得分 0

我那个是一个更新过程中的代码  
  Fill的动作在程序启动时就已经完成了  
  dsGreaser.GetChages.Tables[0].Rows.Count应该是不会变的  
  因为我只是改变了值,并没有添加或删除行  
   
  Top

11 楼lzmtw(水如烟)回复于 2005-04-04 12:39:12 得分 20

别弄糊涂我了。  
  一、行的更新。没有改动过的行adapter是不会去理睬的,你大可放心。  
  你可以这样去验证,在Update之前,DataSet或DataTable来一个AcceptChange,保证你的Update快速之极,当然半点效果是没有的了。  
  二、字段更新。如果你这针对某些字段进行更新而不必更新别的字段,可以这样做(取巧的办法):  
  用向导的方式生成代码,然后删去不要的字段,删去不要的字段的Parameter.这样就OK了。Top

12 楼fds2003(Hunter)回复于 2005-04-04 13:15:18 得分 10

UPTop

13 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-04-04 14:09:53 得分 20

你用试dsGreaser.getchanges()是否为nothing判断一下啊?看看是否真的有修改!Top

14 楼cyczl666(蔡蔡)回复于 2005-04-04 14:38:38 得分 0

ft,弄了一上午还是没有搞定阿!  
  我的主要代码如下:  
  Dim   strDbFileName   As   String   =   "data\parameter.mdb"  
  Dim   strConnectionString   As   String   =   "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data   Source="   +   strDbFileName  
  Dim   strSelectCommandString   As   String   =   "SELECT   *   FROM   GreaserParameter"  
  Dim   myConnection   As   New   OleDbConnection(strConnectionString)  
  Dim   myDataAdapter   As   New   OleDbDataAdapter(strSelectCommandString,   myConnection)  
  Dim   dsGreaser   As   New   DataSet  
   
  Private   Sub   InitParameter()  
          myDataAdapter.Fill(dsGreaser)  
   
          ……     (其他的初始化代码)  
   
  End   Sub  
   
  ……     (其他的程序代码)  
   
  Private   Sub   UpdateParameter(ByVal   index   As   Integer)  
          'Update   dataset  
          dsGreaser.Tables(0).Rows(index).Item(4)   =   g_Greaser(index).CurrentValue  
          dsGreaser.Tables(0).Rows(index).Item(5)   =   g_Greaser(index).SetValue  
          dsGreaser.Tables(0).Rows(index).Item(6)   =   g_Greaser(index).TotalValue  
          'Update   database  
          Dim   strUpdateCommandString   As   String   =   "UPDATE   GreaserParameter   SET   CurrentValue=?,SetValue=?,TotalValue=?   WHERE   Index="   +   (index   +   1).ToString  
          myDataAdapter.UpdateCommand   =   New   OleDbCommand(strUpdateCommandString)  
          myDataAdapter.Update(dsGreaser)  
          dsGreaser.AcceptChanges()  
  End   Sub  
   
  InitParameter是在Form的Load事件中执行的  
  UpdateParameter是在完成某一操作以后执行的  
   
  我把DataConnection和DataAdapter都改成全局的了,还是不行。  
  高手看看吧!如何改?Top

15 楼cyczl666(蔡蔡)回复于 2005-04-04 15:39:23 得分 0

感谢大家的关心  
   
  OK了。把Adapter舍维全局的,还是要用CommandBulider  
  真是ft  
  是我自己写的CommandText不对吗?  
   
  Top

16 楼hjh1982(能说不是错)回复于 2005-04-04 15:50:27 得分 0

要用CommandBulider  
  在2003下要使用的  
  Top

17 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-04-04 15:50:31 得分 0

觉得不是commandtext不对了。似乎就是因为没有使用同一个dataadapter来fill和update的缘故。就象上面我说的,如果你没有用第2次创建的dataadapter来fill就用它来update,好象就是这个样子了。应该是在fill的时候建立了真正的关联,我是说dataadapter和dataset,所以你用fill过的来updatae就可以。应该是这样。Top

18 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-04-04 15:52:12 得分 0

觉得不是commandtext不对了。似乎就是因为没有使用同一个dataadapter来fill和update的缘故。就象上面我说的,如果你没有用第2次创建的dataadapter来fill就用它来update,好象就是这个样子了。应该是在fill的时候建立了真正的关联,我是说dataadapter和dataset,所以你用fill过的来updatae就可以。应该是这样。Top

相关问题

  • 自己生成的 DataSet (不是用DataAdapter得到的),能用DataAdapter 来 Update 数据库吗?How?
  • 用dataAdapter+dataSet删除数据库中纪录疑惑
  • DataSet中数据的Update问题
  • 用DataAdapter的InsertCommand把DataSet中的数据插入表出现的问题
  • 利用DataSet和DataAdapter代码实现数据库操作问题~急!!!!
  • 如何在C#中使用DataAdapter的update()删除数据库中的数据?
  • 有谁用DataAdapter和DataSet配合的数据存储模式开发大型软件?
  • 有关DataAdapter 与 DataSet
  • dataset 数据更新问题:
  • 更新dataset到数据库

关键词

  • 字段
  • 代码
  • 语句
  • 数据
  • dsgreaser
  • mydataadapter
  • greaserparameter
  • totalvalue
  • strconnectionstring
  • dataadapter

得分解答快速导航

  • 帖主:cyczl666
  • lzmtw
  • landlordh
  • hamadou
  • 3tzjq
  • hamadou
  • zhpsam109
  • lzmtw
  • fds2003
  • hamadou

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo