真的,我认为这将是小菜一碟。就像托尼说的那样,您可以继续使用相同的表/后端是真的,这可能是我推荐的路线。您需要在任何将链接到 MySQL 数据库的机器上安装 MySQL 的 ODBC 驱动程序。之后创建一个 DSN,然后通过 Access 中的 DSN 访问表。您可能希望稍后添加代码以在每次使用无 DSN 表加载软件时重新链接表。这样,数据库可以在没有配置 DSN 的机器上运行。我确实建议您使用 MySQL 或 SQL Server Express,而不是 MS Access 后端,但我不会花时间详细说明原因。
我认为您实际上可以从传统的 Windows 桌面应用程序(内置于 MS Access 或 VB.Net)中获得比 PHP 更多的功能。我个人认为,您可以用更少的代码和更少的时间来完成它。我提到了 VB.Net,但我可能会推荐 MS Access over VB.Net 用于数据库,尽管任何一个都可以完成这项工作。
正如 Tony 已经提到的,Access 使用 VBA 语言。除非您已经对使用基本语法的其他编程语言有一定的经验,否则要真正掌握它需要一点时间。我发现从 VBA/ASP 迁移到 PHP/Javascript 进展缓慢,但不一定那么困难。PHP 使用带有花括号的 C 样式代码,而 VBA 不使用。
来自 PHP,这里有一些对你来说可能是新的东西:
更强的变量类型 - 在 Access 中,您实际上可以使用指定的数据类型声明变量,例如 String、Date、Integer、Long、Single、Double 等。我建议尽可能多地使用它。在极少数情况下,您需要使用更通用的类型,例如 Object 或 Variant。如果您尝试将错误的数据类型放入其中,使用指定数据类型声明的变量将引发错误。在我看来,这可以帮助您编写更好的代码。
Option Explicit - Option Explicit 是一个声明,您可以将其放在每个代码模块的顶部,以强制您必须在使用之前使用 Dim 语句声明一个变量。我强烈建议您这样做。它将为您节省大量解决问题的时间。
Set MyVariable = Nothing - 在使用对象变量后清理它们是使用 MS Access 的最佳实践之一。您将使用它来清理 DAO Recordset 变量、ADO Connection 变量、ADO Recordset 变量、表单变量等。您声明为对象(或某些特定类型的对象)的任何变量都应该通过将其设置为 Nothing 来清理当您不再需要使用该变量时。
无包含 - MS Access 中没有包含语句之类的东西。您可以从其他 Access 数据库导入代码模块。您可以调用包含在 DLL 中的函数。但是 Access 中没有包含 PHP 中的包含。
DoCmd - 您必须使用 MS Access 的 DoCmd 对象来打开表单和报告并执行其他常见任务。只是一个警告:它经常是不合理的。长期使用 Access 的用户并没有多想,但我发现这些命令几乎没有凝聚力或一致性。让我给你举个例子。如果要关闭表单,请使用以下代码:DoCmd.Close acForm, "frmSomeFormName"但如果要打开表单,请使用以下代码:DoCmd.OpenForm "frmName"在这个例子中,为什么打开一个表单会获得它自己的 OpenForm 函数,而关闭一个表单只是使用 Close 后跟一个告诉 Access 您想要关闭一个表单的常量?我没有答案。DoCmd 充满了这种不一致。Blueclaw 在列出最常见的 DoCmd 方面做得非常好,尽管我认为那里的示例并不十分出色。
参考资料- 您不需要经常使用参考资料。您必须使用它们来启用诸如 DAO 和 ADO(见下文)或 Microsoft Scripting Runtime(通常用于访问、读取、写入文件和文件夹等)之类的功能。这基本上是你做一次然后你就忘记它的事情。
ActiveX 控件- 尝试在不使用这些控件的情况下构建您的项目可能会更好。它们需要在将运行您的软件的每台计算机上安装相同的控件。我对此了解不多,但我知道如果您在项目中使用 ActiveX 控件,可能会出现一些兼容性问题。
DAO - 数据访问对象- DAO 是 Access 的原始、本机对象集,用于连接到您的数据容器。虽然它主要用于访问 Access 数据库后端/容器中保存的日期,但当您使用 ODBC 链接表时,它也可用于某些任务。当您需要遍历记录集以进行批量更改时,DAO 非常有用。您甚至可以使用它来循环表单控件。我使用它的一个地方是在删除一行后重新排序发票详细信息中的行号。另一个典型用途是在“实用程序”功能中使用它,您需要更改给定字段或无法通过更新查询完成的字段中的某些内容。
CurrentDb.Execute("Update or Delete query here...") 在我的理解中,CurrentDb 对象的 Execute 方法是一个隐式的 DAO 调用。它允许您从 VBA 代码对本地和链接表运行更新或删除查询。您也可以使用 DoCmd.RunSQL 实现此目的,但 CurrentDb.Execute 是首选方法,因为如果您将“, dbFailOnError” 作为第二个参数附加,它会在出现故障时为您提供改进的错误消息。
ADO - ActiveX 数据对象- 我建议不要使用 ActiveX 控件,但这是您可能需要的一种 ActiveX 技术。据我所知,ADO 是唯一可以用来从 Access 运行存储过程的东西。ADO 与 DAO 类似,应该取代 DAO,但实际上并没有。我倾向于在我的应用程序中使用它们。需要一段时间才能确定哪一个会为您完成这项工作,或者哪一个会做得更好。一般来说,除了运行存储过程或连接到外部数据源(即不使用链接表)之外,我坚持使用 DAO。DAO 和 ADO 都是与 MS Access 一起安装的 MDAC(Microsoft 数据访问组件)的一部分。
文件系统对象- 上面提到的这个对象通常用于访问文件和文件夹。你会发现你可能不得不使用它来复制文件、创建文本文件、读取文本文件、写入文本文件等。它是 Microsoft Scripting Runtime 的一部分,它是 Windows Script Host 的一部分(尽管存在于所有 Windows 计算机上它可能会“损坏”)。Access 确实为您提供了一些使用 VBA 的内置函数/方法(例如 Dir())访问文件和文件夹的方法,但这些函数并未涵盖所有基础。
SQL - 服务器的查询语言- 您可能已经熟悉 SQL,但您需要习惯 Access 的 SQL 语言“超集”。它并没有太大的不同,但 Access 确实允许您使用 Access 函数(例如 Len、Left、right)或您自己的自定义函数。您自己的函数只需要存在于代码模块中并声明为公共。您自己的函数的一个示例是重复(在 MS Access 中不存在,在 MySQL 中存在),它有时用于在具有子父关系的表中基于 Count(*) 创建缩进。我举个例子,尽管除非你打算使用嵌套集模型来保存层次类别,否则你不太可能需要使用这样的函数。
变量不能是文字字符串 - 这是 Access 和 PHP 之间的巨大差异。PHP 允许你写:"SELECT * FROM tag WHERE tagtext = '$mytag'" 在 MS Access 中你必须这样写:"SELECT * FROM tag WHERE tagtext = '" & strMyTag & "'"(你可以除非您在 VBA 中格式化查询以检索 DAO 或 ADO 记录集,否则无需担心这一点。我刚刚指出的内容通常不会影响您的表单或报表的记录源或保存的查询,因为您通常不使用其中的变量。)
查询 - 不难弄清楚,但在 Access 中,查询基本上是一个 MySQL 视图。我实际上并不经常保存查询。我通常只使用它们来导出我的 SQL“代码”,然后我将那个 SQL 粘贴到我的表单中作为记录源,而不是将表单绑定到保存的查询。你想以哪种方式去做并不重要。无论您选择哪种方式,都有利有弊。作为旁注,不要害怕在 MySQL 中创建视图并在 Access 中链接到它们。当您链接到它们时,Access 将它们视为表格。它是否可更新/可写将取决于视图的构造。某些类型的查询/视图(例如联合)是只读的。
最后一点,我推荐 MS Access 而不是 OpenOffice.org Base。几年前我试用了 Base,发现它缺少很多功能。但是,我已经在 MS Access 方面有经验,所以我不确定我是否给了 OpenOffice Base 一个公平的试验。我发现缺少的是事件。我习惯于在 MS Access 中微调我的表单,为用户提供一个响应迅速的 UI,并提供大量反馈,但我不知道如何在 Base 中做到这一点。也许自从我上次尝试以来情况发生了变化,我不知道。这是一篇比较 Base 和 MS 访问的文章。
其他 SO Access 大师,请随时指出我回答中的任何错误。我仍然认为自己是编程新手。