2011-05-14 47 views
1

我需要能够运行一个查询,如MS Access中创建过程或使用Access宏在.NET

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

下面的代码不工作,并创建访问查询:

CREATE PROCEDURE test AS SELECT * FROM atable 

不过,我需要的不仅仅是更多一个简单的select语句 - 我需要几行VB代码。

虽然用CREATE PROCEDURE语句尝试,我执行以下代码:

CREATE PROCEDURE test AS 

其中产生的错误“无效的SQL语句;预计 '删除', '插入', '程序', 'SELECT' ,或'更新'。“

这似乎表明,有一个SQL“过程”的语句,所以后来我试图

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中,然后执行我的计算将不起作用。

+0

“MyFunc”实际上做了什么?如果它很简单,那么可以用可用的SQL函数来替换它,而不管所用的接口如何。 – 2011-05-19 15:36:36

回答

0

我想你正在碰到Access可以做什么(并试图超越)的上限。 Access真的没有权力去执行像你正在尝试的那样复杂的TSQL语句。但是,有几种方法可以完成您正在寻找的内容。

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

这样做的第二种方法是在.NET中进行操作,因为它似乎有能力这样做。做SELECT声明并从Access中取出你想要的数据(不要试图运行MyFunc)。然后根据数据运行任何你想要的逻辑,并从那里使用它或将它放回到Access数据库中。

+0

感谢您的建议,Biggs。请回复我的原始文章以获取新信息。 – ic3b3rg 2011-05-14 10:32:50

0

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

+0

感谢您的建议...请查看我添加到原始文章中的新信息。 – ic3b3rg 2011-05-14 10:36:10

+0

@ ic3b3rg我填充你的痛苦...几年前有相同的填充...你可能想看看Access 2010(二)存储过程和表触发器[链接](http://stackoverflow.com/questions/3287545/how-do-i-make-a-stored-procedure-in-ms-access) – Nikiton 2011-05-14 13:09:35

0

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

你一些有用的链接,这样您就可以开始:

+0

我有用SQL Server编写的函数(用于我的SQL Server客户端),但我的Access客户端不可能安装SQL Server。 – ic3b3rg 2011-05-16 11:48:09

0

您使用的是什么版本的JET(现在称为Ace)?

我的意思是,如果你打算使用一些Access VBA代码,那么你需要VBA库和MS Access的一个副本加载并运行。

但是,在Access 2010中,我们现在有表格触发器和存储过程。这些存储过程不需要VBA,并且实际上在引擎级别运行。我有一个表,触发器和这里的同音例程,它显示了这一过程:

http://www.kallal.ca/searchw/WebSoundex.htm

上述手段,如果Access或VB.net,甚至FoxPro中通过ODBC修改了一行,表触发器代码会火并运行并将soundex值保存在列中。如果您在2010访问中使用新的Web发布功能,则此功能也可以使用。因此,尽管上述文章是从使用Access Web服务(可在Office 365和SharePoint中获得)的角度编写的,但上述soundex表触发器将会还可以单独使用Access和JET(ACE)应用程序。

+0

感谢您的建议,但“存储过程”只会更新表中的另一个字段。我通过.NET来做到这一点。 – ic3b3rg 2011-05-18 17:04:15