gpt4 book ai didi

class - 使用类模块将可编辑的ADO记录集返回到MS Access Form

转载 作者:行者123 更新时间:2023-12-01 13:44:18 26 4
gpt4 key购买 nike

前言:我在前端使用SQL Server 2008 R2后端和MS Access 2007

我有一个类模块,可以从SQL Server返回我想要的任何ADO记录集。然后,我可以将其分配给任何形式的RecordSource属性。

问题是,当我尝试编辑字段时,在状态栏中显示“此表单为只读” 。我希望表格是可编辑的。

我有两种形式

  • FormEntities
  • FormEntities编辑

  • FormEntitiesEdit窗体不使用类模块。而是所有代码都在表单本身中。

    类模块的目的是避免冗余,并且只能使用类模块轻松地从SQL Server获取记录集。

    首先是我的全球模块

    '默认错误消息。 “eh”代表错误处理程序
    公共eh作为字符串

    '通用变量
    公共con as ADODB.Connection
    作为ADODB.Recordset的Public rs
    作为ADODB.Command的公共com

    第二个是类模块(名称为 cADO )。
    该类模块使用 conn 上面的连接对象

    显式期权

    私有const CONST_LockType = 3
    私有常量CONST_CursorType = 1
    私有const CONST_CursorLocationServer = 3
    私有const CONST_CursorLocationClient = 2

    私有m_Recordset作为ADODB.Recordset
    '用于公共记录集功能
    专用cSQL $
    '***************************************************** *********************
    公共函数cGetRecordset(ByRef sql)作为ADODB.Recordset

    设置m_Recordset =新的ADODB.Recordset

    cSQL = SQL
    cOpenRecordset

    设置cGetRecordset = m_Recordset

    结束功能
    '***************************************************** *********************
    公共属性集Recordset(值为ADODB.Recordset)
    '为私有变量分配属性
    如果“无值无”,则设置m_Recordset =值

    最终财产
    '***************************************************** *********************
    公共属性Get Recordset()as ADODB.Recordset
    '从私有变量中读取记录集,并分配给新的对象变量
    设置记录集= m_Recordset

    最终财产

    '**************************************私人部分************* *********************

    私人Sub cOpenRecordset()

    出错时转到eh

    '确保从先前打开的记录集在打开新记录集之前先关闭
    如果m_Recordset.State adStateClosed,则m_Recordset.Close

    设置m_Recordset.ActiveConnection = conn

    使用m_Recordset
    .LockType = CONST_LockType
    .CursorType = CONST_CursorType
    .CursorLocation = CONST_CursorLocationClient
    源= cSQL
    .Open .Source
    结束于

    如果不是m_Recordset.EOF,则m_Recordset.MoveFirst

    退出子
    eh:
    eh =“错误#”&Str(Err.Number)&“由”&_生成
    错误来源和Chr(13)和错误描述
    MsgBox eh,vbCritical,“打开记录集系统”
    结束子
    '***************************************************** *********************
    私人Sub cCloseRecordset()
    m_Recordset.Close
    设置m_Recordset = Nothing
    结束子
    '***************************************************** *********************
    私人子Class_Terminate()

    如果不是(m_Recordset为空),则设置m_Recordset =为空

    结束子

    这是我的 FormEntities FORM后面的代码(使用THE cADO CLASS MODULE)

    显式期权

    Dim db as cADO
    '***************************************************** *********************
    私人子Form_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.Close
    结束子

    如果Access Jet SQL可以执行SQL,我将将此表单绑定到链接表。但是,我使用的是Jet SQL无法执行的分层(递归)查询,因此我不得不绕过将表格绑定到链接表的想法。

    我将.Allow Edits和.AllowAdditions设置为true。

    我还尝试将ADO Recordset上的.LockType更改为
  • adOpenKeyset和
  • adOpenDynamic

  • 我的LockType是adLockOptimistic

    如您所见,属性设置正确,可以编辑返回的记录集。

    我知道这是真的,因为当我使用具有相同属性的 FormEntitiesEdit 表单时,就可以编辑该字段。但是,当我使用类模块返回(使用相同的属性)时,它说它是只读的。

    这很重要,因为如您所见,使用类模块要简单得多,只需要它返回可编辑的记录集即可。

    有人有主意吗?建议?

    最佳答案

    问题在类的cOpenRecordset()方法中:

    .CursorLocation = CONST_CursorLocationClient

    在这里分配常量值...

    Private Const CONST_CursorLocationServer = 3
    Private Const CONST_CursorLocationClient = 2

    不幸的是,您交换了这两个值。这是 ADODB.CursorLocationEnum常量...

    adUseClient = 3
    adUseServer = 2

    所以您的班级正在有效地做到这一点...

    .CursorLocation = adUseServer

    但是,如果您希望记录集可编辑,则需要一个客户端游标。我认为,如果您只是重新定义常量,则您的类方法可能会起作用,否则您将暴露出另一个问题……

    Private Const CONST_CursorLocationClient = 3

    FormEntitiesEdit是可编辑的,因为您在那里使用了正确的常量...

    .CursorLocation = adUseClient

    关于class - 使用类模块将可编辑的ADO记录集返回到MS Access Form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37125850/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com