关于DataAdapter的UPDATE问题 求高手解答!
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




