用DataAdapter.Update(Dataset),数据源总是不变??
用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到数据库




