【发布时间】:2016-09-04 16:24:03
【问题描述】:
前言:我在前端使用 SQL Server 2008 R2 后端和 MS Access 2007
我有一个类模块,它可以从 SQL Server 返回我想要的任何 ADO 记录集。然后我可以将其分配给任何形式的 RecordSource 属性。
问题是,当我尝试编辑字段时,状态栏中会显示“此表单是只读的”。我希望表单是可编辑的。
我有两种形式
- 表单实体
- FormEntities编辑
FormEntitiesEdit 表单不使用类模块。而是所有代码都在表单本身中。
类模块的目的是避免冗余,只是能够使用类模块轻松地从 SQL Server 获取记录集。
首先是我的全局模块
'默认错误信息。 'eh' 代表错误处理程序 公共 eh 作为字符串 '通用的全局变量 公共连接作为 ADODB.Connection 公共 rs 作为 ADODB.Recordset 公共 com 作为 ADODB.Command第二个是类模块(名称是cADO)。 这个类模块使用上面的conn连接对象
选项显式 私有常量 CONST_LockType = 3 私有常量 CONST_CursorType = 1 私有常量 CONST_CursorLocationServer = 3 私有常量 CONST_CursorLocationClient = 2 私有 m_Recordset 作为 ADODB.Recordset '对于公共记录集函数 私有 cSQL$ '****************************************************** ************************ 公共函数 cGetRecordset(ByRef sql) As ADODB.Recordset 设置 m_Recordset = New ADODB.Recordset cSQL = sql cOpenRecordset 设置 cGetRecordset = m_Recordset 结束功能 '****************************************************** ************************ 公共属性集 Recordset(Value As ADODB.Recordset) '为私有变量赋值 If Not Value is nothing 然后设置 m_Recordset = Value 结束属性 '****************************************************** ************************ 公共属性 Get Recordset() As ADODB.Recordset '从私有变量中读取记录集并赋值给新的对象变量 设置记录集 = m_Recordset 结束属性 '********************************** 私人部门 ************* ************************ 私有子 cOpenRecordset() On Error GoTo eh '确保如果一个记录集是从以前打开的,它会在打开一个新的之前关闭 If m_Recordset.State adStateClosed Then m_Recordset.Close 设置 m_Recordset.ActiveConnection = conn 使用 m_Recordset .LockType = CONST_LockType .CursorType = CONST_CursorType .CursorLocation = CONST_CursorLocationClient .Source = cSQL .Open .Source 结束于 If Not m_Recordset.EOF Then m_Recordset.MoveFirst 退出子 嗯: eh = "Error # " & Str(Err.Number) & " 由 " & _ 生成 Err.Source & Chr(13) & Err.Description MsgBox eh, vbCritical, "打开记录集系统" 结束子 '****************************************************** ************************ 私有子 cCloseRecordset() m_Recordset.Close 设置 m_Recordset = 无 结束子 '****************************************************** ************************ 私有子类_Terminate() If Not (m_Recordset Is Nothing) Then Set m_Recordset = Nothing 结束子第三个是我的 FormEntities 表单背后的代码(使用 cADO 类模块)
选项显式 Dim db As cADO '****************************************************** ************************ 私有子表单_Current() 加载选项卡 结束子 '****************************************************** ************************ 私有子 Form_Load() 设置 db = 新 cADO FetchRecordSource 结束子 '****************************************************** ************************ 私有子 FetchRecordSource() db.cGetRecordset ("SELECT * FROM dbo.Entities") 设置 Forms("fEntities").Recordset = db.Recordset 结束子第四个也是最后一个是FormEntitiesEdit表单背后的代码(这个表单不使用类模块,我可以编辑它)
选项比较数据库 选项显式 Dim rsEntity 作为新的 ADODB.Recordset '****************************************************** ************************ 私有子 Form_Load() FetchRecordSource 结束子 '****************************************************** ************************ 私有子 FetchRecordSource() 设置 rsEntity.ActiveConnection = conn '设置主窗体的记录源 使用 rsEntity .LockType = adLockOptimistic .CursorType = adOpenKeyset .CursorLocation = adUseClient .Source = "SELECT * FROM dbo.Entities" .Open .Source 结束于 设置 Forms("fEntitiesEdit").Recordset = rsEntity 结束子 '****************************************************** ************************ 私有子 CloseConn() rsEntity.关闭 结束子如果 Access Jet SQL 可以执行 SQL,我会改为将此表单绑定到链接表。但是,我正在使用 Jet SQL 无法执行的分层(递归)查询,因此我必须绕过将表单绑定到链接表的想法。
我将表单上的 .Allow Edits 和 .AllowAdditions 设置为 true。
我还尝试将 ADO 记录集上的 .LockType 更改为
- adOpenKeyset 和
- adOpenDynamic
我的 LockType 是 adLockOptimistic
如您所见,属性设置正确,以便能够编辑我返回的记录集。
我知道这是真的,因为当我使用具有相同属性的 FormEntitiesEdit 表单时,它可以让我编辑该字段。但是当我使用类模块返回时(使用相同的属性)它说它是只读的。
这很重要,因为您可以看到使用类模块要简单得多,只需要它返回一个可编辑的记录集。
有人有想法吗?建议?
【问题讨论】:
标签: class ms-access vba ms-access-2007 ado