【问题标题】:Learning MS Access学习 MS 访问
【发布时间】:2009-08-28 12:45:09
【问题描述】:

我是 ms-access 的新手,我已经开始研究有效的代码。不幸的是,它完全没有注释。

    Private Sub OKbut_Click()
Dim dt As Date
dt = Now()
Set rstOrder = New ADODB.Recordset
rstOrder.Open "tblUsers", CurrentProject.Connection, adOpenStatic, adLockOptimistic
If rstOrder.Supports(adAddNew) Then
    With rstOrder
        .AddNew
        .Fields("title") = title
        .Fields("first") = first
        .Fields("last") = last
        .Fields("gender") = gender
        .Fields("date_submitted") = dt
        .Update
    End With
End If
rstOrder.Close
Set rstOrder = Nothing
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT id FROM tblUsers WHERE date_submitted=#" & dt & "#")
duser = rs.Fields("id")
rs.Close
Set rs = Nothing
    Do While Not user_defined(duser)
        DoCmd.OpenForm "define_user_frm", , , , , acDialog
    Loop
'Forms(0).user_lst.RowSource = "select * from users where id=" & duser
Me.SetFocus
DoCmd.Close
End Sub
  1. Now() 函数有什么作用?
  2. ADODB.Recordset 只是一种连接表的方法?
  3. adOpenStatic、adLockOptimistic 这些是什么?
  4. 我们为什么要检查这个:如果 rstOrder.Supports(adAddNew) ?
  5. 为什么我们需要这样做:设置 rstOrder = Nothing?
  6. 这是做什么的:?不做用户定义(duser) DoCmd.OpenForm "define_user_frm", , , , , acDialog 循环

【问题讨论】:

  • 最好先在 MS Access 上获得一些教程,然后尝试学习代码。[在我看来]
  • 取决于您从哪里开始 - 教程需要相当明确地成为 MS Access VBA。如果您有 VBA/VB.OLD 经验,那么上述问题是明智的。如果您只是在阅读上述内容时遇到困难,那么退后一步,一些基础知识将会有所帮助。
  • 只要阅读 ADO 教程就可以解决 90% 的问题,剩下的 10% 只是 VBA 帮助。
  • 好吧,ADO 教程不会解释为什么在代码的后面会打开一个 DAO 记录集。老实说,这对我来说看起来像是非常糟糕的代码。

标签: ms-access


【解决方案1】:

像这样处理现有代码并不是学习编程的最佳方式。有很多在线教程可以帮助您以线性方式入门和进步。我给出的另一个建议是自己尝试一下。编写一个包含“MsgBox Now()”的小方法并运行它看看会发生什么。然后在几秒钟后运行它。

我不能过度推荐寻找初学者教程。

不过话虽如此。 . .

  1. 现在 - 返回调用时的计算机系统日期和时间
  2. 是的 - 除其他外。
  3. 对查询引擎的提示。 Open Static 表示您不想在检索到记录集后看到添加的行,乐观锁定告诉引擎使用哪个记录锁定选项(另一个是悲观的)
  4. 选中此项是因为您无法将记录添加到所有资源集(例如,连接多个表的复杂查询)
  5. 并非绝对必要,但更好地用于内存管理,否则记录集对象(以及所有相关资源 - 内存、句柄等)在方法结束之前不会被释放。
  6. 打开 ms 访问表单,直到条件“user_defined(duser)”返回 true

希望这会有所帮助。

【讨论】:

    【解决方案2】:
    1. Now() 函数有什么作用?

    Now() 返回当前系统日期和时间

    1. ADODB.Recordset 只是一种连接表的方法?

    是的 - 更重要的是,这是一种单独遍历数据集记录的好方法。就像 SQL Server 中的游标一样。你可以做类似的事情

    While not rstOrder.EOF
    'a.k.a. while there are still records left to iterate through
       'Do something
    End While
    
    1. adOpenStatic、adLockOptimistic 这些是什么?

    来自http://www.dotnetspider.com/forum/16958-In-VB-What-difference-between-adopendynamic.aspx

    adOpenForwardOnly - 如果没有指定其他光标,这是默认光标。此光标仅允许通过记录集向前移动

    adOpenKeyset - 此光标支持向前和向后导航。它还允许您更新记录集,所有更改都将反映在其他用户记录集中。光标还支持书签

    adOpenDynamic - 此光标支持向前和向后导航,但可能不支持书签(即 Access)。对数据所做的任何更改都立即可见,无需重新同步游标与数据库

    adOpenStatic - 此游标使用数据库中数据的静态副本,因此对数据的更改不可见,并支持向前和向后导航

    1. 我们为什么要检查这个:如果 rstOrder.Supports(adAddNew) ?

    这是一种编写更健壮代码的方式——即在尝试添加新记录之前,首先检查记录集是否支持添加新记录。

    1. 为什么我们需要这样做:设置 rstOrder = Nothing?

    从内存中释放记录集。不是绝对必要的,但同样可以生成更健壮的代码。

    1. 这是做什么的:? Do While Not user_defined(duser) DoCmd.OpenForm "define_user_frm", , , , , acDialog Loop

    检查用户是否存在,如果不存在,它会打开一个名为“define_user_frm”的表单,我假设它允许创建新用户。

    【讨论】:

      【解决方案3】:

      Now() 函数有什么作用?

      将光标放在子程序中的单词 Now 上,然后按 F1 键。 Access 的帮助对回答您的问题没有帮助吗?

      我试图建议您使用内置的帮助功能解决此类问题应该更快,而不是发布到 Stack Overflow 并等待回复。然后,您只需发布 Help 无法为您充分回答的问题。

      【讨论】:

      • Now() 是在上面的代码中使用的不正确的函数,在我看来,因为用 Now() 初始化的变量最终用于为名为“date_submitted”的字段赋值",这意味着只有一个日期字段,没有时间部分。仅从代码来看,我认为应该使用 Date() 而不是 Now()。如果不是,则该字段的名称不正确。无论哪种方式,在我看来,它都不像是一个编写良好的应用程序的代码。
      • @David W. Fenton:“一个名为“date_submitted”的字段,这意味着只有一个日期字段,没有时间部分”——我挑战你阅读任何关于时间数据库的书(例如@987654321 @),你很快就会知道你的假设是不正确的。另请注意,Access 数据库引擎只有一种时间数据类型是 DATETIME,它 always 具有时间元素,即使您有验证规则或 CHECK 约束以确保它始终是午夜(并且,让我们面对它,即使是大多数 Access 'power' 用户也会忘记验证规则或 CHECK 约束)。
      【解决方案4】:

      我对 VB/Access 很生疏,但是:

      1) 现在返回当前日期和时间

      2) Recordset 是一组记录——来自内存的不一定是表,也可以是查询。

      3) 这些是指示应该如何访问表(因为在这种情况下是表)的标志不能记住静态但锁表示我们将使用乐观锁定,即我们基本上会假设记录不会被其他人更改。

      4) 因为您可以通过多种不同的方式打开记录集 - 所以很可能您有一组只读数据。在示例的上下文中,它在概念上是多余的,但就良好实践而言,它是一种合理的防御性编程。

      5) 可能不会,但它是明智的防御性编程,它确保与记录集相关的所有资源都被释放。 rstOrder 来自 sub 外部的某个地方,因此不让它处于打开状态是明智的。

      6) 循环重复,直到函数 user_defined(duser) 返回 true。 duser 是 - erk,看起来很可怕 - 查询返回的 ID 但看起来不安全。 DoCmd.Open 表单弹出“define_user_form”作为对话框,所以......如果用户不存在,则启动对话框以定义用户,然后再次检查用户是否已被定义。这也有点问题(当然,如果没有更多的上下文很难说)。

      基本上,Access 中的 VBA 主要是 VB6,但有足够的差异让一个人有点发疯......您可以假设访问中存在一大堆东西,您必须在 VB.OLD 中更加明确地说明

      【讨论】:

        【解决方案5】:
        1. Now() 函数有什么作用?
          • 返回一个 Variant (Date) 根据您计算机的系统日期和时间指定当前日期和时间。
        2. ADODB.Recordset 只是连接表的一种方式?
          • ADO Recordset 对象用于保存数据库表中的一组记录。 Recordset 对象由记录和列(字段)组成。可用于开表、查询、自定义SQL语句等。
        3. adOpenStatic、adLockOptimistic 这些是什么?
          • adOpenStatic:提供记录的静态副本(您看不到其他用户的添加、更改或删除),但启用了所有类型的移动(例如 .moveNext、.MoveFirst、.moveLast 等)。
          • adLockOptimistic:只有在调用 Update 方法时才会执行记录锁定。
        4. 我们为什么要检查这个:如果 rstOrder.Supports(adAddNew) ?
          • 检查记录集是否允许添加新记录。
        5. 为什么我们需要这样做:设置 rstOrder = Nothing?
          • 完全完成 rstOrder 后,将其设置为 Nothing 会将其从内存中删除。您可以将其视为垃圾回收的简单版本。
        6. 这是做什么的:?做而不是 user_defined(duser) DoCmd.OpenForm "define_user_frm", , , , , acDialog 循环
          • 假设 user_defined() 是一个自定义函数,它会遍历刚刚添加的记录并打开一个允许您定义用户的表单。

        参考:

        【讨论】:

        【解决方案6】:
        1. Now() 函数有什么作用? - 为函数正在运行的当前日期和时间创建一个 DateTime。
        2. ADODB.Recordset 只是一种连接表的方法? 这是一个对象,或者说 rstOrder 不是 ABDODM.Recordset,具有打开与 DB 的连接的方法。

        3. 为什么我们需要这样做:设置 rstOrder = Nothing? - 这是清理连接,以便计算机不保留内存并用于 rstOrder。否则,运行计算机后可能会变慢或内存减少。

        4. 这是做什么的:? Do While Not user_defined(duser) DoCmd.OpenForm "define_user_frm", , , , , acDialog Loop - 这是一个循环,只要 user_defined 不是 duser,就会重复并打开 Access 表单。

        【讨论】:

          【解决方案7】:
          1. Now() 只返回当前日期和时间

          2. ADODB.Recordset 在这种情况下被用作连接表的一种方式。它通常用于连接到外部(读取 SQL)数据集。并且可以从查询或存储过程中填充。类似于access内置的Recordset

          3. 这些是用于设置连接中某些选项的开关。我建议阅读 MSDN 文档。

          4. 并非每个记录集都支持添加记录(例如从查询返回的记录),这只是在您尝试添加记录之前检查。这是编写不会引发错误的代码的一部分。

          5. 这只是一种清理内存的方法。据我所知,VBA 是垃圾回收的,但如果你有一个大的记录集,这可以更快地释放一些内存。

          6. 我对此不确定。但它看起来像是在调用用户定义的函数并返回 false 它打开了一个表单。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-01
            • 2019-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-12
            • 2021-07-31
            相关资源
            最近更新 更多