CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

关于DataAdapter的UPDATE问题 求高手解答!

楼主Sharnhost(荷兰风车车)2004-12-04 17:10:49 在 .NET技术 / ASP.NET 提问

Update   requires   a   valid   UpdateCommand   when   passed   DataRow   collection   with   modified   rows.    
  Description:   An   unhandled   exception   occurred   during   the   execution   of   the   current   web   request.   Please   review   the   stack   trace   for   more   information   about   the   error   and   where   it   originated   in   the   code.    
  出现错误如下:  
  Exception   Details:   System.InvalidOperationException:   Update   requires   a   valid   UpdateCommand   when   passed   DataRow   collection   with   modified   rows.  
   
  Source   Error:    
   
   
  Line   57:           dsDataSet.Tables("Members").Rows(shtR)("UserTel")=txtTemp.Text  
  Line   58:           '将DataTable   的数据更新回数据源  
  Line   59:           dscA.Update(dsDataSet,"Members")  
  Line   60:           dgA.EditItemIndex=-1  
  Line   61:           BindGrid()  
   
  全部代码如下,求各位大哥看看!再更新时出错!  
  昨天提问,有人说加一句  
  Dim   builder   As   OleDbCommandBuilder=New   OleDbCommandBuilder(dscA)  
  但仍出错:Exception   Details:   System.Data.OleDb.OleDbException:   至少一个参数没有被指定值。  
   
  是不是一定要OLEDBCOMMAND   写SQL语句   不是说DataAdapter碰到不一样的ROW自动更新的吗?  
  求高手解答。  
  //////////////////////////////////////////////////////////////////////////////////  
  <%@   Page   Language="VB"   Debug="true"   %>  
  <%@Import   Namespace=System.Data.OleDb%>  
  <%@Import   Namespace=System.Data%>  
   
  <html>  
  <head>  
  <style>  
  body,td{font-size:9pt;line-height:120%}  
  a{TEXT-DECORATION:none;COLOR:0099FF}a:hover{COLOR:FF0000}  
  </style>  
  <meta   http-equiv="Content-Type"   content="text/html;   charset=gb2312">  
  <title>DataGrid   Update</title>  
  </head>  
   
  <Script   Language="VB"   Runat="Server">  
          Dim   Provider   =   "Provider=Microsoft.Jet.OLEDB.4.0"  
          Dim   DataBase   =   "Data   Source="   &   Server.MapPath(   "dtbase/db1.mdb"   )  
          Dim   Conn   As   OleDbConnection   =   New   OleDbConnection(   Provider   &   ";"   &   DataBase   )  
   
          Dim   SQL   As   String   =   "Select   *   From   Members"  
   
  Dim   dscA   As   OleDbDataAdapter   =   New   OleDbDataAdapter(SQL,   Conn)  
  Dim   dsDataSet   As   DataSet   =   New   dataset()  
   
  Sub   Page_Load(Sender   As   Object,   e   As   EventArgs)  
          If   Page.IsPostBack=False   Then  
                BindGrid()  
          End   If  
  End   Sub  
   
  Sub   BindGrid()  
          dscA.Fill(dsDataSet,"Members")  
          dgA.DataSource=dsDataSet.Tables("Members").DefaultView  
          Page.DataBind()  
  End   Sub  
   
  Sub   dgA_PageChg(Sender   As   Object,   e   As   DataGridPageChangedEventArgs)  
          dgA.CurrentPageIndex   =   e.NewPageIndex  
  BindGrid()  
  End   Sub  
   
  Sub   dgA_ECmd(Sender   As   Object,   e   As   DataGridCommandEventArgs)  
          dgA.EditItemIndex=e.Item.ItemIndex  
          BindGrid()  
  End   Sub  
   
  Sub   dgA_UCmd(Sender   As   Object,   e   As   DataGridCommandEventArgs)  
          BindGrid()  
          Dim   shtR   As   Short=(dgA.CurrentPageIndex   *   dgA.PageSize)   +   dgA.EditItemIndex  
          Dim   txtTemp   As   TextBox  
          txtTemp=e.Item.Cells(0).Controls(0)   '取回第一个储存格中的TextBox  
                                                                                  '将数据填回对应的DataTable   中  
          dsDataSet.Tables("Members").Rows(shtR)("UserName")=txtTemp.Text  
           
  txtTemp=e.Item.Cells(1).Controls(0)   '取回第二个储存格中的TextBox  
                                                                                  '将数据填回对应的DataTable   中  
          dsDataSet.Tables("Members").Rows(shtR)("UserTel")=txtTemp.Text  
          '将DataTable   的数据更新回数据源  
          dscA.Update(dsDataSet,"Members")  
          dgA.EditItemIndex=-1  
          BindGrid()  
  End   Sub  
   
  Sub   dgA_CCmd(Sender   As   Object,   e   As   DataGridCommandEventArgs)  
          dgA.EditItemIndex=-1  
          BindGrid()  
  End   Sub  
  </Script>  
   
  <Form   Runat="Server">  
  <ASP:DataGrid   Id="dgA"   AllowPaging="True"   PageSize="2"   OnPageIndexChanged="dgA_PageChg"   Runat="Server"  
  PagerStyle-Mode="NumericPages"   BorderColor="#808080"   HeaderStyle-Font-Names="Courier   New"   HeaderStyle-BackColor="#D1DCEB"  
  HeaderStyle-Font-Bold="True"   HeaderStyle-HorizontalAlign="Center"   AutoGenerateColumns="False"  
  OnEditCommand="dgA_ECmd"   OnUpdateCommand="dgA_UCmd"   OnCancelCommand="dgA_CCmd"   >  
   
  <Columns>  
  <ASP:BoundColumn   HeaderText="姓名"   DataField="UserName"/>  
   
  <ASP:BoundColumn   HeaderText="电话"   DataField="UserTel"/>  
   
  <ASP:EditCommandColumn   HeaderText="编辑"   ButtonType="LinkButton"  
  EditText="编辑"   UpdateText="更新"   CancelText="放弃"   />  
  </Columns>  
   
  </ASP:DataGrid>  
  </Form>  
   
  </body>  
  </html> 问题点数:0、回复次数:27Top

1 楼simonw(代码@痕记)回复于 2004-12-04 17:24:18 得分 0

dscA   .SelectCommand   =   New   OleDbCommand(SQL,   myConn)  
  Dim   cb   As   OleDbCommandBuilder   =   New   OleDbCommandBuilder(dscA   )  
  Top

2 楼Sharnhost(荷兰风车车)回复于 2004-12-04 17:46:46 得分 0

我改成  
          Dim   dscA   As   OleDbDataAdapter   =   New   OleDbDataAdapter()  
          dscA.SelectCommand   =   New   OleDbCommand(SQL,   Conn)  
          Dim   cb   As   OleDbCommandBuilder=New   OleDbCommandBuilder(dscA)  
          Dim   dsDataSet   As   DataSet   =   New   dataset()  
   
        Conn.Open()  
   
  还是不行  
  Compiler   Error   Message:   BC30188:   Declaration   expected.  
  Line   21:    
  Line   22:           Dim   dscA   As   OleDbDataAdapter   =   New   OleDbDataAdapter()  
  Line   23:           dscA.SelectCommand   =   New   OleDbCommand(SQL,   Conn)  
  Top

3 楼Sharnhost(荷兰风车车)回复于 2004-12-04 17:49:37 得分 0

是不是要用自个再写UpdateCommand   的SQL语句?Top

4 楼simonw(代码@痕记)回复于 2004-12-04 18:29:55 得分 0

自动要是不行只有自己写UpdateCommand   了Top

5 楼Sharnhost(荷兰风车车)回复于 2004-12-04 18:43:32 得分 0

谢谢!Top

6 楼OneDotRed(武装到眼神)回复于 2004-12-04 18:48:57 得分 0

你先在一个程序中试试吧  
   
  private   sub   UpdateDataSet  
        dim   cn   as   new   OleDbConnection(   "xxx"   );  
        cn.Open()  
   
        dim   oda     as   new   OleDbDataAdapter(   "select   xxx   from   ttt   "   ,   cn   )  
        oda.MissingSchemaAction   =   MissingSchemaAction.AddWithKey       //一定需要加这一句  
        dim   ocb   as   new   oledbcommandbuilder(   oda   )  
        ocb.getupdatecommand()  
         
        dataset   ds   =   new   dataset();  
        oda.Fill(   ds   );  
       
        ..在ds.Tables(0)表中添加或删除数据  
         
  oda.Update(   ds   ,   "tableName");  
  end   sub  
  '注意table必须有主键,在asp.net中,你声明的那些全局变量可能不行的,除非将它们放至session或viewstate中,需要时再取出来,Top

7 楼xiaomaolover(小M)回复于 2004-12-04 19:07:03 得分 0

你没有定义CommandBuilder  
   
  Top

8 楼sweet12345(幸福的狗狗)回复于 2004-12-04 19:13:17 得分 0

要结合使用commandbuilder  
                  Dim   dcmb   As   New   SqlCommandBuilder  
                  Dim   dadp   As   New   SqlDataAdapter  
                  dcmb.DataAdapter   =   dadp  
                  dadp.Update(DataSet)Top

9 楼swzlxm(守望者)回复于 2004-12-04 19:24:38 得分 0

出錯不是說得很清楚嗎?  
   
  更新需要一個更新語句,你的SqlDataAdapter有UPDATECOMMAND嗎?有INSERTCOMMAND嗎?有DELETECOMMAND嗎?沒有的話談什麽更新Top

10 楼yanransoft()回复于 2004-12-04 20:13:18 得分 0

Dim   dscA   As   OleDbDataAdapter   =   New   OleDbDataAdapter(SQL,   Conn)  
  Dim   db   As   OleDbCommandBuilder   =new   OleDbCommandBuilder(dscA);//加入这一行即可Top

11 楼Sharnhost(荷兰风车车)回复于 2004-12-04 20:31:46 得分 0

我去查查OleDbCommandBuilder的用法   谢谢楼上各位Top

12 楼Sharnhost(荷兰风车车)回复于 2004-12-04 21:03:27 得分 0

但为什么移用SELECTCOMMAND   就出现:Compiler   Error   Message:   BC30188:   Declaration   expected.  
  Top

13 楼Sharnhost(荷兰风车车)回复于 2004-12-04 21:10:35 得分 0

光加Dim   db   As   OleDbCommandBuilder   =new   OleDbCommandBuilder(dscA)  
  出现Exception   Details:   System.Data.OleDb.OleDbException:   至少一个参数没有被指定值。  
   
  又是什么原因?  
   
  这问题我搞了3天了   胸闷死了Top

14 楼lijie7552()回复于 2004-12-04 21:17:17 得分 0

study!Top

15 楼lohoo(水喻舟)回复于 2004-12-04 21:36:42 得分 0

你dataset中表的数据与你的更新语句中的参数,不相符.  
  请使用.net自动生成的sqlDataAdapter,试试,如果成功,看看你自己的更新语句与.net生成的有什么区别,就明白了.Top

16 楼Sharnhost(荷兰风车车)回复于 2004-12-04 21:49:13 得分 0

继续胸闷Top

17 楼Sharnhost(荷兰风车车)回复于 2004-12-05 01:26:40 得分 0

从新写了段简单的   问题依然是:至少一个参数没有被指定值。   胸闷   求助高手。  
  代码如下:  
  //////////////////////////////////////////////////////////////////////  
  <%@   Page   Language="VB"   Debug="true"   %>  
  <%@Import   Namespace=System.Data.OleDb%>  
  <%@Import   Namespace=System.Data%>  
   
  <html>  
   
  <ASP:DataGrid   Id="dgA"   Runat="Server"/>  
  <form   runat="server">  
  <ASP:Button   Id="Button1"   Text="请按我"   Runat="Server"   OnClick="Button1_Click"/>  
  </form>  
   
  <Script   Language="VB"   Runat="Server">  
  Dim   Provider   =   "Provider=Microsoft.Jet.OLEDB.4.0"  
  Dim   DataBase   =   "Data   Source="   &   Server.MapPath(   "dtbase/db1.mdb"   )  
           
  Dim   Conn   As   OleDbConnection   =   New   OleDbConnection(   Provider   &   ";"   &   DataBase   )  
          Dim   SQL   As   String   =   "Select   *   From   Members"  
   
  Dim   dscA   As   OleDbDataAdapter   =   New   OleDbDataAdapter(SQL,   Conn)  
          Dim   cb   As   New   OleDbCommandBuilder(dscA)  
   
          Dim   dsDataSet   As   DataSet   =   New   dataset()  
   
  Sub   Page_Load(Sender   As   Object,   e   As   EventArgs)  
  If   Page.IsPostBack=False   Then  
                BindGrid()  
          End   If  
  End   Sub  
   
  Sub   BindGrid()  
          dscA.Fill(dsDataSet,"Members")  
          dgA.DataSource=dsDataSet.Tables("Members").DefaultView  
          Page.DataBind()  
  End   Sub  
   
  Sub   Button1_Click(Sender   As   Object,   e   As   EventArgs)  
  dscA.Fill(dsDataSet,"Members")  
  dsDataSet.Tables("Members").Rows(1)("UserTel")="1234567"  
          dscA.Update(dsDataSet,   "Members")  
  End   Sub  
  </Script>  
   
  </html>Top

18 楼xuandme000(水丝游云)回复于 2004-12-05 09:41:39 得分 0

在更新前设置  
  dscA.UpdateCommand=cb.GetUpdateCommand()  
  而且必须你更新的表格有主键Top

19 楼yanransoft()回复于 2004-12-05 09:57:42 得分 0

你更新的表格必须有主键Top

20 楼Sharnhost(荷兰风车车)回复于 2004-12-05 12:11:27 得分 0

加了dscA.UpdateCommand=cb.GetUpdateCommand()  
  后问题依旧是:至少一个参数没有被指定值。  
  我改成的是:  
   
  Sub   Button1_Click(Sender   As   Object,   e   As   EventArgs)  
  dscA.Fill(dsDataSet,"Members")  
  dscA.UpdateCommand=cb.GetUpdateCommand()  
  dsDataSet.Tables("Members").Rows(1)("UserTel")="1234567"  
                    dscA.Update(dsDataSet,   "Members")  
  End   Sub  
   
  我得表格一开始就有主键USERIDTop

21 楼xuandme000(水丝游云)回复于 2004-12-05 12:23:23 得分 0

是     dscA.Update(dsDataSet,   "Members")     这一行有错还是其他的行Top

22 楼Sharnhost(荷兰风车车)回复于 2004-12-05 13:02:51 得分 0

问题依旧   胸闷啊Top

23 楼airflight1981(借王神)回复于 2004-12-05 15:53:18 得分 0

数据库一定要设主键,再加上commandbuilder   语句即可:dim   commandbuilder   as   new   commandbuilider(your   dataadapter),详情可查阅msdn.Top

24 楼Sharnhost(荷兰风车车)回复于 2004-12-05 16:02:42 得分 0

这些问题   我都注意嘞阿   谁有msn留一个   万分感谢  
  或者帖一个成功运行例子的完整代码   MSND都是片段Top

25 楼Sharnhost(荷兰风车车)回复于 2004-12-05 16:23:22 得分 0

仅限于无关表  
  自动命令生成逻辑为独立表生成   INSERT、UPDATE   或   DELETE   语句,而不考虑与数据源中其他表的任何关系。因此,当调用   Update   来为参与数据库中外键约束的列提交更改时,可能会遇到失败。若要避免这一异常,请不要使用   CommandBuilder   来更新参与外键约束的列,而应显式地指定用于执行该操作的语句。  
   
   
  是不是我的表不能跟别的表有主从关系。Top

26 楼Sharnhost(荷兰风车车)回复于 2004-12-05 16:25:18 得分 0

但如果   我的数据库中有好几张表   就不能用COMMANDBUILDER了????  
  就一定要用UPDATECOMMAND   来写SQL语句了?Top

27 楼wycaicai(wycaicai)回复于 2004-12-05 19:18:58 得分 0

upTop

相关问题

  • 谁来解答
  • 急需解答
  • 解答纠错!
  • 请masterz解答
  • 寻求解答
  • 急盼解答
  • 极盼解答~~~~
  • 请解答
  • 急求解答!!!!!!!
  • 如何解答???

关键词

  • .net
  • 更新
  • update
  • row
  • line
  • exception

得分解答快速导航

  • 帖主:Sharnhost

相关链接

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

广告也精彩

反馈

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