我们有一个MS SQL 2005数据库。数据从Excel工作表上载到此数据库中。这些Excel工作表来自不同的供应商,其中大多数都没有维护预定义的结构,因此我们可以创建一个单独的插入/更新模块。 到目前为止,我已经创建了一个模块,它接受预定义格式的Excel工作表并从中上传数据。对于每个供应商,有人必须手动以预定义的方式对其进行格式化,这需要太长时间并且是驴工作。
现在我们已经删除了手动格式化并将所有数据库列放在一列中,而下拉列表包含另一列中的所有Excel列。用户映射所需的列并更新数据库。
但是大部分时间这个简单的映射都不尽如人意,因为大多数情况下我们必须根据某些逻辑拆分/组合值。为了使它更加用户友好,并且因为我的大多数用户都是C#程序员,所以我决定删除下拉菜单并使用文本框,用户可以在其中输入直接逻辑。例如:
dbcol1 = excel[col1].ToString().Replace("-"," ")
+(int.Parse( excel[col6].ToString())*.1).ToString();
在搜索时,我遇到了动态编译C#代码。由于我以前从未这样做过,而且我不确定这种方法是否有效,我需要知道我是否正朝着正确的方向前进。或者有更有效,更快捷的方法吗?
答案 0 :(得分:3)
通常,您可以使用Reflection.Emit
动态生成.NET程序集并执行该程序集。但是,它只接受中间语言指令,而不接受C#。每次想要执行一段代码时创建一个全新的程序集根本就没有效率。
Roslyn 是Microsoft尝试将编译器作为服务。这是一个新的C#和VB.Net重写编译器,可以由应用程序调用来编译代码,它提供有关它正在编译的代码的信息。
Anders Hejlsberg(我相信)展示了一个使用Roslyn编译器实现C#脚本接口的示例:输入一些C#并且它会在运行中执行。虽然Roslyn仍处于开发阶段,但您可能希望通过尝试Roslyn CTP来了解它是否会满足您的需求。
C# as a Scripting Language in Your .NET Applications Using Roslyn是一篇详细介绍的CodeProject文章。
最后,如果你不能(还)或者不想使用Roslyn,或者它没有提供你想要的执行速度,那么我认为你最好的选择(在性能方面)是解析和自己解释脚本代码。但是,这很容易出错。
答案 1 :(得分:3)
编写脚本?如果你想动态编译和运行代码,C#Script非常方便;
如果你能用C#字符串格式化字符串,它就可以编译并运行它。
例如:
dynamic script = CSScript.Evaluator
.LoadMethod(@"void SayHello(string greeting)
{
Console.WriteLine(greeting);
}");
script.SayHello("Hello World!");
可能不适合制作,但你至少可以为你的想法做出原型