2014-02-06 349 views
1

我有一个关于字符串表达式评估的问题。目前,我正在处理需要从存储在数据库中的字符串中计算数学表达式的项目,我想让C#方法评估此字符串,并且此函数将从存储过程或添加到数据库的函数运行。所以问题是我想在我的C#函数中使用已经创建的解决方案,如NCalc或Jace.Net,但是如果我想从db运行它,我需要将dll(例如NCalc.dll或Jace.dll)添加到db部件。并且添加这些解决方案是相当有问题的,NCalc使用不安全的代码,并且Sql服务器不能从该dll运行方法,而Jace需要许多额外的dll,需要将其添加到数据库中,这是不可接受的解决方案。因此,如果任何人知道可以添加到数据库并运行的工作表达式评估器? Thx提前寻求帮助。数学表达式评估

我使用Microsoft SQL Server 2012(SP1) - 11.0.3128.0(X64)2)和.NET Framework 4.5

+0

您的计算有多复杂?简单的+ -/*()可以使用XPathDocument来完成,或者你可以编写你自己的。这些可以在托管代码中没有任何第三方dll的情况下运行。请参阅http://answers.unity3d.com/questions/34349/how-to-evaluate-a-mathematical-expression-in-unity.html – Maarten

+1

类似这样的: int [] table = {1,2,3, 4,5}; int [] table2 = {1,3,4,5,7,100};公式.Evaluate(“(Avg([x]))/ [y] + Max([z])”,表格,10,table2),10); 这是相当复杂的,在将来我需要能够使用像FFT或STDEV计算 – blindepl

+0

假设你有clr函数“评估”。你能证明你将如何从T-SQL中调用它吗?许多事情应该变得清楚。例如你如何将数组传递给CLR函数? –

回答

0

A.我想你可以包括嵌入的JavaScript引擎的圈子你兴趣..

eg (但仍然需要WITH PERMISSION_SET = UNSAFE/EXTERNAL_ACCESS,并且我认为没有为CLR库特别设计的需要UNSAFE,例如静态非只读字段变为UNSAFE就足够了,其他限制:http://msdn.microsoft.com/en-us/library/ms403273.aspx)。

B.不要忘记,T-SQL也是动态语言。为什么你不能只保存你的表达式在T-SQL中?恕我直言,Sql Server比运行CLR漏洞的任何表达式评估器更适合运行“Avg”。

+1

在阅读您发送给我的链接文章后,所有内容都变得更加清晰,NCalc使用静态属性进行缓存。静态不只读属性是禁止的,如果你想添加你的程序集作为安全的,在做了一些代码更改(删除静态属性)后,一切正常。添加装配时有更多的限制,但在我看来,这是一个至关重要的问题。 Thx寻求帮助。 – blindepl

+0

最后一件事,你可以用两种方式更改程序集权限集: 1.从sql管理工作室转到数据库 - >可编程性 - >程序集 - >前“无限制”(可以使用静态字段运行程序集)。 2.转到项目(SQL Server数据库项目) - >引用 - >人民币汇编 - >权限设置 - >安全/外部/不安全 – blindepl