从Microsoft Access mdb文件导出验证规则

时间:2018-09-03 10:35:40

标签: validation ms-access export

我有一个MDB文件,其中包含许多表和表格。每个字段都有一个验证规则,例如Is Null Or >=0 And <=255

此访问数据库正在使用MySQL转换为在线系统。使用MDBTools(https://github.com/brianb/mdbtools)可以轻松导出所有数据。

但是我找不到导出验证规则的任何方法。超过100个表中有成千上万个字段,因此,导出和导入它们而不是重写每个表很重要。

我真的不介意它们以什么格式导出,任何文本格式都可以,所以我可以做一个正则表达式,否则就可以了。

但是,在导出这些验证规则时,我一直找不到任何信息。

也许如果默认情况下未将其内置到访问中,则可以使用VB脚本来查找信息并将其写入文本文件?我对访问或Windows并不十分熟悉,所以如果有人可以建议那是否是一个很好的可能性。

2 个答案:

答案 0 :(得分:2)

使用VBA可以直接检索字段验证规则。

我知道现在为您提供帮助可能为时已晚。并且,尽管对于不熟悉Access和VBA的人来说似乎不合适,但是这种方法只需要一个表,将下面的代码复制到标准模块中并运行它。这样其他人可能会受益。

我创建了我的表 field_validation_rules ,用于存储验证规则属性的文本。该表包含3个文本字段: table_name ; field_name ;和 validation_rule

Public Sub GatherValidationRules()
    Dim db As DAO.Database
    Dim fld As DAO.Field
    Dim rs As DAO.Recordset
    Dim tdf As DAO.TableDef

    Set db = CurrentDb
    Set rs = db.OpenRecordset("field_validation_rules", dbOpenTable, dbAppendOnly)
    For Each tdf In db.TableDefs
        If Not (tdf.Name Like "~*" Or tdf.Name Like "MSys*") Then
            For Each fld In tdf.Fields
                If Len(fld.ValidationRule) > 0 Then
                    rs.AddNew
                    rs!table_name.Value = tdf.Name
                    rs!field_name.Value = fld.Name
                    rs!validation_rule.Value = fld.ValidationRule
                    rs.Update
                End If
            Next
        End If
    Next
    rs.Close
End Sub

ValidationRule属性是一个字符串值。如果尚未为给定字段分配属性,则ValidationRule是一个空字符串。该代码跳过了这些代码,仅存储为其分配了字段的验证规则。

如果要将收集的验证规则存储在文本文件中,则有几个选项。我这样将我的数据转储为CSV:

DoCmd.TransferText acExportDelim, , "field_validation_rules", "C:\share\Access\field_validation_rules.txt", False

答案 1 :(得分:0)

对于任何其他发现此问题的人来说,这就是我结束工作的方式。这是在Access 2003中,在其他版本中可能有所不同。

首先,我去Tools > Analyze > Documenter选择了我想要的表并使用了以下设置:

enter image description here

然后向我展示了看起来像pdf或word doc的文件(我认为不是,但这并不重要)。

然后我做File > Export并选择“文本文件.txt”并将其保存到计算机上的某个位置。

然后我用PHP打开.txt文件(可以在任何可以执行正则表达式的地方都可以)。

在我的实例中,不是每个字段都有验证规则,如果未设置验证规则,则不会出现,这意味着用于获取fieldID的正则表达式比获取验证规则具有更多的结果。

所以我用了两个正则表达式。

/SourceField:\s+(\S+).*?AllowZeroLength/msi 这将获取SourceField和AllowZeroLength之间的所有内容。验证规则之后,AllowZeroLength是重复文本的第一位。

然后我使用此正则表达式从该字符串中获取验证规则。

/ValidationRule:\s+(.*)\\r/ 我必须使用\r而不是换行,这可能与将其从Windows迁移到Ubuntu有关。

在PHP中,它看起来像这样:

<?php
$file_contents = file_get_contents('validations.txt');
    $response = [];
    preg_match_all('/SourceField:\s+(\S+).*?AllowZeroLength/msi', $file_contents, $matches);
    for($i = 0; $i < count($matches[0]); $i++) {
        $id = $matches[1][$i];
        preg_match('/ValidationRule:\s+(.*)\\r/', $matches[0][$i], $validation_match);
        $response[$id] = $validation_match[1] ?? null;
    }

几乎可以肯定有一个比这更干净的正则表达式,但这非常快,我完全可以得到我想要的。