【问题标题】:Problem updating record in Access 2007 database from Excel Worksheet从 Excel 工作表更新 Access 2007 数据库中的记录时出现问题
【发布时间】:2011-05-06 00:32:02
【问题描述】:

我的 excel 工作簿中有一个宏,用于更新访问数据库中与电子表格相关的特定记录。

如果访问数据库关闭,一切正常。如果数据库打开并且用户正在编辑与 Excel 电子表格相关的特定记录,则会出现问题。` 我收到以下错误消息:

Error Number 2147467259: 
The database has been paced in a state by user 'ADMIN' on
'LAPTOP' that prevents it from being opened or locked.

我已将数据库表单的记录锁定设置为“无记录锁定”,但这没有帮助。

非常感谢任何建议或帮助。

干杯 诺埃尔

Public Sub updateAccessRecord()
On Error GoTo ProcError
Dim subFuncName As String
subFuncName = "updateAccessRecord"

Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rst As ADODB.Recordset

Dim dbName As String
Dim dbPath As String
Dim strCon As String
Dim recID As Long
Dim fieldVal As Double
Dim strSQL As String

fieldVal = Worksheets("House Claim").Cells(593, 10).Value
dbName = "claim-db.mdb"
dbPath = ThisWorkbook.Path & "\..\..\..\..\"
dbPath = dbPath & "\" & dbName

strSQL = "UPDATE tblInsClaimDet SET propSet=" & fieldVal & " WHERE ID=" & recID & ""

   Set conn = New ADODB.Connection
   With conn
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
       "Data Source=" & dbPath
       .Open
   End With
   Set cmd = New ADODB.Command
   With cmd
      .ActiveConnection = conn
      .CommandText = strSQL
   End With
   Set rst = cmd.Execute
   Set rst = Nothing
   conn.Close
   Set conn = Nothing

ExitProc:

   Exit Sub

ProcError:

   MsgBox "Error " & Err.Number & ": " & Err.Description, _
         vbCritical, "Error in procedure in " & subFuncName
   Resume ExitProc
End Sub 

【问题讨论】:

  • 您在尝试此操作之前是否保存了所有代码和查询?这是将 ADO 与未保存的结构数据(表单、查询、代码等)一起使用时生成的标准错误。
  • @Remou 是的,我已经保存了所有表单代码等......我认为当用户在表单上输入数据并保存记录时会出现问题(比如使用'ctrl + S')并保持记录公开。如果用户避免这样做,似乎没有问题。
  • Ctrl-S 不保存记录——它保存了表格,这将导致@Remou 建议的问题。唯一的例外是,如果您使用自定义操作覆盖了 Ctrl-S 的默认定义。
  • @David Yep 这似乎是问题所在。拆分数据库解决问题

标签: excel ms-access-2007 excel-2007 vba


【解决方案1】:

看来你还没有把数据库拆分成前端和后端。如果你这样做,问题就会消失。 Ctrl+S不是保存记录,也就是Shift+Enter,是保存数据库对象,所以看起来有把数据库扔到设计或开发状态的效果。

【讨论】:

  • 我还没有拆分数据库,刚刚拆分,问题就解决了。不错的一个雷穆
  • @glinch 只是好奇,为什么这不再是您接受的答案?您可能会注意到,大卫在我回答后几个小时才发帖。
  • 对不起,代表我的错误,这仍然是我接受的答案。
【解决方案2】:

在宏观方面;您是否尝试过以只读方式打开连接?即使您的 Access 用户没有锁定记录,他在记录上也有一个“读锁”,从而防止了 excel 的排他锁。我在想,如果两个用户都只尝试读访问,你应该没问题;但如果其中任何一个正在读/写,那么它就会失败。

在您的访问表单上,您还应该有:

Me.AllowAdditions = True

Me.AllowDeletions = 假

Me.AllowEdits = False

【讨论】:

  • @RichO 为回复干杯。我希望两者都能读/写。 Access 这样做没有问题,只有当电子表格尝试写入打开的记录时才会出现问题。你是说不可能同时实现Access和Excel写入同一条记录?
  • 我明白了……这是个好问题;我的直觉告诉我,您不能这样做,因为您依赖两个独立的数据库引擎(内部访问引擎和 ADO 驱动程序)在记录锁定级别上进行合作。您是否考虑过使用访问中的 ole 自动化来代替?至少这会让所有东西都在同一个数据库引擎下运行......并不是你想听到这个,但这听起来像是一个数据库后端的工作,比如 sql server..
  • 最后一个想法...除了将 rst 设置为空之外,您是否尝试过将 ActiveConnection 设置为空?
  • @RichO 嗯,这听起来比我想象的要困难得多。我不太明白您的 OLE 自动化评论。我在从 Access 写入 Excel 时使用它。我遇到的问题是从 Excel 到 Access 的通信(如果我弄错了,请道歉)。关于 ActiveConnection 'Set conn = Nothing' 据我所知,将其设置为无。
  • 呃,如果您使用的是 ADO 接口,那么您仍在使用 Jet/ACE 与数据存储进行交互。这只是一个不同的界面,但 Jet/ACE 引擎正在完成所有工作。碰巧有两个实例可以工作(一个在 Access 中,一个在 Excel 中),但这只是一个多用户场景,所以那里没有问题。也就是与ADO的使用无关。
【解决方案3】:

问题可能不在您的代码中。错误:

数据库已经处于一个状态

表示数据库已经以独占模式打开。你应该检查你是如何打开数据库的。

【讨论】:

  • 我不太确定这是不是问题所在。我没有以独占模式打开数据库。当数据库打开时,您可以通过 Excel 文件对其进行写入。尝试使用数据库表单和 excel 电子表格写入同一记录时会出现问题。
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2011-04-21
  • 2011-04-20
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多