MS Access CREATE PROCEDURE 或在 .NET 中使用 Access 宏
Posted
技术标签:
【中文标题】MS Access CREATE PROCEDURE 或在 .NET 中使用 Access 宏【英文标题】:MS Access CREATE PROCEDURE Or use Access Macro in .NET 【发布时间】:2011-05-14 02:21:11 【问题描述】:我需要能够运行诸如
之类的查询SELECT * FROM atable WHERE MyFunc(afield) = "some text"
我在 VB 模块中编写了 MyFunc,但查询结果为“表达式中未定义函数 'MyFunc'”。从 .NET 执行时
根据我目前所读到的内容,由于安全问题,Access VB 模块中的功能在 .NET 中不可用。关于这个主题的信息不多,但这条途径似乎是一个死胡同。
另一种可能性是通过 CREATE PROCEDURE 语句,它也有宝贵的小文档:http://msdn.microsoft.com/en-us/library/bb177892%28v=office.12%29.aspx
以下代码确实有效,并在 Access 中创建了一个查询:
CREATE PROCEDURE test AS SELECT * FROM atable
但是,我需要的不仅仅是一个简单的选择语句——我需要几行 VB 代码。
在试验 CREATE PROCEDURE 语句时,我执行了以下代码:
CREATE PROCEDURE test AS
这产生了错误“无效的 SQL 语句;需要 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT' 或 'UPDATE'。”
这似乎表明有一个SQL'PROCEDURE'语句,所以我尝试了
CREATE PROCEDURE TEST AS PROCEDURE
这导致“PROCEDURE 子句中的语法错误”。
我找不到关于 SQL 'PROCEDURE' 语句的任何信息 - 也许我只是错误地阅读了错误消息,并且没有这样的野兽。我已经花了一些时间来试验这个语句,但我无法进一步了解。
针对添加字段来存储值的建议,我将扩展我的要求:
我有两种情况需要此功能。
在第一个场景中,我需要让用户能够搜索字段的 soundex,并且由于 Access 中没有 soundex SQL 函数,我添加了一个字段来存储用户想要的每个表中每个字段的 soundex 值能够搜索“听起来像”输入值的记录。每当父字段值更改时,我都会更新 soundex 值。这是相当多的开销,但我认为在这种情况下是必要的。
对于第二种情况,我想规范化字段值的空格连接的间距,并可选择去除用户定义的字符。结合使用 TRIM 和 REPLACE 函数,我可以非常接近于实现所需的值。仅当其中一个字段的值中的单词之间出现三个或更多空格时,该值才会有所不同(不太可能的情况)。很难证明需要此功能的每个表中每个字段的额外字段的开销是合理的。除非我从用户那里得到关于额外空格问题的具体反馈,否则我会坚持使用 TRIM & REPLACE 值。
我的应用程序与数据库无关(或者只是不太虔诚……我支持 7)。我为其他 6 个数据库中的每一个都编写了一个 UDF,它比内置数据库函数更有效地进行空间规范化和字符剥离。我可以在 Access 中将 UDF 编写为 VB 宏并在 Access 中使用该宏,但我不能在 .NET 中使用它,这让我非常恼火。
我确实需要能够对值进行索引,因此将整个列拉入 .NET,然后执行我的计算将不起作用。
【问题讨论】:
MyFunc
实际上是做什么的?如果简单的话,大概可以换成不管使用什么接口都可用的 SQL 函数。
【参考方案1】:
我认为您已经遇到了 Access 可以做的事情的上限(并试图超越)。 Access 确实没有能力像您尝试的那样执行非常复杂的 TSQL 语句。但是,有几种方法可以完成您正在寻找的内容。
首先,如果MyFunc
的结果不经常更改,您可以在模块中创建一个函数,循环遍历atable
中的每条记录,并针对它运行MyFunc
。您可以将该数据存储在表本身中(在一个新列中),也可以构建一个内存数据集,用于您想要的任何目的。
第二种方法是在 .NET 中进行操作,因为您似乎有能力这样做。执行SELECT
语句并从Access 中提取您想要的数据(不要尝试对其运行MyFunc
)。然后针对数据运行您想要的任何逻辑,然后从那里使用它或将其放回 Access 数据库中。
【讨论】:
感谢您的建议,比格斯。请参阅我的原始帖子以获取新的回复信息。【参考方案2】:你为什么不想在你的表中创建一个额外的字段,即atable.afieldX = MyFunc(atable.afield)?所有你需要的 - 运行一次 UPDATE 命令。
【讨论】:
感谢您的建议...请查看我添加到原始帖子中的新信息。 @ic3b3rg 我填满了你的痛苦......几年前也有同样的填满......你可能想看看 Access 2010(两者)存储过程和表触发器link【参考方案3】:您应该尝试编写一个 SQL Server 函数 MyFunc。这样,您将能够在 SQLserver 和 Access 中运行相同的查询。
为您提供一些有用的链接,以便您开始使用:
关于用户定义函数的 MSDN 文章:http://msdn.microsoft.com/en-us/magazine/cc164062.aspx SQLServer 用户定义函数:http://www.sqlteam.com/article/intro-to-user-defined-functions-updated SQLServer 字符串函数:http://msdn.microsoft.com/en-us/library/ms181984.aspx【讨论】:
我有用 SQL Server 编写的函数(用于我的 SQL Server 客户端),但我的 Access 客户端不太可能安装 SQL Server。【参考方案4】:您使用的是什么版本的 JET(现在称为 Ace)?
我的意思是,如果您要使用一些 Access VBA 代码,那么您需要加载并运行 VBA 库和 MS Access 的副本,这不足为奇。
但是,在 Access 2010 中,我们现在拥有表触发器和存储过程。这些存储过程不需要 VBA,实际上在引擎级别运行。我在这里有一个表触发器和 soundex 例程,它显示了它是如何工作的:
http://www.kallal.ca/searchw/WebSoundex.htm
上面的意思是,如果 Access,或 VB.net,甚至 FoxPro 通过 odbc 修改了一行,表触发器代码将触发并运行并将 soundex 值保存在一个列中。如果您在 access 2010 中使用新的 Web 发布功能,此功能也可以使用。因此,虽然上面的文章是从使用 Access Web 服务(在 Office 365 和 SharePoint 中可用)的角度编写的,但上述 soundex 表触发器将也可以在单独的 Access 和 JET (ACE) 应用程序中工作。
【讨论】:
感谢您的建议,但“存储过程”只会更新表中的另一个字段。我是通过 .NET 来做的。以上是关于MS Access CREATE PROCEDURE 或在 .NET 中使用 Access 宏的主要内容,如果未能解决你的问题,请参考以下文章
Error Code 1318 Incorrect number of arguments for PROCEDUR