数据库数据保存问题?请高手指点

vbvc 2003-04-07 09:22:39
我的数据是从数据库读取出来的,填充到datagrid中(不是捆绑,因为表的格式不一样),数据修改后,我想把修改结果保存回数据库中去,但现在有个问题,我不知道那些行(记录)已经存在,那些是新增行,还有那些行要被删除(因为数据清空了),如何能够实现批量更新?
请高手指点,最好能有一些示例源代码!
...全文
78 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
szch 2003-04-14
  • 打赏
  • 举报
回复
给个思路,试试
因为你没有绑定
在对DataGrid操作时,对修改/删除的记录号分别保存到一个数组中,
手动判断提交修改记录。
keeven 2003-04-13
  • 打赏
  • 举报
回复
估计你没有理解好我的意思,给你个函数看看吧!!希望能帮助你一下。
Public Overloads Function Update_Out(ByVal str As String, ByVal updatedset As DataSet, ByVal Table_name As String) As String
'返回值是错误说明
'updatedset 为修改后的dataset
Dim i, j As Integer
Dim dcon As OleDbConnection
Dim dada As New OleDbDataAdapter()
Dim ObjTrans As OleDbTransaction
Dim dset As New DataSet()
Dim NewRow As DataRow
Try
dcon = New OleDbConnection(OleConnectionStr)

'dada = New OleDbDataAdapter(str, dcon)
dada.SelectCommand = New OleDbCommand(str, dcon)

dada.Fill(dset, Table_name) 'dset为原来的数据
'dada.Fill(dset) 'dset为原来的数据
Dim dcb As New OleDbCommandBuilder(dada)

'dada.InsertCommand = dcb.GetInsertCommand
'dada.DeleteCommand = dcb.GetDeleteCommand
'dada.UpdateCommand = dcb.GetUpdateCommand
dcon.Open()
'ObjTrans = dcon.BeginTransaction()
'dada.InsertCommand.Transaction = ObjTrans
'dada.DeleteCommand.Transaction = ObjTrans
'dada.UpdateCommand.Transaction = ObjTrans

'dset = updatedset '请注意这一行,updatedset是经过修改后的数据,取代本来的dset
'If updatedset.HasChanges = True Then
For i = 0 To dset.Tables(Table_name).Rows.Count - 1
dset.Tables(Table_name).Rows(i).Delete()
Next
For i = 0 To updatedset.Tables(Table_name).Rows.Count - 1
If updatedset.Tables(Table_name).Rows(i).RowState <> DataRowState.Deleted Then
NewRow = dset.Tables(Table_name).NewRow
For j = 0 To updatedset.Tables(Table_name).Columns.Count - 1
NewRow.Item(j) = updatedset.Tables(Table_name).Rows(i).Item(j)
'dset.Tables(Table_name).Rows(i).Item(j) = updatedset.Tables(Table_name).Rows(i).Item(j)
Next
dset.Tables(Table_name).Rows.Add(NewRow)
End If
Next
dada.Update(dset, Table_name)
'ObjTrans.Commit()
'End If
dada.Dispose()
dcb.Dispose()
dcon.Close()
Return ""
Catch ex As Exception
'ObjTrans.Rollback()
dada.Dispose()
dcon.Close()

Return Err.Description
End Try
End Function
vbvc 2003-04-13
  • 打赏
  • 举报
回复
先谢谢各位

欢迎高手继续讨论,共同进步
zsms2 2003-04-11
  • 打赏
  • 举报
回复
不能直接用UPDATE方法的话,我也不知道要怎么做了,呵呵
gz
zsms2 2003-04-11
  • 打赏
  • 举报
回复
OleDbConnection1.Open()
Dim UpdatedRows As System.Data.DataSet
Dim InsertedRows As System.Data.DataSet
Dim DeletedRows As System.Data.DataSet ‘定义三个数据集存数据的状态


UpdatedRows = ds.GetChanges(System.Data.DataRowState.Modified)
InsertedRows = ds.GetChanges(System.Data.DataRowState.Added)
DeletedRows = ds.GetChanges(System.Data.DataRowState.Deleted)’状态的付值

Try
OleDbDataAdapter1.Update(UpdatedRows, "tblbooks")
OleDbDataAdapter1.Update(InsertedRows, "tblbooks")
OleDbDataAdapter1.Update(DeletedRows, "tblbooks") ‘用UPDATE方法进行提交数据(分状态提交)
Catch updateException As System.Exception
MsgBox("Caught exception: " & updateException.Message)
End Try

OleDbConnection1.Close()

前面有人也问过这样的问题,我也是参考别人的,刚学会用,这段代码我已经在我自己的程序里调试过,可以运行了,还有别的方法也可以进行数据的批提交,这只是一个,你可以搜索一下前人的文章,大家一起学习进步!
vbvc 2003-04-11
  • 打赏
  • 举报
回复
怎么没有人回答?

帮忙啊
keeven 2003-04-11
  • 打赏
  • 举报
回复
最好是先用查询语句将数据库中的对应数据删除,然后 dataset中的数据状态变成新增加。再
update.其他的方法我看都不行,你说呢!!
vbvc 2003-04-08
  • 打赏
  • 举报
回复
数据库中“test” 表的结构是这样的
id(string) dt(date) total(single)
三个字段,其中编号id和日期dt是主键,total为应用需要的实际数据。dt的格式如2003-4-8,

现在我把数据某年的数据资料( total的值)放到格式如下的DATAGRID中,提供修改和添加:
日|一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月 |
1 |----|----|----|----|----|----|----|----|----|----|------|-------|
2 |----|----|----|----|----|----|----|----|----|----|------|-------|
3 |----|----|----|----|----|----|----|----|----|----|------|-------|
4 |----|----|----|----|----|----|----|----|----|----|------|-------|
5 |----|----|----|----|----|----|----|----|----|----|------|-------|
......................................
因为表的格式不一样,所以不能用捆绑的方法将数据绑定到DATAGRID,也不能直接使用DataAdapter.Update的方法.现在我遇到的问题是,如何将DATAGRID中有数据保存回数据库,要求是:DATAGRID单元格中有数据的才保存,如果单元格为空,则不保存或者把已存在的行删除掉.
vbvc 2003-04-08
  • 打赏
  • 举报
回复
-> zsms2(从头开始)

能不能给我解释一下啊
xumahua 2003-04-08
  • 打赏
  • 举报
回复
不是很明白你的意思,一般来说,数据集的改动调用适配器的update方法就可以实现批量更新,并不需要你去知道哪些是新增的,拿些是删除的。你所说的(因为数据清空了)是什么意思?若要求特殊的话,还是建议用存储过程吧。
vbvc 2003-04-08
  • 打赏
  • 举报
回复
高手出来帮忙啊
zsms2 2003-04-08
  • 打赏
  • 举报
回复
OleDbConnection1.Open()
Dim UpdatedRows As System.Data.DataSet
Dim InsertedRows As System.Data.DataSet
Dim DeletedRows As System.Data.DataSet


UpdatedRows = ds.GetChanges(System.Data.DataRowState.Modified)
InsertedRows = ds.GetChanges(System.Data.DataRowState.Added)
DeletedRows = ds.GetChanges(System.Data.DataRowState.Deleted)

Try
OleDbDataAdapter1.Update(UpdatedRows, "tblbooks")
OleDbDataAdapter1.Update(InsertedRows, "tblbooks")
OleDbDataAdapter1.Update(DeletedRows, "tblbooks")
Catch updateException As System.Exception
MsgBox("Caught exception: " & updateException.Message)
End Try

OleDbConnection1.Close()
vbvc 2003-04-07
  • 打赏
  • 举报
回复
补充一下,我使用的数据库是SQL SERVER2000

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧