MS Access CREATE PROCEDURE或在.NET中使用Access Macro

时间:2011-05-14 02:21:12

标签: asp.net ms-access

我需要能够运行诸如

之类的查询
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

但是我需要的不仅仅是一个简单的select语句 - 我需要几行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值能够搜索“soundes like”输入值的记录。每当父字段值更改时,我都会更新soundex值。这是一个相当大的开销,但在这种情况下我认为这是必要的。

对于第二种情况,我想规范化字段值空间连接的间距,并可选择去掉用户定义的字符。通过TRIM和REPLACE功能的组合,我可以非常接近实现所需的值。如果在其中一个字段的值之间出现三个或更多空格(不太可能的情况),则该值将不同。很难证明每个需要此功能的表中每个字段的额外字段的开销。除非我得到用户关于额外空间问题的具体反馈,否则我会坚持使用TRIM& REPLACE值。

我的应用程序是数据库不可知的(或者只是不太宗教......我支持7)。我为其他6个数据库中的每个数据库编写了一个UDF,它比内置数据库函数更有效地进行空间规范化和字符剥离。我真的很讨厌我可以在Access中将UDF编写为VB宏并在Access中使用该宏但我不能在.NET中使用它。

我确实需要能够对值进行索引,因此将整个列拉入.NET然后执行计算将无法正常工作。

4 个答案:

答案 0 :(得分:0)

为什么不想在你的atable中创建一个额外的字段,即atable.afieldX = MyFunc(atable.afield)?所需的一切 - 运行一次UPDATE命令。

答案 1 :(得分:0)

我认为你正在进入Access可以做的事情的天花板(并试图超越)。 Access确实无法像您尝试那样执行复杂的TSQL语句。但是,有几种方法可以实现您的目标。

首先,如果MyFunc的结果不经常更改,您可以在模块中创建一个函数,该模块遍历atable中的每个记录并对其运行MyFunc。您可以将这些数据存储在表本身(在新列中),也可以构建一个内存数据集,用于任何您想要的目的。

第二种方法是在.NET中进行操作,因为看起来你有能力这样做。执行SELECT语句并从Access中提取所需的数据(不尝试对其运行MyFunc)。然后根据数据运行您想要的任何逻辑,并从那里使用它或将其放回Access数据库。

答案 2 :(得分:0)

您应该尝试编写SQL Server函数MyFunc。这样,您就可以在SQLserver和Access中运行相同的查询。

为您提供一些有用的链接,以便您可以开始使用:

答案 3 :(得分:0)

您使用的是什么版本的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)应用程序。