3

我们有一个 MS SQL 2005 数据库。数据从 Excel 表格上传到此数据库。这些 Excel 表格来自不同的供应商,其中大多数从不维护预定义的结构,因此我们可以创建单独的插入/更新模块。到目前为止,我已经创建了一个模块,它接受预定义格式的 Excel 工作表并从中上传数据。对于每个供应商,都必须手动以预定义的方式对其进行格式化,这需要很长时间并且是一项艰巨的工作。

现在我们删除了手动格式并将所有数据库列放在一个列中,并将包含所有 Excel 列的下拉列表放在另一列中。用户映射所需的列并更新数据库。

但是大多数时候这个简单的映射是不够的,因为大多数时候我们必须根据一些逻辑来拆分/组合值。为了使其更加用户友好,并且由于我的大多数用户自己都是 C# 程序员,我决定删除下拉菜单并使用用户可以直接输入逻辑的文本框。例如:

dbcol1 = excel[col1].ToString().Replace("-"," ")
    +(int.Parse( excel[col6].ToString())*.1).ToString();

在搜索这个时,我遇到了动态编译 C# 代码。由于我以前从未这样做过,而且我不确定这种方法是否有效,我需要知道我是否朝着正确的方向前进。或者有没有更有效和更快的方法来做到这一点?

4

2 回答 2

3

编写脚本?如果您想即时编译和运行代码,C# 脚本非常方便;

如果您可以将字符串格式化为正确的 C#,它将让您编译和运行它。

http://www.csscript.net/

例如:

dynamic script = CSScript.Evaluator
                         .LoadMethod(@"void SayHello(string greeting)
                                       {
                                           Console.WriteLine(greeting);
                                       }");
script.SayHello("Hello World!");

可能不适合生产,但您至少可以为您的想法制作原型

于 2013-03-11T12:03:38.093 回答
3

通常,您将使用动态Reflection.Emit生成 .NET 程序集并执行该程序集。但是,它只接受中间语言指令,而不接受 C#。每次你想执行一段代码时创建一个全新的程序集根本没有效率。


Roslyn是微软在编译器即服务方面的尝试。这是为 C# 和 VB.Net 重新编写的编译器,应用程序可以调用它来编译代码,并提供有关正在编译的代码的信息。

Anders Hejlsberg(我相信)展示了一个使用 Roslyn 编译器来实现 C# 脚本接口的示例:键入一些 C# 并即时执行。虽然 Roslyn 仍在开发中,但您可能想通过尝试Roslyn CTP来查看它是否能满足您的需求。

C# as a Scripting Language in Your .NET Applications Using Roslyn是一篇 CodeProject 文章,其中涉及到一些细节。


最后,如果你不能(还)或者不想使用 Roslyn,或者如果它不能提供你想要的执行速度,那么我认为你最好的选择(就性能而言)是解析和解释脚本自己编码。然而,这是容易出错的艰苦工作。

于 2013-03-11T11:54:31.807 回答