[Ado.net ]使用DBCommand来批量更新数据-困惑

livingliving 2009-05-21 12:34:06
使用 DBCommand 来更新数据是理想的选择,我已经做到:
自动生成 InSertCommand ,UpdateCommand,DelCommand 并给他们赋值更新。
''' 保存一行数据该数据可能会被删除
Public Function Save(ByVal pDataRow As TDataRow) As String
Dim AffectRowCount As Integer
If pDataRow.State = E_DBStor_State.isadd Then
SetCommandValue(InSertCommand, pDataRow)
AffectRowCount = InSertCommand.ExecuteNonQuery()
ElseIf pDataRow.State = E_DBStor_State.IsUpdate Then
SetCommandValue(UpdateCommand, pDataRow)
AffectRowCount = UpdateCommand.ExecuteNonQuery()
ElseIf pDataRow.State = E_DBStor_State.IsDel Then
SetKeyValue(DelCommand, pDataRow)
AffectRowCount = DelCommand.ExecuteNonQuery()
End If
Return AffectRowCount
End Function
现在就是批量更新的问题,比较困惑 ,我的程序返回的是个修改过的信息,
比如 DataRow中有 A1 B1 C1 列
如果 A1和B1 被修改 返回的是 DataRow 状态是修改 子集中只有 A1和B1 没有未被改动的 C1

那么现在要更新数据,动态的 UpdateCommand 是否要加入参数 C1 ?

在批量的修改情况下,有两办法可以做到更新,就是不知道那个好,

循环修改列表。 每一条记录重新生成一个 UpdateCommand 再保存

循环修改列表。 缓冲一个全局的UpdateCommand,通过清除,改动参数 再保存


---??请指教




...全文
372 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rmini 2011-08-31
  • 打赏
  • 举报
回复
收藏学习资料
livingliving 2009-06-02
  • 打赏
  • 举报
回复
我觉得大家用自带的东西习惯了, 没有去尝试自己写这块功能,不是一件好事情。
---代码我已经写了是关于,自动产生Dbcommand 和批量更新的。大家看看吧,

''' <summary>
''' 保存一行数据该数据可能会被删除
''' </summary>
''' <param name="pDataRowNode"></param>
''' <returns></returns>
''' <remarks></remarks>
''' 其中 ConfigNode 是一个类结构,你可以自己搭建(就是自己写了)
Public Function Save(ByVal pDataRowNode As ConfigNode) As String
Dim AffectRowCount As Integer
Dim MyEditFields As List(Of TField)
Dim MyCommand As DbCommand
If pDataRowNode.Tag = E_DBStor_State.isadd Then
MyCommand = GetInsertCommand(DBFactory, TableScheme, pDataRowNode.Nodes, MyEditFields)
SetCommandValue(MyCommand, MyEditFields, pDataRowNode.Nodes)
AffectRowCount = MyCommand.ExecuteNonQuery() ' DBFactory.
ElseIf pDataRowNode.Tag = E_DBStor_State.IsUpdate Then
Dim Keyfield As TField = DBFactory.Tables.FindkeyField(MainTableName)
Dim MyKeyValue As New ConfigNode
MyKeyValue.Keystr = Keyfield.FieldName
MyKeyValue.Value = pDataRowNode.Keystr
pDataRowNode.Nodes.Add(MyKeyValue)
MyCommand = GetUpdateCommand(DBFactory, TableScheme, pDataRowNode.Nodes, MyEditFields)
SetCommandValue(MyCommand, MyEditFields, pDataRowNode.Nodes)
AffectRowCount = MyCommand.ExecuteNonQuery() ' DBFactory.
ElseIf pDataRowNode.Tag = E_DBStor_State.IsDel Then
SetKeyValue(DelCommand, pDataRowNode.Keystr)
AffectRowCount = DelCommand.ExecuteNonQuery()
End If
Return AffectRowCount
End Function


Public Function GetUpdateCommand(ByVal pDBFactory As TDBFactory, ByVal pFields As TTable, ByVal pNodes As List(Of ConfigNode), Optional ByRef pEditTFieldS As List(Of TField) = Nothing) As DbCommand
Dim TmpField As TField
Dim MyTable As New TTable(pFields.Tablename, pFields.TableViewname, TDBShareModule.E_DBTableType.isSQLselect, TDBShareModule.E_DBStor_State.isNone)’这里是获得该表的所有字段属性主要有 名字 类型就好
For Each MyItem In pNodes
TmpField = pFields.TFields_.FindFieldBy(MyItem.Keystr) '
MyTable.TFields_.Add(TmpField)
Next
pEditTFieldS = MyTable.TFields_.List_‘将要修改的字段收集起来
Return MyTable.GetUpdateCommand(pDBFactory, pFields.Tablename)’根据该字段生成Command
End Function

主要的过程是:收集被修改的字段信息,建立DBCommand获得,根据字段信息产生SQL和 Cammand的参数,
再将参数和值赋给DBCommand,执行Command。
livingliving 2009-05-22
  • 打赏
  • 举报
回复
如果要处理 string(1,n) 这样的数组更新,采用什么方式比较好?
livingliving 2009-05-22
  • 打赏
  • 举报
回复
是的批量更新是在 DataAdapter 上,那么 Adapter.Update(参数),
这个“参数”是否支持自定义的集合(list(of XXX))呢?
比如简单的 string(1,n)数组,或List
Dobzhansky 2009-05-21
  • 打赏
  • 举报
回复
command 设计成参数绑定模式的

DataSet 搭配 adapter 可以批量更新的
xgchou 2009-05-21
  • 打赏
  • 举报
回复
DATAADAPTE的批量更新是指将所有标记为INSERT,DELETE,UPDATE的数据行按特定的顺序依次对原始数据进行修改.而不用人工去写判断代码及遍历记录.
Dobzhansky 2009-05-21
  • 打赏
  • 举报
回复
事实上, 批量更新并不在 DataSet 上, 是各个 provider 的 DataAdapter 具有这个能力.

批量更新的好处是减少了 业务层跟 数据层之间的交互次数, 尤其是 业务层跟数据层在 appdomain 层面上是分离的情况下.

具体到 DataAdapter 跟数据库服务器之间是如何进行批量更新的,
那要看数据库是否支持, 以及 provider 是如何编写的了.

sql server 不清楚, oracle 服务器是支持批量更新的.
注意这里的批量更新是指当更新多条记录时, 客户端程序跟数据库服务器交互 1 次.
livingliving 2009-05-21
  • 打赏
  • 举报
回复
晕哦,,
首先大家的知道,DataSet是一个对象。他未必存在客户端,
我们可以自己写一个 dataSet 就叫做 TDataSet 吧,他可以存在客户端与服务端。
---在控制上非常有优势,当然微软的dataset 支持批量更新,
Tdataset 也要让他支持才好。所以自己写批量更新,
现在使用的是每条记录读重新建立一个 DbCommand ,速度还可以,
----有人分析一下 dataSet 批量更新的原理吗》?
sytsyt0329 2009-05-21
  • 打赏
  • 举报
回复
学习。
zzWind 2009-05-21
  • 打赏
  • 举报
回复
1、使用adapter让它自己去批量处理
2、还是根据行状态处理的。
livingliving 2009-05-21
  • 打赏
  • 举报
回复
有没有好的意见。我就是想知道 adapter 的批量更新是怎么做到的,
我们自己处理 批量更新

16,554

社区成员

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

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