【问题标题】:Update ADO Recordset for a Calculated Field更新计算字段的 ADO 记录集
【发布时间】:2012-04-23 19:40:20
【问题描述】:

我在 VB6 中针对 SQLServer 后端对 ADO 记录集使用以下 sql:

select c.name, taxid=
   case when exists(select 1 from sometable where fld='abc') 
   then c.SSN else null end

当我尝试在本地更新记录集中的一行中的taxid 字段时,ADO 抱怨错误“多步操作生成错误。检查每个状态值。”我认为taxid字段来自计算字段而不是原始表列的事实困扰了它。出于我的目的,我永远不会将这些更改持久化回数据库,因此我正在寻找一种方法来告诉 ADO 无意持久化更改,以便允许我在本地更改数据。

【问题讨论】:

  • 我预计会出现错误,因为出租车不是真正的专栏。当输出为taxid = c.name + c.SSN 时出现同样的错误。就个人而言,我不会使用 VB6 中的记录集将更新持久化回数据库,而是使用存储过程并将参数化调用发送到该存储过程。当然,该过程需要编写为只允许可更新列的输入。不知道有没有办法让 ADO 遵守底层定义。
  • thx @Aaron 但我不会将更新持久化回数据库。我只是想根据本地需要更改记录集中的值。有没有办法配置记录集,这样 ADO 就不会“担心”永远不会发生的持久性问题?
  • 您是否尝试过断开记录集?设置 rst.ActiveConnection = Nothing。

标签: sql-server vb6 ado recordset


【解决方案1】:

我认为@HK1 的建议是一个很好的建议,但我不确定您更改记录集中任何值的能力会发生什么变化,无论您尝试更新的列是否已计算。很久没有玩经典的 ADO 了,但如果记录集断开连接,它可能会在那时变为只读。

但是,如果您对使用记录集执行更新不感兴趣,并且需要在本地更改值,也许您应该考虑先将结果存储在本地数组中?这样,您可以最小化记录集的锁定和游标选项,例如,立即关闭记录集并释放这些资源。

rs.Open cmd, conn, adOpenForwardOnly, adLockReadOnly

Dim MyArray
MyArray = rs.GetRows()

rs.Close: set rs = nothing

现在您可以随意操作MyArray...

【讨论】:

  • 这被错误地否决了,然后我接到了一个电话。现在,在您进行编辑之前,我不会让我撤消它。
  • 糟糕,完成。我需要在冲浪时放下该死的电话!
  • 我只是在开玩笑。 :-) 无论如何,今天已经达到了我的上限。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2010-09-14
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多